0


Servlet的继承,生命周期,Http协议(二)

1.设置编码

 在xml文件配置中,一个servlet可以对应多个mapping,意义在于,可以看到用户是采用何种路径访问
 一个mapping 只能对应一个servlet
 tomcat8之前:
     (1.如果是post传递方法:
         request.setCharacterEncoding("UTF-8");
     (2.如果是get传递方法
         1.先将数据转换成字节数组
         String name = request.getParameter("name");
         byte[] by = name.getBytes("ISO-8859-1");
         2.将字节数组按照设定的编码格式转成成字符串
         name = new String(by,"UTF-8");
 tomcat8之后:
     只针对post方法:request.setCharacterEncoding("UTF-8");

2.servlet的生命周期

服务器的开启到服务器的关闭
默认情况下:

     第一次接受请求时,servlet会进行初始化(init()),实例化(servce())
     而后每次刷新关闭网页等操作都是在调用servce()服务方法
     直到服务器的关闭,servlet的生命周期结束,销毁方法(destory())

     第一次请求时,tomcat会进行实例化,初始化,然后在服务,而后每次服务都是这个实例对象在执行

  **   优点**:

只创建一次对象,提高效率,减少服务器负担

   **  缺点**:

第一次服务时,耗时较长
-如果需要提高系统的启动速度,当前默认状态就可以,
-如果要提高servlet的响应速度,应该设置servlet的响应时机。

 设置servlet的响应时机:

        ** 在xml中的servlet中设置<load-on-startup>1</load-on-startup>设置初始化和实例化的时间
         时间越小,初始化和实例化的时间就越早,**
         采用此标签,初始化和实例化都是在tomcat启动时执行
         当第一个用户访问时,就会直接服务不会在进行初始化和实例化,启动速度变慢,但服务响应速度变快,提高用户体验

 Servlet在服务器中:单例的,线程不安全的

         单例:只有一个servlet实例
         线程不安全:当多个线程访问,如果一个线程修改了servlet中的一个变量,可能会导致其他线程的逻辑路径发生变化

      因此,在servlet类中不要定义与逻辑有关的变量,并且不要修改变量

3.servlet的继承关系

 HttpServlet抽象类 继称 ——> javax.servlet.GenericServlet抽象类 实现 ——> Servlet接口

 1.Servlet接口中的三个抽象方法

     init(ServletConfig var1);初始化方法
     void service(ServletRequest var1, ServletResponse var2);服务方法
     void destroy();销毁方法
 2. javax.servlet.GenericServlet抽象类中的方法实现了了Servlet中的三个抽象方法,但任然是抽象的方法

 3.HttpServlet抽象类中的实现了接口中的方法;

 404:出错未找到相应的页面
 405:method的方式默认为doget,如果继承HttpServlet却重写的方法不对,就会报错405,method亲求方式出错
 500:服务器内部错误
 200:正常响应

302:重定向

4.Http协议

http协议:超文本传输协议
http是无状态的
http包括请求和响应
1.请求:包括1).请求行 2).请求头 3).请求体
1).请求行:
1,请求方法
2.请求的url
3.请求的协议:(一般为http1.1)
2).请求头:
包括客户端想服务器发送的浏览器版本,端口号,请求内容等等
3).请求体:
1).get方式:没有请求体 有queryString
2).post方式:有请求体 form data
3).json方式:request payload
2.响应:
1).响应行
包括:协议,响应码(200),响应状态
2).响应头
包括:服务器的信息(版本信息,),响应内容的大小,格式,等
3).响应体
具体响应的内容及具体的页面信息。

5.会话

     http是无状态的:

是指服务器无法区分请求是否来自于同一个客户端
无状态导致:可能会发生混乱,服务器将A客户端发来的请求响应到B客户端

     解决http无状态的方法:会话跟踪
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        HttpSession id = req.getSession();
        System.out.println("创建的session id为:"+id);
    }

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2Z5omv,size_20,color_FFFFFF,t_70,g_se,x_16

         -服务器在客户端请求时,会给客户端分配会话ID,sessionId,每一个客户端的id唯一,并将创建的id返回给客户端
         -客户端下次访问服务器时,就会通过sessionId将响应的结果返回给响应的客户端,以此就解决了混乱问题。

     session保存作用域:

      不同session之间不可以互相访问其他session保存的内容

     session的作用域:**从session创建到浏览器关闭。**

6.服务器内部转发和重定向

1.服务器内部转发:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2Z5omv,size_20,color_FFFFFF,t_70,g_se,x_16

//测试内部请求转发
public class DemoServlet02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest requuest, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo02....");
    }
}

public class DemoServlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest requuest, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo01....");
        //demo01跳转到demo02
        requuest.getRequestDispatcher("demo02").forward(requuest,response);
    }
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2Z5omv,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2Z5omv,size_20,color_FFFFFF,t_70,g_se,x_16

2.客户端重定向:

public class DemoServlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest requuest, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo01....");
        //测试内部请求转发
//        requuest.getRequestDispatcher("demo02").forward(requuest,response);
        //测试重定向
        response.sendRedirect("demo02");
    }
}

public class DemoServlet02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest requuest, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo02....");
    }
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2Z5omv,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2Z5omv,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2Z5omv,size_20,color_FFFFFF,t_70,g_se,x_16

标签: Http servlet Tomcat

本文转载自: https://blog.csdn.net/qq_52655865/article/details/124147924
版权归原作者 余扯 所有, 如有侵权,请联系我们删除。

“Servlet的继承,生命周期,Http协议(二)”的评论:

还没有评论