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

目录

1.设置编码

2.servlet的生命周期

        优点:

        缺点:

    设置servlet的响应时机:

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

3.servlet的继承关系

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

4.Http协议

5.会话

        http是无状态的:

        解决http无状态的方法:会话跟踪

        session保存作用域:

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

1.服务器内部转发:

 2.客户端重定向:


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.客户端重定向:

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

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

猜你喜欢

转载自blog.csdn.net/qq_52655865/article/details/124147924
今日推荐