Servlet

一、简介

  1、Servlet:
    狭义上的Servlet:仅仅指的是这个servlet接口
    广义的Servlet:不仅包含该Servlet接口,还包含该Servlet的接口的子类!
  2、Servlet是JavaWeb部分的三大组件:
    JavaWeb部分三大组件:Servlet、Filter、Listener,这三个组件都需要交给web服务器管理!

  3、Servlet的主要作用
          接收请求
          处理请求
          完成响应

  4、创建Servlet的三种方法:      

      1>自定义一个Servlet:
        1).自定义一个类,实现Servlet接口,并实现接口中的方法
        2).将自定义的servlet类在web.xml文件中配置一下!

 1     <!-- 使用servlet标签配置我们自定义的servlet -->
 2     <servlet>
 3     <!-- 在servlet-name该标签中,我们可以配置一个servletName,
 4     建议和servlet类的简类名一致 ,该servletName是我们自己使用-->
 5     <servlet-name>HelloServlet</servlet-name>
 6     <!-- 使用servlet-class标签配置自定义servlet类的全类名,
 7     这个全类名是给服务器使用的,服务器会使用这个全类名创建该类所对应的servlet对象
 8     -->
 9     <servlet-class>com.neuedu.servlet.HelloServlet</servlet-class>
10     </servlet>

 

1     <!-- 使用servlet-mapping标签配置servlet映射 -->
2     <servlet-mapping>
3     <servlet-name>HelloServlet</servlet-name>
4     <!-- 该url-pattern 是用来请求映射url地址的,也就说
5     该标签中的内容是给浏览器访问使用的!
6     -->
7     <url-pattern>/Hello</url-pattern>
8     </servlet-mapping>

      2>新建类,继承HttpServlet,重写doGet()和doPost()方法

       在web.xml文件中手动配置servlet信息(同第一种方法配置相同)

      3>直接在项目的某一个包下右键—>New—>Servlet
          这种创建方式不用配置web.xml文件,系统会进行自动配置

  5、新建Servlet没有service()方法原理

    目前我们常用的新建Servlet的方法就是直接右键,创建Servlet,这种方法创建的Servlet没有有service()方法,而是doGet()和doPost()方法

    这是由于这种方法新建的Servlet,继承HttpServlet,而HttpServlet继承了GenericServlet,

      GenericServlet类实现了Servlet, ServletConfig接口,因此HttpServlet中继承了父类的service()方法

    在HttpServlet类中,重写了service()方法,将ServletRequest,ServletResponse对象强制转换为

      HttpServletRequest,HttpServletResponse对象,并根据浏览器的请求方式,调用doGet()或doPost()方法

         

 Eclipse中查看Tomcat源代码的方法:

    选中某个接口或类,右键—>Open  Declaration—>Attach  Source—>将下载好的tomcat源代码压缩包apache-tomcat-7.0.67-src.zip添加到eclipse中

    查看源代码时,直接选中按F3即可

二、Servlet生命周期

  1. Servlet生命周期:就是Servlet对象由产生到销毁的过程

    涉及到的方法:

      1)    Servlet构造器:在第一次访问该servlet的时候调用,且只会被调用一次,说明该Servlet是单例的,注意:不要在Servlet中定义非共享的变量。

      2)    init()方法:在第一次访问该servlet的时候调用【在构造器被调用之后紧接着被调用】,且该方法只会被调用一次

      3)    service()方法:每次访问该Servlet都会调用一次service()方法,因此业务逻辑代码,主要写在service()方法中

      4)    destroy()方法:该方法会在项目被卸载(服务器关闭)的时候被调用,且只会被调用一次

  2、普通Servlet生命周期:请求的时候才将Servlet对应的字节码文件加载到虚拟机中

  3、默认<load-on-startup></load-on-startup>值为负,即普通Servlet

  4、设置<load-on-startup>1</load-on-startup>值为正(优先级0,1,2……),当部署的时候就会调用init()方法

三、相关接口

  1、ServletConfig

    1)    代表:代表当前Servlet的配置信息,每个Servlet对应唯一的一个ServletConfig对象

1 <servlet>
2       <servlet-name>MyServlet1</servlet-name>
3       <servlet-class>com.neuedu.firstservlet.web.MyServlet1</servlet-class>
4       <init-param>
5           <param-name>username</param-name>
6           <param-value>张三</param-value>
7       </init-param>
8 </servlet>

 

    2)    获取:由Tomcat服务器创建,通过参数的形式传递给init()方法

    3)    功能:

        获取当前servlet的名称【getServletName()】

        获取当前servlet的初始化参数【getInitParameter("username")】

        获取Servletcontext【getServletContext()】

  2、ServletContext:

    1)    代表:ServletContext代表的是当前web应用!

    2)    获取 :通过ServletConfig对象获取[getServletContext()]

    3)    功能:

         获取整个web应用的初始化参数【getServletContext()】

        可以做为javaweb部分的四大域对象之一使用

        可以获取当前项目的名称【getContextPath()】

        可以获取文件的绝对路径【getRealPath("/index.html")】

    路径:

                   虚拟路径:http://localhost:8080/servlet01/BServlet

                   真实路径:是指的在本地磁盘上的具体路径

  3、HttpServletRequest

    1)代表:代表浏览器向服务器发送的请求报文
    2)   获取:由tomcat服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
    3) 功能:
        getParameter()获取请求参数
        getContextPath():获取当前项目名
        setAttribute/getAttribute:本身就是一个域对象!
        request.getRequestDispatcher("1.html").forward(request,response);可以实现转发功能

  4、HttpServletResponse 

    1)代表:服务器响应给浏览器的响应报文
    2)获取:由服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
    3)功能:
        response.getWriter().println("<h3>helloworld!</h3>");可以返回给浏览器一个页面或者一个页面片段!
        response.sendRedirect("/servlet1/1.html"); :可以做请求的重定向

 四、服务器转发与重定向

  1、TomcatServlet/JSP容器)服务器转发

      RequestDispatcher请求分发器接口

        RequestDispatcher.forward(HttpServletRequest req,HttpServletResponse  resp);

        RequestDispatcher requestDispatcher=request.getRequestDispatcher(“/second”);

        requestDispatcher.forward(request,response);

    是同一个请求,继续延长原有的请求,只能转发本应用程序内的资源,转发发生在服务器端

    服务器在Servlet间的转发既不属于get请求,也不属于post请求,只是由转发到的Servlet的doGet()方法处理

  2、重定向

    由服务器响应对象告诉浏览器去请求(重定向)另一资源,对原有客户端请求来说,是浏览器向服务器发送了另一个请求,如果请求是外部资源,将由响应的服务器应用处理,是两个不同的请求(request)

    注意作用域范围:request在请求范围内有效,ServletContext在整个应用内有效,因此重定向无法从源request内getAttribute

      response.sendRedirect(request.getContextPath()+”index.jsp”);

  3、转发与重定向对比

 

 

浏览器请求次数

地址栏是否发生变化

发生在服务器端/浏览器端

浏览器能否感知

 

转发

1

服务器端

Request

重定向

2

浏览器端

Response

posted @ 2017-11-14 19:51  咕噜噜zmj  阅读(166)  评论(0编辑  收藏  举报