Servlet 指南
# Servlet 指南
# 一、JavaWeb 简介
# 1.1. Web 应用程序
Web
,在英语中 web
即表示网页的意思,它用于表示 Internet
主机上供外界访问的资源。
Web
应用程序是一种可以通过 Web
访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。
Internet
上供外界访问的 Web
资源分为:
- 静态
web
资源:指web
页面中供人们浏览的数据始终是不变。常见静态资源文件:html
、css
、各种图片类型(jpg、png) - 动态
web
资源:指web
页面中供人们浏览的数据是由程序产生的,不同时间点访问web
页面看到的内容各不相同。常见动态资源技术:JSP/Servlet
、ASP
、PHP
# 1.2. 常见 Web 服务器
- Tomcat (opens new window)
- Jetty (opens new window)
- Resin (opens new window)
- Apache (opens new window)
- Nginx (opens new window)
- WebSphere (opens new window)
- WebLogic (opens new window)
- JBoss (opens new window)
# 二、Servlet 简介
# 2.1 什么是Servlet
Servlet(Server Applet)
,Servlet
是运行在服务器端的组件,能够给客户端返回动态页面,即小服务程序或服务连接器。Servlet
是 Java
编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态 Web
内容。
一个servlet应该继承HttpServlet
,重写doGet
和doPost
等方法;可以使用 @WebServlet
来注解来标识urlmapping
等信息。
多个客户端访问同一个Servlet时,不再创建新的对象,而是共用同一个Servlet对象。可以说,Servlet是多线程单实例的。
- 狭义的
Servlet
是指Java
实现的一个接口。 - 广义的
Servlet
是指任何实现了这个Servlet
接口的类。
Servlet
运行于支持 Java
的应用服务器中。从原理上讲,Servlet
可以响应任何类型的请求,但绝大多数情况下Servlet
只用来扩展基于 HTTP
协议的Web
服务器。
# 2.2 Servlet 任务
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
# 2.3 Servlet 生命周期
- 加载 - 第一个到达服务器的
HTTP
请求被委派到Servlet
容器。容器通过类加载器使用Servlet
类对应的文件加载servlet
,将类加载到JVM中.; - 初始化 -
Servlet
通过调用init ()
方法进行初始化,只会在第一次访问的时候初始化一次。 - 服务 -
Servlet
调用service()
方法来处理客户端的请求,请求一次就执行一次。 - 销毁 -
Servlet
通过调用destroy()
方法终止(结束),重新启动或者停止Tomcat
时Servlet
销毁。 - 卸载 -
Servlet
是由JVM
的垃圾回收器进行垃圾回收的。
- 类加载和构造
- 初始化
- 服务
- 销毁
# 三、 注解:@WebServlet:
从Servlet3.0
开始,配置Servlet
支持注解方式,但还是保留了配置web.xml
方式,使用Servlet
有两种方式:
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定Servlet 的 name 属性,等价于 <servlet-name> 。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。 |
value | String[] | 该属性等价于 urlPatterns 属性。两个属性不能同时使用。 |
urlPatterns | String[] | 指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern> 标签。 |
loadOnStartup | int | 指定 Servlet 的加载顺序,等价于 <load-on-startup> 标签。 |
initParams | WebInitParam[] | 指定一组 Servlet 初始化参数,等价于<init-param> 标签。 |
asyncSupported | boolean | 声明 Servlet 是否支持异步操作模式,等价于<async-supported> 标签。 |
description | String | 该 Servlet 的描述信息,等价于 <description> 标签。 |
displayName | String | 该 Servlet 的显示名,通常配合工具使用,等价于 <display-name> 标签。 |
WebServlet中的重要属性详解:
loadOnStartup
属性:标记容器是否在启动应用时就加载Servlet
,默认不配置或数值为负数时表示客户端第一次请求Servlet时再加载;0
或正数表示启动应用就加载,正数情况下,数值越小,加载该Servlet的优先级越高;默认值为-1
.
// loadOnStartup = 0 0或正数表示启动应用就加载,正数情况下,数值越小,加载该Servlet的优先级越高;默认值为-1.
// urlPatterns/value属性: String[]类型,可以配置多个映射,urlPatterns/value是一样的,用哪个都可以。
@WebServlet(urlPatterns = "/news",loadOnStartup = 0)
2
3
4
urlPatterns/value属性
: String[]
类型,可以配置多个映射。urlPatterns/value
是一样的,用哪个都可以,请求地址就是实际访问的Servlet
地址。
urlPatterns
的规则:
/*:拦截所有
*.do:拦截指定后缀,例如a.do,index.do
/index/test 或者 /UserServlet:拦截路径
/*.do是非法的,启动会报错
2
3
4
5
6
7
WebServlet
源码:
package javax.servlet.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";
String[] value() default {};
String[] urlPatterns() default {};
int loadOnStartup() default -1;
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 四、Servlet API
# 4.1 HttpServletRequest
HttpServletRequest
:负责处理请求,在servlet
中使用:
HttpServletRequest
的常见方法:
request.getParameter("newstitle")
获取传递的参数的值,返回值是一个String类型.request.getParameterValues("cks")
获取传递的参数的值,返回值是一个String[]类型.request.setCharacterEncoding("utf-8")
和请求页面的编码要一致;request.getRemoteAddr()
得到客户端请求的ip地址String contextPath = request.getContextPath()
请求的上下文 /newsSysrequest.getRequestDispatcher("index.jsp").forward(request, response)
页面的转发