zoukankan      html  css  js  c++  java
  • servlet

    1 Servlet执行过程

    1.1 servlet简介

    servlet: 用java语言开发网页动态资源的技术。

    servlet特点:

    1)servlet就是一个普通的java类,继承HttpServlet类

    2)一个普通的java类实现了Servlet接口,也叫Servlet程序。我们通常继承HttpServlet是为了创建一个基于http协议的servlet程序。

    3)servlet程序交给tomcat服务器运行!!!

    1.2 Servlet开发过程

    1)编写java类,继承HttpServlet

    2)servlet程序交给tomcat服务器运行

    A 把servlet的class字节码拷贝到WEB-INF/classes目录下

    B 在web.xml文件中配置

    1.3 Servlet的执行过程

    前提: tomcat服务器启动时,会加载%conf%/web.xml文件。然后再加载站点下的每个web应用的web.xml文件。

    浏览器输入: http://localhost:8080/day8/first

    http://       http协议

    1)本地hosts文件查询域名和ip的映射

    2)找不到,联网到运营商的DNS服务器找域名和ip的映射

    8080       端口     tomcat:8080

    /day8     站点下的web应用名称

    /first     资源名称。截取到/first 字符串

    1)在day8应用下的web.xml文件中查找是否存在匹配的url-pattern

    2)使用servlet的内部名称在web.xml文件中查找是否存在相同名称的servlet配置

    3)得到对应的servlet-class内容。

    通过反射构造FirstServlet对象,调用方法(doGet.......)

    输出内容到浏览器,看到效果!!!

    2 Servlet的路径映射

    url-pattern: 表示servlet的路径映射,也叫servlet访问名称。

    url-patttern            浏览器输入URL

    精确匹配    

         /demo1     http://localhost:8080/day8/demo1       

         /test/demo1     http://localhost:8080/day8/test/demo1

    模糊匹配    

         /*        http://localhost:8080/day8/任意路径  

         /itcast/*   http://localhost:8080/day8/test/任意路径   

        *.后缀       http://localhost:8080/day8/任意路径.后缀

        (*.do   *.action  *.jsf   *.html)

    注意:

    1)url-pattern要么以/开头,要么以*开头    例如: itcast/demo1错误写法。  

    2)不能同时使用两种模糊匹配。例如: /itcast/*.html 错误写法

    3)当多个url-pattern同时符合匹配规则,那么

    A 精确匹配的url-pattern会优先被执行。

    B 后缀名结尾的模糊匹配的url-pattern优先级最低!!!

    3 Sevlet缺省路径

    /  : 表示servlet的缺省路径。

    tomcat服务器中配置了一个DefaultServlet,叫默认Servlet,该默认Servlet的url-pattern就是/ 。默认Servlet的作用,用于解析web应用下的静态资源。

    问题: 浏览器输入一个资源名称时,查找资源的顺序是如何?

    1)首先,在当前web应用下的web.xml文件中查找是否有匹配的url-pattern

    2)如果匹配到,执行对应的servlet(动态资源)

    3)如果没有匹配到,就交给tomcat服务器的默认Servlet去处理

    4)默认Servlet会到当前web应用下读取对应名称的静态资源文件。

    5)如果读到对应的静态资源文件,那么就把内容返回给浏览器

    6)如果读不到对应的静态资源文件,那么就返回404的错误页面。

    结论: 先找动态资源,再找静态资源!!!!

    4 Servlet的生命周期(重点)

    4.1 生命周期

    以前:以前的程序,java类,自己去new对象,自己去使用对象调用。

    现在: sevlet程序。servlet的生命周期由tomcat服务器控制的。

    servlet什么时候对象创建,什么销毁,什么时候调用什么方法???

    4.2 Servlet的四个生命周期

    构造方法: 在创建servlet对象时调用。只调用1次。

    证明servlet对象在tomcat服务器中是单实例的。

    init方法:在创建完servlet对象后调用。只调用1次。

    service方法: 在每次请求servlet时调用。调用n次。

    destroy方法: servlet对象销毁时调用。只调用1次。tomcat服务器停止或web应用重新部署时调用

    4.3 Servlet自动加载

    默认情况下,第一次访问servlet时创建servlet对象。创建对象的过程中会调用构造方法和inti方法。如果init方法的业务逻辑需要消耗比较长的时间,用户的第一次访问servlet时需要等待较长的时间。

    改变servlet对象创建的时机: tomcat服务器启动的时候创建servlet对象。

        <!-- 正整数:数值越大,创建对象的优先级越低 -->

        <load-on-startup>1</load-on-startup>

    5 Servlet线程安全问题

    servlet对象特点: 在tomcat服务器中是单实例多线程的!!!

    5.1 引发Servlet多线程问题

    多个线程同时操作了Servlet的成员变量(共享数据)。

    5.2 避免Servlet并发问题建议

    1)尽量不要在servlet类中使用成员变量。

    2)如果要使用成员变量,那么就要给使用到成员变量的代码块加上代码锁,尽量缩小同步锁的范围,以避免因为同步产生代码并发执行效率降低的问题。

    6 Init方法问题

    GenericServlet中,有两个init方法。

    有参数的init方法:该方法是servlet的四个生命周期方法中的一个。由tomcat服务器默认调用的初始化方法。在GenericServlet的实现中,该方法会调用无参数的init方法。

    无参数的init方法:该方法的是Sun公司设计出来用于给开发者去覆盖,用于实现初始化逻辑的方法。

    结论: 如果要编写servlet的初始化逻辑,只需要覆盖无参数的init方法即可!!!!

    Servlet中重要对象:

    1)HttpServletRequest对象:封装请求信息

    2)HttpServletResponse对象:封装响应信息

    3)ServletConfig对象: 封装一个servlet配置参数信息

    4)ServletContext对象: 封装web应用环境信息

    7 ServletConfig对象

    7.1 ServletConfig创建

    ServletConfig对象是在创建完servlet对象之后,被创建出来。然后通过有参数的init方法传递到servlet中。

    ServetConfig对象主要用于加载servlet配置参数信息。

    7.2 ServletConfigAPI

    getInitParameter(String name)   --得到参数

    getInitParameterNames()  

    ServletContext getServletContext()    得到servlet上下文对象

    getServletName()   得到servlet名称

    <servlet>

        <servlet-name>ConfigDemo</servlet-name>

    <servlet-class> ConfigDemo</servlet-class>

        <!--  配置servlet参数 -->

        <init-param>

         <param-name>path</param-name>

         <param-value>e:/bbs.txt</param-value>

        </init-param>

        <init-param>

         <param-name>BBB</param-name>

         <param-value>BBB's value</param-value>

        </init-param>

      </servlet>

    注意: servlet的配置参数只对当前servlet有效的!!对其他servlet是无效的!!

    8 ServletContext对象(重点)

    8.1 ServletContext简介

    ServletContext叫Servlet上下文对象,该对象表示当前的web应用环境信息。一个web应用只会创建一个ServletContext对象。

    8.2 ServletContext创建时机

    ServletContext对象是在tomcat服务器加载完当前web应用后创建出来。ServletContext对象是作为ServletConfig对象成员变量传入servlet中。通过ServletConfig的getServletContext()方法得到ServletContext对象。

    8.3 ServletContext对象的API

    得到web应用的上下文路径

    getContextPath()  

    得到web应用的全局参数(所有servlet有效的!!)

    getInitParameter(java.lang.String name)  

    getInitParameterNames()

    域对象相关的方法(对比request域与context域)

    setAttribute(String name, Object object)保存数据

    getAttribute(String name)  得到数据

    removeAttribute(String name)  清除数据

    Request转发相关的

    RequestDispatcher getRequestDispatcher(String path)

    Response重定向

    SendRedirect(string path) 

    web应用读取资源文件

    getRealPath(String path)

    "/WEB-INF/classes/news.properties"

    getResourceAsStream(String path)

    8.4得到web应用的上下文路径

    getContextPath()  得到web应用上下路径。也就是部署到tomcat服务器上运行的web应用名称。

    8.5得到web应用的全局参数

    getInitParameter(String name)  

    getInitParameterNames()

    <!-- 配置web应用全局的参数 -->

    <context-param>

    <param-name>AAA</param-name>

    <param-value>AAA's value</param-value>

    </context-param>

    <context-param>

    <param-name>BBB</param-name>

    <param-value>BBB's value</param-value>

    </context-param>

    注意:

    全局参数对当前web应用下的所有servlet都有效的!!!

    8.6域对象相关的方法

    ServetContext对象是一个域对象!!!

    域对象的作用: 主要用于保存数据和获取数据,用于在web应用中不同资源之间共享数据。

    Servlet1          

    response.sendRedirect(context.getContextPath+"/Servlet2?name=eric");     

    Servlet2

    request.getParameter("name");

    1)参数形式:只能传递字符串数据

    2)使用域对象形式:

    Servlet1中保存数据

    Servlet2中获取数据

    域对象相关的方法:

    setAttribute(String name, Object object) 保存数据

    getAttribute(String name)  得到数据

    removeAttribute(String name)  清除数据

    ServletContext域作用范围:

    在当前的web应用中有效!!!

    Servlet中所有域对象:

    HttpServletRequest对象: request域

    ServletContext对象: context域

    HttpSession对象: session域

    Jsp中域对象:

    PageContext对象: page域

    8.7转发相关的

    getRequestDispatcher(String path)  

    servlet中实现页面跳转

    请求重定向: response.sendRedirect(路径);

    请求转发: request.getRequestDispacher(路径).forward(request,respone);

    =======请求重定向 vs  请求转发  区别====

    请求重定向:

    1)地址栏改变,改变为重定向到地址

    2)可以重定向到当前web应用,其他web应用,甚至是其他站点资源。

    3)处于两次不同的请求。不可以使用request域对象来共享数据。

    请求转发:

    1)地址栏不会改变。

    2)只能转发到当前web应用内部资源。

    3)处于同一次请求。可以使用request域对象来共享数据不同类型资源:

    1)web应用内部资源。在当前web应用中的资源

    2)其他web应用资源。在同一个站点下的其他web应用的资源。

    3)站点外的资源。其他站点下的资源。 

    自定义servlet模板

    https://www.cnblogs.com/ms-grf/p/7206196.html

    package ${enclosing_package};
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet(urlPatterns = { "/${primary_type_name}" })
    public class ${primary_type_name} extends HttpServlet {
        
        private static final long serialVersionUID = 1L;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html; charset=UTF-8");        
            response.getWriter().append("Served at: ");
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
        }
    
    }
  • 相关阅读:
    UVA 10391 STL容器的使用
    UVA 10763
    UVA 10935
    UVA 洪水
    UVA 1594 set 里面放queue
    关于STL 容器的嵌套使用, 小试牛刀
    丑数 UVA 136
    UVA 1368 DNA
    antd 上传文件控件使用方法(坑)
    mysql查询一条工单时间需要10秒。优化sql语句得以解决。
  • 原文地址:https://www.cnblogs.com/lldsgj/p/10801181.html
Copyright © 2011-2022 走看看