在劫

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

Servlet是运行在Web服务器或应用服务器上的程序,它是违来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以手机来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Servlet主要功能:

  1. 读取客户端发送的显式数据,包括HTML表单,或者也可以是其他HTTP客户端程序的表单
  2. 读取客户端发送隐式HTTP请求数据,包括cookie、媒体类型和浏览器能理解的格式等
  3. 处理数据并生成结果
  4. 发送显式数据到客户端
  5. 发送隐式的HTTP响应到客户端

Servlet生命周期:

  1. Servlet通过调用init()方法进行初始化
  2. 调用service()方法处理客户端请求
  3. 通过调用destroy()方法终止
  4. 由JVM的垃圾回收器进行垃圾回收

请求/响应的基本流程:

  1. 客户端对Web容器发出HTTP请求
  2. HTTP服务器收到HTTP请求,将请求转由Web容器处理,Web容器会剖析HTTP请求内容,创建对象
  3. Web容器由请求的URL决定要使用哪个Servlet来处理请求
  4. Servlet根据请求对象的信息决定如何处理,通过响应对象来创建响应
  5. Web容器与HTTP服务器沟通,Web服务器将响应转换为HTTP响应并传回客户端

  注:Web服务器可能会使用同一个Servlet实例响应多个请求,多个请求下,相当于同一个线程共享存取一个对象,要特别注意线程安全问题。

Servlet创建对象时机

  1. 客户端第一次请求某个Servlet时,系统创建该Servlet的实例
  2. Web应用启动时立即创建Servlet,即load-on-startup Servlet,load-on-startup只接收一个整数值,数值越小,越优先实例化。

MVC:

  1. Model 模型 接受控制器的请求调用,负责处理业务逻辑、负责数据存取逻辑等
  2. View 视图
  3. Controller 控制器 取得请求参数、验证请求参数、转发请求给模型、转发请求给画面
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置响应内容类型器
            response.setContentType("text/html;charset=UTF-8");
            //取得响应输出对象
            PrintWriter out = response.getWriter();
            //获取请求参数
            String name = request.getParameter("name");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Hello First Servlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>" + "hello" + name + "</h1>");
            out.println("</body>");
            out.println("</html>");
            
        }

    在浏览器地址栏输入http://localhost:8080/FirstServlethehe/HelloFirstServlet?name=java就可以得到页面

HTTPServlet的service方法流程:

    String method = req.getMethod();
    if(method.equals(METHOD_GET)){
        doGet(req, resp);
    }else if(method.equals(METHOD_POST)){
        doPost(req, resp);
    }else if(method.equals(METHOD_HEAD)){
        doHead(req, resp);
    }else if(method.equals(METHOD_PUT)){
        doPut(req, resp);
    }

doGet()方法和doPost()方法:

  1. GET请求跟随在URL之后的请求参数长度有限,过长的请求参数,或如文件上传这类大量数据,不适合GET请求,应该改用POST请求

  2. GET请求参数会出现在地址栏上,敏感性或有安全考虑的请求参数不应该使用GET请求

  3. POST请求参数不会出现在地址栏上,所以无法加入浏览器的书签中

  4. 有些浏览器会依网址缓存数据,如果网址是相同的URL,则会直接从浏览器缓存中取出数据,而不会真正发送请求到服务器上查询最新的结果。如果不希望服务器状态改变了,而浏览器仍从缓存中取得旧的资料,则使用POST请求(使用GET也可以避免缓存,比如在网址上附加时间戳,让每次GET请求网址不同)

  5. GET请求应该用于等幂操作。GET请求纯粹取得资源,而不改变服务器上的数据或状态。

  6. POST请求应用于非等幂操作。POST请求发送的数据可能会影响到服务器上的数据或状态

使用注解配置

@WebServlet(
            asyncSupported  //boolean 指定Servlet是否支持异步操作模式
            name="Three",       //String 这个Servlet的名称是Three
                                //可以指定,也可以不指定,指定了可以通过getServletName()方法获得,没有指定则是Servlet的完整类名
            urlPatterns = {"/ThreeServlet"},  //客户端请求的URL是/ThreeServlet
                                             //可以配置多个映射,配置了多个映射代表不同的地址信息指向同一个文件
            displayName = "thrid",          //指定Servlet显示名称
            initParams = {                  //配置初始化数据
                    @WebInitParam(name = "name", value = "Three")
            },
            loadOnStartup = 1)  //标记容器是否在应用启动时就加载这个Servlet
                                //0或正数表示启动应用就加载,数字越小,加载Servlet的优先级就越高
//注解配置多个映射:
@WebServlet(urlPatterns = {"/HelloFirstServlet.view",
                "/helloSecondServlet.view"
            })
//默认第一个地址

如果在web.xml配置中指定metadata-complete="true",则注解无效

<web-app>
    <metadata-complete>true</metadata-complete>
</web-app>

使用web.xml配置

<web-app>
    <servlet>
        <servlet-name><servlet-name>
        <servlet-class><servlet-class>
        <init-param>
            <param-name></param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup></load-on-startup>
    </servlet>
    <servlet-mapping>   
        <servlet-name></servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>
<web-app>

获得配置参数

        ServletConfig config = getServletConfig();        
        out.println("initParams :  " + config.getInitParameter("initFirst"));
        out.println("<br/>");
        out.println("initParamSecond : " + this.getInitParameter("initSecond"));    

web.xml其他标签

 1.<web-app></web-app>
  <web-app></web-app>是部署描述的根元素,该元素含23个子元素。在Servlet2.3中,子元素必须按照DTD文件描述中指定的顺序出现。比如:如果部署描述符中的<web-app>元素有<servlet><servlet-mapping>两个子元素,则<servlet>子元素必须出现在<servlet-mapping>子元素之前。在Servlet2.4中,顺序并不重要。

 2.<display-name></display-name> 
  <display-name></display-name>定义web应用的名称。如<display-name>trk-order-rest</display-name>

 3.<distributable/>
  <distributable/>可以使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。

 4.<context-param></context-param>
    <context-param>元素含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在web应用的整个生命周期中上下文初始化参数都存在,任意的Servlet和jsp都可以随时随地访问它。<param-name>子元素包含有参数名,而<param-value>子元素包含的是参数值。作为选择,可用<description>子元素来描述参数。

 5.<session-config></session-config>
    设置容器的session参数,<session-timeout>指定session的失效时间(默认30分钟),<session-timeout>值必须为整数,为0或负数,表示会话永远不会超时

  6.<filter></filter>
    预处理

  7.<listener></listener>
    监听器

  使用web.xml会覆盖注解配置信息。

从Servlet 3.0新特性,通过web-fragment.xml可以将项目拆分为多个项目,解耦合,使其在项目中开发效率提高

创建web fragment project

web-fragment.xml配置信息:

<web-fragment id="WebFragment_ID" version="3.1"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-fragment_3_1.xsd">
    <display-name>Test</display-name>
    <name>fragmentname</name>

    <listener>
    <!-- 配置一个监听器 -->
    <listener-class>myListenner.DEMO1</listener-class>
    </listener>
    <!-- 表示一个执行序列  -->
    <ordering>
       <!-- 表示在项目所有之前进行初始化 -->
        <before><others/></before>
    </ordering>
</web-fragment>

在web.xml中配置,使用<absolute-ordering>定义绝对顺序:

    <absolute-ordering>
            <name>fragmentname</name>
            ...
    </absolute-ordering>    

 

 

 

 

posted on 2018-11-20 05:23  在劫  阅读(148)  评论(0)    收藏  举报