Java Servlet

作者: 丿星纟彖彳亍 | 来源:发表于2020-09-17 15:00 被阅读0次

    1、概念

    Servlet (Server Applet)是sun 公司提供的一门用于开发动态web 资源的技术,主要功能在于交互式地浏览和修改数据,生成动态Web 页面。

    我们实际开发应用中,一般不需要去研究Http 协议,只要扩展servlet 接口,即可实现web 服务器应用程序的开发。

    通俗来讲,就是这个技术可以实现一个由客户端发起请求-->服务器端处理-->客户端得到响应的功能:


    Servlet.png

    2、tomcat和servlet的关系

    874710-20170214204632894-1786729693.png

    ①:Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。

    ②:Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器

    3、生命周期

    Servlet 生命周期可被定义为从创建直到毁灭的整个过程。


    Servlet生命周期.png

    ①init () 方法进行初始化:

    在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet 时装入Servlet。

    无论有多少客户机访问Servlet,都不会重复执行init();

    ②Servlet 调用 service() 方法来处理客户端的请求:

    它是Servlet的核心,每当一个客户请求一个HttpServlet 对象,该对象的Service() 方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet 中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

    ③Servlet 通过调用 destroy() 方法终止(结束):

    仅执行一次,在服务器端停止且卸载Servlet 时执行该方法,有点类似于C++ delete 方法。一个Servlet 在运行service() 方法时可能会产生其他的线程,因此需要确认在调用destroy() 方法时,这些线程已经终止或完成。

    Servlet 的生命周期的话还需要加上在init() 之前有一个加载和实例化Servlet(反射机制)的过程。

    4、几个重点对象

    四大类,ServletConfig对象,ServletContext对象、request对象,response对象。

    4.1 ServletConfig对象

    获取途径:getServletConfig();


    getServletConfig.png
    • getServletName(); //获取servlet的名称,也就是我们在web.xml中配置的servlet-name
    • getServletContext(); //获取ServletContext对象,该对象的作用看下面讲解
    • getInitParameter(String); //获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数
    • getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型

    4.2 ServletContext对象

    获取途径:

    • getServletContext();
    • getServletConfig().getServletContext();

    功能:tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。

    4.2.1 web项目中共享数据

    • setAttribute(String name, Object obj); // 在web项目范围内存放内容,以便让在web项目中所有的servlet读能访问到
    • getAttribute(String name); // 通过指定名称获得内容
    • removeAttribute(String name); // 通过指定名称移除内容

    4.2.2 整个web项目初始化参数

    这个就是全局初始化参数,每个Servlet中都能获取到该初始化值

    • getInitPatameter(String name); //通过指定名称获取初始化值
    • getInitParameterNames(); //获得枚举类型 web.xml 配置 整个web项目的初始化

    4.2.3 获取web项目资源

    • getServletContext().getRealPath("/WEB-INF/web.xml"); //获取web项目下指定资源的路径
    • getResourceAsStream("/WEB-INF/web.xml"); //获取web项目下指定资源的内容,返回的是字节输入流
    • getResourcePaths("/WEB-INF/web.xml"); // 指定路径下的所有内容。

    4.3 request对象

    request对象.png

    4.3.1 请求行内容获取

    • getRequestURI(); //统一资源标记符
    • getRequestURL(); //统一资源定位符
    • getProtocol(); //协议
    • getScheme(); //版本
    • getServerName(); //主机(域名)
    • getServerPort(); //端口
    • getContextPath(); //发布到服务器下的项目名称
    • getServletPath(); //servlet路径
    • getQueryString(); //所有请求参数,?之后的所有
    • getRemoteAddr(); //远程主机的IP地址

    4.3.2 请求头的获取

    请求头.png
    • getHeader(java.lang.String name); // 获得指定头内容String
    • getDateHeader(java.lang.String name) 获得指定头内容Date
    • getIntHeader(java.lang.String name) 获得指定头内容int
    • getHeaders(java.lang.String name) 获得指定名称所有内容

    4.3.3 请求体的获取(请求参数)

    • request.getParameter(String); // 获得指定名称,一个请求参数值。
    • request.getParameterValues(String); //获得指定名称,所有请求参数值。例如:checkbox、select等
    • request.getParameterMap(); // 获得所有的请求参数

    4.3.4 请求转发

    • 方法:
      request.getRequestDispatcher(path).forward(request,response);
      PS:path:转发后跳转的页面,这里不管用不用"/"开头,都是以web项目根开始,因为这是请求转发,请求转发只局限与在同一个web项目下使用,所以这里一直都是从web项目根下开始的。
    • 特点
      浏览器中url不会改变,也就是浏览器不知道服务器做了什么,是服务器帮我们跳转页面的,并且在转发后的页面,能够继续使用原先的request,因为是原先的request,所以request域中的属性都可以继续获取到。

    4.4 response对象

    response对象.png

    4.4.1 重定向

    • 手动
      response.setStatus(302);  //状态码302就代表重定向
      response.setHeader("location","http://www.baidu.com");
    • 封装
      使用封装好的,通过response.sendRedirect("http://www.baidu.com");
      特点:
      服务器告诉浏览器要跳转的页面,是浏览器主动去跳转的页面,浏览器知道,也浏览器的地址栏中url会变,是浏览器重新发起一个请求到另外一个页面,所以request是重新发起的,跟请求转发不一样。
      注意:
      //第一种:response.sendRedirect("/test01/MyServlet01");  //使用了"/"开头,说明是从web站点根开始,所以需要写test01/MyServlet01
      第二种:response.sendRedirect("MyServlet01");  //没有使用"/"开头,说明是从web项目根开始,那么就无需写test01了。

    重定向没有任何局限,可以重定向web项目内的任何路径,也可以访问别的web项目中的路径,并且这里就用"/"区分开来,如果使用了"/"开头,就说明我要重新开始定位了,不访问刚才的web项目,自己写项目名,如果没有使用"/"开始,那么就知道是访问刚才那个web项目下的servlet,就可以省略项目名了。就是这样来区别。

    参考文档:

    相关文章

      网友评论

        本文标题:Java Servlet

        本文链接:https://www.haomeiwen.com/subject/naklyktx.html