Servlet

一、基本概念

1. Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
2. 从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器
3. Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容
4. Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet
1)HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。

2)HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法
5. Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:

1)Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。

2)装载并创建该Servlet的一个实例对象。

3)调用Servlet实例对象的init()方法。

4)创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。

5)WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。 
6. Server 创建一个 Servlet的实例
1)第一个客户端的请求到达 Server

2)Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup>标签,配置的值为整型,值越小 Servlet 的启动优先级越高)

3)一个客户端的请求到达 Server

4)Server 创建一个请求对象,处理客户端请求

5)Server 创建一个响应对象,响应客户端请求

6)Server 激活 Servlet 的 service() 方法,传递请求和响应对象作为参数

7)service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息

8)service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或doPost() 或程序员自己开发的新的方法。

9)对于更多的客户端请求,Server 创建新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法
7. Servlet 执行以下主要任务
1)读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。

2)读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。

3)处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。

4)发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。

5)发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

二、servlet生命周期

1.Servlet生命周期的一般过程:
1)Servlet 通过调用 init () 方法进行初始化
2)Servlet 调用 service() 方法来处理客户端的请求
3)Servlet 通过调用 destroy() 方法终止(结束)
4)最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的
2.init()
1)init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用

2)Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载
3.service()
1)service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,
   并把格式化的响应写回给客户端

2)每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务
4.destroy()
1) destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用

2) destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动

3) 在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收

三、servlet常用配置

1.基本配置 (web.xml)
<web-app>     
        <servlet>
            <servlet-name>HelloWorld</servlet-name>
            <servlet-class>test.hh.HelloWorld</servlet-class>
        </servlet>

        <servlet-mapping>
            <servlet-name>HelloWorld</servlet-name>
            <url-pattern>/HelloWorld</url-pattern>
        </servlet-mapping>
</web-app>

 注意:在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开头并以"/*"结尾
2.配置Servlet初始化参数(ServletConfig)
1)当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet
2)配置
<init-param>
     <param-name>name</param-name>
     <param-value>hh</param-value>
</init-param>
<init-param>
     <param-name>password</param-name>
     <param-value>123</param-value>
</init-param>
3)ServletConfig常用方法(一般在servlet中 this.getServletConfig()得到)
(1)String getInitParameter(String name)       根据初始化参数名name获得初始化值value

(2)Enumeration<String> getInitParameterNames  获取所有初始化值,返回值为枚举类型

(3)ServletConfig.getServletContext()          获得ServletContext对象,也可以this.获取
3.配置ServletContext(web-app下和servlet同一级)
1)ServletContext基本概念
(1)WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用

(2)多个Servlet通过ServletContext对象实现数据共享

(3)由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯
2)配置
<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>
3)ServletContext常用方法
(1)void setAttribute(String str, Object o)                        给ServletContext设置属性以及值

(2)Object getAttribute(String str)                                获取属性值

(3)String getInitParameter(String name)                        	获取整个web站点的初始化参数

(4)Enumeration<String> getInitParameterNames          			获取整个web站点的所有初始化信息

(5)RequestDispatcher getRequestDispatcher(String str)  			获取请求转发对象

    eg:    RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");
           rd.forward(request, response);           				// 调用forward方法实现请求转发
4) 通过servletContext对象读取资源文件
(1)InputStream getResourceAsStream(String str)

      InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
      Properties prop = new Properties();
      prop.load(in);
      String url = prop.getProperty("url");

(2)String getRealPath(String str)             // 获得文件的完整绝对路径path,再使用字节流读取path下的文件

      String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
      String filename = path.substring(path.lastIndexOf("\\")+1);
      FileInputStream in = new FileInputStream(path);
      Properties prop = new Properties();
      prop.load(in);
      String url = prop.getProperty("url");

 (3) URL getResource(String str)                  // 获得一个url对象,调用该类的openStream方法返回一个字节流,读取数据

      URL url = this.getServletContext().getResource("/WEB-INF/classes/db.properties");
      InputStream in = url.openStream();
      Properties prop = new Properties();
      prop.load(in);
      String url1 = prop.getProperty("url");
5) web工程中,不同位置的资源文件的读取方式
(1) 当资源文件在包下面时

    InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/cn/itcast/context/db.properties");

(2) 资源文件在web-inf下

    in = this.getServletContext().getResourceAsStream("/WEB-INF/db.properties");

(3) 资源文件在web工程中

    in = this.getServletContext().getResourceAsStream("/db.properties");
6) 在非servlet程序中如何读取配置文件:用类装载器
(1) 用类装载方式读取

    in = StudentDao.class.getClassLoader().getResourceAsStream("cn/itcast/context/db.properties")

(2) 用类装载方式读取,把资源当作url对待

    URL url = StudentDao.class.getClassLoader().getResource("db.properties")
    这样可以获得资源文件名称:String path = url.getPath();

注意:用类装载器读取资源文件时,千万要注意,资源文件绝对不能太大,否则极易导致内存溢出

四、ServletRequest与ServletResponse

1.基本常识
1)在Servlet中,分别用HttpServletRequest与HttpServletResponse来表示Http请求和响应

2)这两个类均来自javax.servlet.http包,是J2EE Servlet与JSP规范的一部分,因此,谈及HttpServletRequest与HttpServletResponse的时候,其实都是和Servlet(包括JSP)有关的
2.ServletRequest
1)代表一个HTTP请求,请求在内存中是一个对象,这个对象是一个容器,可以存放请求参数和属性
2)请求对象由Servlet容器自动产生,这个对象中自动封装了请求中get和post方式提交的参数,以及请求容器中的属性值,还有http头等等
3)通过请求对象,可以获得Session对象和客户端的Cookie
4)常用方法
(1)getsession()            			返回和客户端相关的session,如果没有给客户端分配session,则返回null

(2)getCookies()            			返回客户端发送的Cookie

(3)getAttributeNames()        		返回当前请求的所有属性的名字集合

(4)getAttribute(String name)        	返回name指定的属性值

(5)getParameter(String name)        	获取请求中的参数,该参数是由name指定的

(6)getParameterValues(String name)    返回请求中的参数值,该参数值是由name指定的

(7)getCharacterEncoding()        		返回请求的字符编码方式

(8)getInputStream()            		获取请求的输入流中的数据

(9)getMethod()            			获取发送请求的方式,如get、post

(10)getParameterNames()        		获取请求中所有参数的名字

(11)getProtocol()            			获取请求所使用的协议名称

(12)getRemoteAddr()            		获取客户端的IP地址

(13)getRemoteHost()            		获取客户端的名字

(14)getServerName()            		返回接受请求的服务器的名字

(15)getServerPath()            		获取请求的文件的路径
3.ServletResponse
1)也是由容器自动创建的,代表Servlet对客户端请求的响应,响应的内容一般是HTML,而HTML仅仅是响应内容的一部分
2)功能
(1)向客户端写入Cookie

(2)重写URL

(3)获取输出流对象,向客户端写入文本或者二进制数据

(4)设置响应客户端浏览器的字符编码类型

(5)设置客户端浏览器的MIME类型
3)常用方法
(1)addCookie(Cookie cookie)        		将指定的Cookie加入到当前的响应中

(2)addHeader(String name,String value)	将指定的名字和值加入到响应的头信息中

(3)containsHeader(String name)    		返回一个布尔值,判断响应的头部是否被设置

(4)encodeURL(String url)        			编码指定的URL

(5)sendError(int sc)            			使用指定状态码发送一个错误到客户端

(6)sendRedirect(String location)    		发送一个临时的响应到客户端

(7)setHeader(String name,String value)	将给出的名字和值设置响应的头部

(8)setStatus(int sc)            			给当前响应设置状态码

(9)setContentType(String ContentType) 	设置响应的MIME类型
4.请求转发与重定向的区别
1)调用方式
(1)请求转发

    request.getRequestDispatcher("new.jsp").forward(request, response);    // 转发到new.jsp

(2)重定向

    response.sendRedirect("new.jsp");    // 重定向到new.jsp
2)转发是服务器行为,重定向是客户端行为
3)请求转发发送一次请求(请求是在内部转发),重定向发送两次请求
4)RequestDispatcher.forward方法只能将请求转发给同一个Web应用中的组件,HttpServletResponse.sendRedirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到痛一个站点上的其他应用程序的资源,甚至是使用绝对URL重定向到其他站点的资源
5)对于sendRedirect如果传递的URL以"/“开头,他是相对于整个Web站点的根目录;对于forward如果传递的URL以”/"开头,它是相对于当前Web应用程序的根目录
6)forward的调用者与被调用者之间共享相同的request对象和response对象,他们属于同一个访问请求和响应过程;sendRedirect的调用者与被调用者使用各自的request和response对象,属于两个独立的访问请求和响应过程

参考网址

Web服务器工作原理概述

深入理解ServletRequest与ServletResponse

javaweb学习总结(五)——Servlet开发(一)

javaweb学习总结(六)——Servlet开发(二)

Servlet —— Servlet容器的启动及Servlet创建及初始化,容器默认的Servlet

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值