Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
创建一个Servlet
创建一个类,继承
HttpServlet
接口public class MyServlet implements HttpServlet{}
在
web.xml
文件中配置Servlet
<!-- 配置和映射 Servlet --> <servlet> <!-- 注册的 Servlet 名字 --> <servlet-name>MyServlet</servlet-name> <!-- Servlet 的全类名 --> <servlet-class>com.javaweb.MyServlet</servlet-class> </servlet>
Servlet
默认在第一次请求调用时被创建,但可以在配置Servlet
时通过load-on-startup
指定Servlet
被创建的时机。若为负数或未指定, 则在第一次请求时被创建。若为 0 或正数, 则在当前 WEB 应用被Serlvet
容器加载时创建实例, 且数值越小越早被创建(代表的是优先级,而非启动延迟时间)。<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.javaweb.MyServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet>
在
web.xml
中映射Servlet
<servlet-mapping> <!-- 配置的Servlet名 --> <servlet-name>MyServlet</servlet-name> <!-- 映射的访问路径: / 代表当前 WEB 应用的根目录 --> <url-pattern>/myServlet</url-pattern> </servlet-mapping>
同一个
Servlet
可以绑定到多个URL上,可通过多个映射绑定同一个Servlet
,或者在映射中使用*
通配符。使用*
通配符时,只有两种固定的格式:一种是.扩展名
,另一种是以/
开头并以/*
结尾。通配符匹配原则- 相似度越高,匹配度越高
*.后缀名
的优先级最低
配置
Servlet
也可以通过注解的方式@WebServlet(description = "MyServlet", urlPatterns = { "/*" }) public class MyServlet implements HttpServlet{}
例如
com.javaweb.MyServlet.java
package com.javaweb; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet { public MyServlet() { super(); System.out.println("myservlet create..."); } public void init() { System.out.println("init..."); } public void service(HttpServletRequest request, HttpServletResponse response) { System.out.println("service..."); } public void destroy() { System.out.println("destroy..."); } }
web.xml
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.javaweb.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
Servlet生命周期
构造器方法
第一次请求
Servlet
时调用init()
创建好实例后立即被调用
serivice()
每次请求都会调用 service 方法. 实际用于响应请求
destroy()
当前 Servlet 所在的 WEB 应用被卸载前调用。用于释放当前 Servlet 所占用的资源.
由JVM的垃圾回收器回收
上面的例子在控制台的输出过程为:
myservlet create...
init...
service...
destroy...
初始化参数
在配置Servlet
时可以设置一些初始化参数,例如:
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
<!-- 参数值 -->
<param-value>username</param-value>
</init-param>
在Servlet
中可以通过ServletConfig
的两个方法获取到初始化参数
getInitParameter(String name)
:获取指定参数名的初始化参数getInitParameterNames()
:获取参数名组成的Enumeration
对象
例如:
ServletConfig servletConfig = this.getServletConfig();
String user = servletConfig.getInitParameter("user");
System.out.println("user : " + user);
Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = servletConfig.getInitParameter(name);
System.out.println(name + " : " + value);
}
Servlet内置缺省对象
Servlet
中有两个重要的对象:ServletConfig
和ServletContext
。ServletContext
是Servlet
的上下文,代表当前web应用,ServletConfig
封装了Serlvet
的配置信息,并且可以获取ServletContext
对象。
String user = servletConfig.getInitParameter("user");
ServletContext
对象的作用:
获取当前Web应用的初始化参数
ServletConfig servletConfig = this.getServletConfig(); ServletContext context = this.getServletContext();
获取当前 WEB 应用的某一个文件在服务器上的绝对路径
String realPath = servletContext.getRealPath("/note.txt");
获取当前 WEB 应用的名称
String contextPath = servletContext.getContextPath();
获取当前 WEB 应用的某一个文件对应的输入流
InputStream is = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
设置和获取属性
servletContext.setAttribute("id","123"); String id = servletContext.getAttribute("id");
Servlet中获取请求和响应信息
Servlet
中的service()
方法用于应答请求,该方法接收两个参数,分别是该请求的request
和response
。
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
request参数
封装了请求的信息,从中可以获取到任何的请求信息
与请求参数相关的方法 | 描述 |
---|---|
String getParameter(String name) | 根据请求参数的名字, 返回参数值。 若请求参数有多个值,只能获取到第一个提交的值 |
String[] getParameterValues(String name) | 根据请求参数的名字,返回请求参数对应的字符串数组 |
Enumeration getParameterNames() | 返回参数名对应的Enumeration 对象 |
Map getParameterMap() | 返回请求参数的键值对:<String key, String[] value> |
其他方法 | 描述 |
---|---|
String getRequestURI() | 获取请求的URI路径 |
String getMethod() | 获取请求的方法 |
tring getQueryString() | 获取请求的字符串 |
String getServletPath() | 获取Servlet 的映射路径 |
response参数
方法 | 描述 |
---|---|
PrintWriter getWriter() | 返回PrintWriter 对象,调用该对象的print 方法,将把print 中的参数直接打印到浏览器上 |
void setContentType(String contentType) | 设置响应的内容类型 |
void sendRedirect(String location) | 请求重定向,重定向的/ 根路径为域名下的根路径 |