注意点
需要在web.xml中(或使用注释)进行描述
主要功能
(1)创建并返回包含客户请求的动态内容的完整HTML页面
(2)创建可嵌入到现有HTML页面的HTML片段
(3)与其他服务器资源进行通信
(4)接受多个客户机的输入,传递结果
生命周期
在服务器加载时便已经存在Servlet,进行init()初始化和service()服务(可调用多次)。
(1)web容器加载Servlet类
(2)创建Servlet对象实例
(3)Servlet初始化。
(4)容器生成请求和响应对象(两个对象)
(5)调用service方法提供服务
1.HttpServlet.service();
2.HttpServletResponse对象生成HTTP
(6)注销Servlet,调用HttpServlet.destroy()方法关闭所有资源
接口
Servlet接口
javax.servlet.Servlet是所有Java Servlet的基础接口,是封装了建立接收请求和产生响应功能的组件(即Servlet)。
HttpServlet类
HttpServlet类定义在javax.servlet.http包内,是针对使用HTTP协议的Web服务器的Servlet类。
ServletConfig接口
ServletConfig接口存放在javax.servlet包内,它是一个由Servlet容器使用的Servlet配置对象,用于在Servlet初始化时向它传递信息。
HttpServletRequest接口
HttpServletRequest接口定义在javax.servlet.http包内,代表客户端请求。
HttpServletResponse接口
定义在javax.servlet.http包内,代表对客户端的HTTP响应。
Servlet的编写与部署
创建Servlet类
package com.myservlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(description = "infoProcess", urlPatterns = { "/info" })
public class ProcessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String name=request.getParameter("name");
String age=request.getParameter("age");
}
}
这里采用注解的方式配置Servlet:@WebServlet(description = "infoProcess", urlPatterns = { "/info" })
目录结构
使用部署描述文件(DD)在web.xml中配置Servlet:
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>InfoServlet</servlet-name>
<servlet-class>firstPrj.InfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>InfoServlet</servlet-name>
<url-pattern>/servlet/info</url-pattern>
</servlet-mapping>
如果要对一个JSP页面文件进行配置,则可通过下面的代码进行指定
<servlet>
<description>Simple Servlet</description>
<display-name>Servlet</display-name>
<servlet-name>Login</servlet-name>
<jsp-file>login.jsp</jsp-file>
</servlet>
配置Servlet初始化参数
<servlet>
<servlet-name>InfoServlet</servlet-name>
<servlet-class>firstPrj.InfoServlet</servlet-class>
<init-param>
<param-name>number</param-name>
<param-value>1000</param-value>
</init-param>
</servlet>
在Servlet中可以在init方法中通过getInitParameter()方法访问这些参数:
public void init() throws ServletException {
String n=this.getInitParameter("number");
}
启动加载优先权
通过
<servlet>
<servlet-name>ServletONE</servlet-name>
<servlet-class>com.ServletONE</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet>
<servlet-name>ServletTWO</servlet-name>
<servlet-class>com.ServletTWO</servlet-class>
<load-on-startup>20</load-on-startup>
</servlet>
<servlet>
<servlet-name>ServletTHREE</servlet-name>
<servlet-class>com.ServletTHREE</servlet-class>
<load-on-startup>AnyTime</load-on-startup>
</servlet>
在这段代码中,ServletONE类先被载入,ServletTWO类则后被载入,而ServletTHREE类可在任何时间内被载入。负数看作0。
Servlet的映射
在web.xml配置文件中可以给一个Servlet做多个映射,因此,可以通过不同的方法访问这个Servlet
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/One</url-pattern>
</servlet-mapping>
通过上述代码的配置,若请求的路径中包含“/One”,则会访问逻辑名为“OneServlet”的Servlet。
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/Two/*</url-pattern>
</servlet-mapping>
通过上述配置,若请求的路径中包含“/Two/a”或“/Two/b”等符合“/Two/*”的模式,则同样会访问逻辑名为“OneServlet”的Servlet。
采用注解配置Servlet
采用注解配置Servlet的基本语法如下。
import javax.servlet.annotation.WebServlet;
@WebServlet(urlPatterns = {"/映射地址"},
asyncSupported = true|false,
loadOnStartup = -1,
name = "Servlet名称",
displayName = "显示名称",
initParams = {@WebInitParam(name = "username", value = "值")}
)
在上面的语法中,urlPatterns属性用于指定映射地址;asyncSupported属性用于指定是否支持异步操作模式;loadOnStartup属性用于指定Servlet的加载顺序;name属性用于指定 Servlet 的name属性;displayName属性用于指定该Servlet的显示名;initParams属性用于指定一组 Servlet 初始化参数。
MVC设计模式
Q.E.D.