美文网首页
第二章 Servlet技术模型

第二章 Servlet技术模型

作者: zju_dream | 来源:发表于2019-01-05 14:11 被阅读0次

[toc]


2.Servlet技术模型

2.1 Servlet API

Servlet规范提供了一个标准的,平台独立的框架以实现在Servlet和容器之间的通信。
Servlet 3.0 API由以下四个包组成:

  • javax.servlet
  • javax.servlet.http
  • javax.servlet.annotation
  • javax.servlet.descriptor

2.1.1 javax.servlet包

1. Servlet接口

  1. public void init(ServletConfig config):该方法由容器调用,完成Servlet初始化并提供服务。容器传递给该方法一个ServletConfig类型的对象
  2. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException: 对每个客户请求,容器调用一次该方法,它允许Servlet为请求提供响应(get、post...)
  3. public void destory(): 该方法由容器调用,指示Servlet清除本身,释放请求的资源并准备结束服务。
  4. public ServletConfig getServletConfig(): 返回关于Servlet的配置信息,如传递给init()的参数。
  5. p22

2. ServletConfig接口

它为用户提供了有关Servlet的配置信息。Servlet配置包括Servlet名称、Servlet上下文对象、Servlet初始化参数等。

  1. getServletContext()
  2. getInitParameter()

2.1.2 javax.servlet.http包

1. HttpServlet 类

实现针对http的Servlet,它扩展了GenericServlet类,p24

  1. protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
  2. protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
  3. doPost

2. HttpServletRequset 接口

扩展了ServletRequest接口,定义了从请求对象中获取HTTP请求头、Cookie等信息的方法。

3. HttpServletResponse 接口

它定义了为响应设置如HTTP头、Cookie信息的方法。

2.2 Servlet生命周期

加载和实例化->调用init()初始化Servlet实例->容器收到客户请求时将调用它的service()->容器在Servlet实例上调用destory()使它进入销毁状态

2.2.1 加载和实例化

对一个Servlet,可能在Web容器启动时或第一次访问时加载到容器中。对每个Servlet,容器使用Class.forName()对其加载并实例化。因此,要求Servlet类有一个不带参数的public构造方法。

2.2.2 初始化Servlet

容器创建Servlet实例后,将调用init(ServletConfig)初始化Servlet。调用init(ServletConfig)后,容器将调用无参数的init(),之后Servlet就完成初始化。在Servlet生命周期中init()被调用一次。

2.2.3 为客户提供服务

当容器接收到对Servlet的请求时,容器根据请求中的URL找到正确的Servlet,首先创建两个对象HTTPServletRequset, HTTPServletRespnose然后创建一个新的线程,在该线程中调用service(),同时将请求对象和响应对象作为参数传递给该方法。有多少个请求,容器就会有多少个线程。接下来service()将检查HTTP请求的类型来决定调用doGet()doPost()

2.2.4 销毁和卸载Servlet

当容器决定不再需要Servlet实例时,它将在Servlet实例上调用destory(),

2.3 分析请求

2.3.3 处理HTTP请求

HTTPServlet类为每个doXxx()提供的时空实现。为实现业务逻辑,应该进行覆盖。

2.3.4 分析请求

  1. 检索请求参数

    1. public String getParameter(String name): 返回由name指定的请求参数值,如果指定的参数不存在,则返回null。若指定的参数存在,用农户没有提供值,则返回空字符串。该方法适用于参数只有一个值的情况。
    2. public String[] getParameterValues(String name): 该方法适用于参数由多个值的情况。
    3. public Enumeration getParameterNames(): 包含所有请求参数名,元素类型为String
    4. public Map getParameterMap(): 返回一个包含所有请求参数的Map对象,键的类型为String,值的类型为String。
  2. 检索客户端有关信息

    1. public String getMethod(): 返回请求使用的HTTP方法名
    2. p30

2.3.5 请求转发

为实现请求转发,需要通过请求对象的RequestDispatcher getRequestDispatcher(String path)得到RequestDispatcher对象,该对象称为请求转发器对象
参数path用来指导要转发到的资源路径。它可以是绝对路径,即以"/"开头,也可以是相对路径,即不能以"/"开头。

2.3.6 使用请求对象存储数据

请求对象也是一个作用域对象,可以在其上存储属性实现数据共享。属性名是String,属性值是一个对象。
有关属性存储的方法有四个,它们定义在ServletRequset接口中。

  1. public void setAttribute(String name, Object obj)
  2. public Object getAttribute(String name): 如果指定名称的属性不存在,返回null。使用该方法需要进行类型转换
  3. public Enumeration getAttribute(String name)
  4. public void removeAttribute(String name)

2.3.8 文件上传

通过请求对象的下面两个方法来处理上传的文件:

  1. public Part getPart(String name): 返回用name指定名称的Part对象。
  2. public Collection<Part> getParts(): 返回所有Part对象的一个集合。
    Part对象的常用方法
  3. p38

2.4 发送响应

2.4.2 输出流与内容类型

调用响应对象的getWriter()可以得到Printwriter对象,使用它可向客户端发送文本数据。调用getOutputStream()可以得到ServletOutputStream对象,使用它可向客户端发送二进制数据。

  1. public PrintWriter getWriter(): 返回一个PrintWriter对象用于向客户发送文本数据
    • `PrintWriter out = response.getWriter()`
      
  2. public ServletOutputStream getOutputStream() throws IOException: 返回输出流对象,它用来向客户端发送二进制数据
    • ServletOutputStream sos = response.getOutputStream()
  3. public void setContentType(String type)
    • response.setContentType("text/html;charset=UTF-8"), 如果不使用默认的响应时间的内容类型和字符编码,应该先调用响应的setContentType()后再调用getWriter()getOutputStream()获得输出流对象。

2.4.3 设置响应头

  1. public void setHeader(String name, String value)
  2. p42

2.4.4 响应重定向

响应重定向是通过响应对象的sendRedirect(String location)

  • 若路径以"/"开头,则相对于服务器的根目录
  • 若路径不以"/"开头,则是相对路径
    关于sendRedirect(),应该注意如果响应被提交,即响应头已经发送到浏览器,就不能调用该方法,否则会抛出异常。
// 该例子中会抛出异常
PrintWriter out = response.getWriter();
out.println("<html>...</html>");
out.flush();  //响应在这一点提交了
response.sendRedirect("http://www.cnn.com")

响应重定向与请求转发的区别
把当前请求转发到指定资源。这种转发是服务器端控制权的转移,客户端发来的请求将交由新的资源。<u>使用请求转发,可以将前一个页面的数据、状态等信息传递给转发的页面。</u>
响应重定向实际是服务器向浏览器发送一个特殊的响应头(Location,状态码302),它告诉浏览器连接到新的位置。因此使用这种方法在浏览器的地址栏可以看到地址的变化。<u>重定向是作为一个新的请求来看待的,因此,所有请求作用域的参数在重定向到下一个页面时都会失效。</u>

2.4.5 发送状态码和错误信息

p45

2.5 Web应用程序及结构(三星知识点)

2.5.3 Web应用程序的结构

Tomcat安装目录的webapps目录时所有Web应用程序的根目录。假如要建立一个名为helloweb的应用程序
|-webapps
* |-helloweb
* *|-css
* *|-html
* *|-images
* *|-...
* *|-index.html(默认欢迎界面)
* *|-WEB-INF
* * *|-classes(类文件目录)
* * * *|-com.demo.LoginServlet.class
* * * |-lib(库文件目录)
* * * *|-xx.jar
* * *|-web.xml(部署描述文件)

  1. 理解WEB-INF目录
    该目录主要存放供服务器访问的资源,并不为客户服务。
  • classes目录
  • lib目录
  • web.xml文件

2.6 部署描述文件(常考点)

2.6.2 <servlet>元素

为Web应用定义一个Servlet

<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.demo.HelloServlet</servlet-class>
</servlet>
  1. <servlet-name>是用来定义Servlet名称的,该元素是必选项(不能重名)。可以通过ServletConfig的getServletName()检索Servlet名
  2. <servlet-class>是Servlet的完整名称
  3. <init-param>向Servlet传递初始化参数。在一个<servlet>中可以定义多个<init-param>,每个<init-param>元素必须有且仅有一组<init-name><init-value>子元素。Servlet可以通过ServletConfig接口的getInitParameter()检索初始化参数。

2.6.3 <servlet-mapping>元素

定义一个映射,它指定哪个URL模式被该Servlet处理。
<servlet-name>元素应该是使用<servlet>元素定义的<servlet-name>,而<url-pattern>可以包含要与该Servlet关联的模式字符串。

<servlet-mapping>
    <servlet-name></servlet-name>
    <url-pattern></url-pattern>
</servlet-mapping>
  1. 一个请求URI又由三部分组成:上下文路径,Servlet路径,路径信息。
    1. 上下文路径:/helloweb为上下文路径
    2. Servlet路径:/helloServlet/hello为Servlet路径
    3. 路径信息:它实际上是额外的路径信息,abc.jsp
  2. <url-pattern>的三种形式
    1. 目录匹配:以"/"开头,以"/*"结尾的形式
    2. 扩展名匹配:以"*."开始,后接一个扩展名
    3. 精确匹配:/report
  3. 容器如何解析URL

2.6.4 <welcome-file-list>元素(二星知识点)

在Tomcat中,如果访问的URL是目录,并且没有特定的Servlet与这个URL模式匹配,那么它将在该目录中首先查找index.html文件,如果找不到将查找index.jsp

<welcome-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
</welcome-list>

2.8 ServletConfig接口(三星)

在Servlet初始化时,容器将调用init(ServletConfig), 并为其传递一个ServletConfig对象。
要得到ServletConfig对象有两种方式

  1. 覆盖Servlet的init
ServletConfig config = null;
public void init(ServletCongfig config) {
    super(config);  // 必须调用超类的init()
    this.config = config;
}
  1. 在Servlet中直接使用getServletConfig()获得ServletConfig对象
ServletConfig config = getServletConfig();

ServletConfig接口定义了四个方法

  1. public String getInitParameter(String name)
  2. public Enumeration getInitParameterNames()
  3. public String getServletName(): 返回<servlet-name>元素指定的Servlet名称
  4. public ServletContext getServletContext()

课后习题

p55

相关文章

网友评论

      本文标题:第二章 Servlet技术模型

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