[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接口
-
public void init(ServletConfig config)
:该方法由容器调用,完成Servlet初始化并提供服务。容器传递给该方法一个ServletConfig
类型的对象 -
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
: 对每个客户请求,容器调用一次该方法,它允许Servlet为请求提供响应(get、post...) -
public void destory()
: 该方法由容器调用,指示Servlet清除本身,释放请求的资源并准备结束服务。 -
public ServletConfig getServletConfig()
: 返回关于Servlet的配置信息,如传递给init()
的参数。 - p22
2. ServletConfig接口
它为用户提供了有关Servlet的配置信息。Servlet配置包括Servlet名称、Servlet上下文对象、Servlet初始化参数等。
getServletContext()
getInitParameter()
2.1.2 javax.servlet.http包
1. HttpServlet 类
实现针对http的Servlet,它扩展了GenericServlet类,p24
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
- 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 分析请求
-
检索请求参数
-
public String getParameter(String name)
: 返回由name指定的请求参数值,如果指定的参数不存在,则返回null。若指定的参数存在,用农户没有提供值,则返回空字符串。该方法适用于参数只有一个值的情况。 -
public String[] getParameterValues(String name)
: 该方法适用于参数由多个值的情况。 -
public Enumeration getParameterNames()
: 包含所有请求参数名,元素类型为String -
public Map getParameterMap()
: 返回一个包含所有请求参数的Map对象,键的类型为String,值的类型为String。
-
-
检索客户端有关信息
-
public String getMethod()
: 返回请求使用的HTTP方法名 - p30
-
2.3.5 请求转发
为实现请求转发,需要通过请求对象的RequestDispatcher getRequestDispatcher(String path)
得到RequestDispatcher对象,该对象称为请求转发器对象
参数path用来指导要转发到的资源路径。它可以是绝对路径,即以"/"开头,也可以是相对路径,即不能以"/"开头。
2.3.6 使用请求对象存储数据
请求对象也是一个作用域对象,可以在其上存储属性实现数据共享。属性名是String,属性值是一个对象。
有关属性存储的方法有四个,它们定义在ServletRequset接口中。
public void setAttribute(String name, Object obj)
-
public Object getAttribute(String name)
: 如果指定名称的属性不存在,返回null。使用该方法需要进行类型转换。 public Enumeration getAttribute(String name)
public void removeAttribute(String name)
2.3.8 文件上传
通过请求对象的下面两个方法来处理上传的文件:
-
public Part getPart(String name)
: 返回用name指定名称的Part对象。 -
public Collection<Part> getParts()
: 返回所有Part对象的一个集合。
Part对象的常用方法 - p38
2.4 发送响应
2.4.2 输出流与内容类型
调用响应对象的getWriter()
可以得到Printwriter对象,使用它可向客户端发送文本数据。调用getOutputStream()
可以得到ServletOutputStream对象,使用它可向客户端发送二进制数据。
-
public PrintWriter getWriter()
: 返回一个PrintWriter对象用于向客户发送文本数据`PrintWriter out = response.getWriter()`
-
public ServletOutputStream getOutputStream() throws IOException
: 返回输出流对象,它用来向客户端发送二进制数据ServletOutputStream sos = response.getOutputStream()
-
public void setContentType(String type)
-
response.setContentType("text/html;charset=UTF-8")
, 如果不使用默认的响应时间的内容类型和字符编码,应该先调用响应的setContentType()
后再调用getWriter()
或getOutputStream()
获得输出流对象。
-
2.4.3 设置响应头
public void setHeader(String name, String value)
- 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(部署描述文件)
- 理解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>
-
<servlet-name>
是用来定义Servlet名称的,该元素是必选项(不能重名)。可以通过ServletConfig的getServletName()
检索Servlet名 -
<servlet-class>
是Servlet的完整名称 -
<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>
- 一个请求URI又由三部分组成:上下文路径,Servlet路径,路径信息。
- 上下文路径:/helloweb为上下文路径
- Servlet路径:/helloServlet/hello为Servlet路径
- 路径信息:它实际上是额外的路径信息,abc.jsp
-
<url-pattern>
的三种形式- 目录匹配:以"/"开头,以"/*"结尾的形式
- 扩展名匹配:以"*."开始,后接一个扩展名
- 精确匹配:/report
- 容器如何解析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对象有两种方式
- 覆盖Servlet的init
ServletConfig config = null;
public void init(ServletCongfig config) {
super(config); // 必须调用超类的init()
this.config = config;
}
- 在Servlet中直接使用
getServletConfig()
获得ServletConfig对象
ServletConfig config = getServletConfig();
ServletConfig接口定义了四个方法
public String getInitParameter(String name)
public Enumeration getInitParameterNames()
-
public String getServletName()
: 返回<servlet-name>
元素指定的Servlet名称 public ServletContext getServletContext()
课后习题
p55
网友评论