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

2022年05月15日 阅读数:1
这篇文章主要向大家介绍Servlet的继承,生命周期,Http协议(二),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

目录java

1.设置编码json

2.servlet的生命周期数组

        优势:浏览器

        缺点:tomcat

    设置servlet的响应时机:安全

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

3.servlet的继承关系session

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

4.Http协议ide

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