16-01-25---Servlet复习笔记(01)

Servlet

ServletAPI中有4个java包
    javax.servlet 包含Servlet与Servlet容器之间契约的类和接口
    javax.servlet.http 包含HTTP Servlet与 Servlet容器之间契约和类的接口
    javax.servlet.annotation 包含对Servlet、Filter、和Listener进行标注的注解。他还为标注元件指定元数据。
    javax.servlet.descrptor 包含为Web应用程序配置的信息提供编程是访问的类型。
    
javax.servlet
    interface :
            Servlet
            ServletRequest  (封装当前HTTP请求,以便Servlet的开发者不必解析和操作原始的HTTP数据)
            ServletResponse (表示的是用户的HTTP响应,他的作用是使得将响应回传给用户更加容易)
            ServletContext
            ServletConfig (包含servlet的配置信息)
            RequestDispatcher (请求调度)
            Filter
    子类:
    GenericServlet


java的方法签名规则是:与包含该方法的类型不在同一个包中的类型,要使用全名。这个做数据库课设的时候就有体会

init service destory
        init 第一次请求Servlet时,Servlet容器就会调用该方法。一般来说,会在该方法里编写一些应用程序初始化的相关代码
        在调用这个方法时,Servlet容器会传递一个ServletConfig。一般来说,会将ServletConfig就赋给一个类级变量,以便Servlet类中的其他方法也可以使用这个对象
        
        service 每次请求Servlet时,Servlet容器都会调用这个方法。必须在这个方法里编写要Servlet完成的相关代码。第一次请求Servlet时,Servlet容器会调用init和service方法。对于后续的请求,只会调用service方法
        
        destroy 要销毁Servlet时,Servlet容器才会调用该方法。一般来说,可以在这个方法张编写一些清理资源的相关代码
        
        getServletInfo 返回Servlet的描述。可能返回任意字符串,甚至是null!!!
        
        getServletConfig 返回Servlet容器传给init方法的ServletConfig 但是,为了让getServletConfig返回非null值,你肯定已经为传给init方法的ServletConfig赋给了一个类级变量
        
            必须注意的一点是线程安全,一个应用程序中的所有用户将共用一个Servlet实例,因此不建议使用类级变量,除非他们是只读的。
            
        WebServlet注解类型来声明一个Servlet
        
        urlPatterns属性,这个事可选的,在Servlet中,urlPattern告诉容器,/my模式应该调用这个Servlet。!!注意URL模式必须以一条正斜线开头!!
        
        要编译Servlet,必须将ServletAPI类型放在类路径中。 Tomcat的Servlet-api.jar文件中打包有javax.servlet & javax.servlet.http包的成员。这个jar包就放在Tomcat安装目录的lib目录中
        
Servlet应用程序必须以特定的目录结构进行部署。
        WEB-INF
            classes        Servlet类和其他的java类必须放在这里。类下方的目录反映了类的包结构。
            lib                在这里部署了Servlet应用程序所需的所有jar文件。Servlet API jar文件则不需要部署在这里。
        Servlet/JSP应用程序一般会有JSP页面、html文件、图像文件以及其他资源。这些都应该放在应用程序目录下,并且经常放在子目录下。例如,图像文件可以放在image目录下,所有的JSP页面可以放在jsp目录下。
        
        放在应用程序目录下的任何资源,用户都可以通过输入该资源的URL而直接进行访问。如果你希望某个资源可以被Servlet访问,而不能被用户访问,那么应该把它放在WEB-INF目录下。
        
1.4 ServletRequest
    对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将它传给Servlet的service方法,ServletRequest封装有关请求的信息。
    ServletRequest接口中的方法
            public int getContentLength()               返回请求主体中的字节数。如果不知道字节的长度,返回-1
            public java.lang.Stirng getContentType()        返回请求主体的MIME类型,如果不知道类型,返回null
            public java.lang.String getProtocol()                返回这个HTTP请求的协议名称和版本号
            public java.lang.String getParameter(java.lang.String name) 返回指定请求参数的值
                    getParameter是ServletRequest中最常用的方法,该方法通常用来返回一个HTML表单域的值。
                    该方法也可以用来获取查询字符串的值
                除了getParameter方法外,还有getParameterNames、getParameterMap和getParameterValues来获取表单域的名称和值,以及查询字符串
1.5 ServletResponse
    该接口表示一个Servlet的响应,在调用一个Servlet的service方法之前,Servlet容器会首先创建一个ServletResponse,并将它作为第二个参数传给service方法。注意ServletResponse隐藏了将该响应发给浏览器的复杂性
    该接口中定义的一个方法是getWrite方法,它返回可以将文本传给客户端的java.io.PrintWriter,在默认情况下,PrintWriter对象采用的ISO-8859-1编码。
    在将响应发送给客户端时,通常将它作为HTML发送。还有给个方法用来给浏览器传输数据,getOutPutStream,但是这个方法一般是用来传输二进制数据的。
    
    在发送任何html标签时,应该首先调用setContentType方法来设置响应的内容类型,比如,将text/html作为参数传递,这是告诉浏览器内容类型为html类型。如果没有设置类型,绝大多数浏览器会默认为html形式。
    
1.6 ServletConfig
    在Servlet容器初始化Servlet时,Servlet容器将ServletConfig传给Servlet的init方法。
    ServletConfig封装可以通过@WebServlet或者部署描述符传递给Servlet一个配置信息
    以这种方式传递的每一条信息都称作初始参数。初始参数都有两部分组成:键和值
    
    为了从一个Servlet内部获取某个初始参数的值,应在由Servlet容器传给Servlet的init方法的ServletConfig中调用getInitParamter方法。
    java.util.String getInitParameter(java.lang.String name)
    
1.7ServletContext
    表示Servlet应用程序。每个Web应用程序只有一个context。在分布式环境中,一个应用程序同时部署到多个容器中,并且每台java虚拟机都有一个ServletContext对象
    在ServletConfig中调用getServletContext就可以获得ServletContext
    有了ServletContext之后,就可以通过共享能通过应用程序的所有信息获得资源的访问信息,促进Web对象的动态注册。前者是通过将一个内部Map中的对象保存在ServletContext中来实现的。保存在ServletContext中的对象称为属性 attribute

1.8GenericServlet
    中间过度,现在已经不用了
    
1.9HTTP Servlet
    javax.servlet.http包是Servlet API中的第二个包,其包含了编写Servlet应用程序的类和接口。javax.servlet.http中的许多类型覆盖了javax.servlet中的类型。
    javax.servlet.http主要类型
        interface
            javax.servlet.Servlet
                |javax.servlet.GenericServlet
            javax.servlet.ServletRequest
                |HttpServletRequest
            javax.servlet.ServletResponse
                |HttpServletResponse
                
            HttpSession
            Cookie
            
    1.9.1        HttpServlet
        HttpServlet覆盖了GenericServlet中的service方法,并用一下签名添加了另一个service方法:
            protected void service(HttpServletRequest request, HttpServletResponse reponse) throws ServletException, java.io.IOException{}
        HttpServlet拥有GenericServlet不具有的两个特性
            1.不覆盖service方法,而是覆盖doGet、doPost方法,或者两者都覆盖。
            2.用HttpServletResponse 和HttpServletRequest 代替 ServletResponse 和 ServletRequest
    1.9.2        HttpServletRequest
        表示HTTP环境下的Servlet请求,他继承自javax.servlet.ServletRequest。并增加了几个方法
        java.lang.String getContextPath()                                    返回表示请求context的请求URI部分
        Cookie[] getCookie()                                                            返回一个Cookie对象数组
        java.lang.String getHeader(java.lang.String name)    返回指定HTTP标头的值
        java.lang.String getMethod()                                            返回发出这条请求的HTTP方法名
        java.lang.String getQueryString()                                    返回请求URL中的查询字符串
        HttpSession getSession(boolean create)                        返回与这个请求有关的session对象,如果没有找到,则创建新的session对象
    1.9.3        HttpServletResponse
        表示HTTP环境下的Servlet响应
        void addCookie(Cookie cookie)        给这个响应添加cookie
        void addHeader(java.lang.String name, java.lang.String value)        给这个响应对象添加标头
        void sendRedirect(java.lang.String location)        发送响应代号,将浏览器重定向到指定位置
1.10 处理HTML表单
        每个Web应用程序几乎都会有一个或多个html表单,用来接受用户输入。你何以轻松的将一个html表单从servlet发送到浏览器。当用户提交表单时,在表单元素中,输入的值将会被当做请求参数发送到浏览器。
        html输入域(文本域、隐藏域、密码域)或者文本域的值被当做一个字符串发送到服务器。对于空白的输入域或者文本域将发送一条空白字符串。因此,带有一个输入域名称的ServletRequest.getParameter将永远不会返回null
        html的select元素还会给标头发送一个字符串,但是如果没有select元素中的任何选项,那么将会发送所显示的选项值。
        对于一个带有多个值得选择元素(即允许多个选项的select元素,用 <select multiple> 表示)是发送一个字符串数组,并且必须由ServletRequest.getParameterValues进行处理
        
        复选框比较特殊,被选中的复选框将字符串“on”发送到服务器,没有被选中的复选框将不发送任何内容到服务器,并且ServletRequest.getParameter(fieldname) 返回null
        单选按钮将被选中的值发送到服务器,如果没有选中任何内容,将不发送任何内容,并且ServletRequest.getParameter(fieldname)返回null
        如果一个表单中包含多个同名的输入元素,那么所有的值都会被提交。必须用ServletRequest.getParameterValues来获取他们。ServletRequest.getParameter将只返回最后一个值
            
1.11使用部署描述符
        部署描述符总是命名为web.xml,并放在WEB-INF目录下。
            部署描述符有注解没有的元素
            另一个好处是,如果需要修改配置,不需要重新编译Servlet类
            
           

原文地址:https://www.cnblogs.com/ya-cpp/p/5164197.html