Servlet 指南

一、JavaWeb 简介

1.1. Web 应用程序

Web,在英语中 web 即表示网页的意思,它用于表示 Internet 主机上供外界访问的资源。

Web 应用程序是一种可以通过 Web 访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。

Internet 上供外界访问的 Web 资源分为:

  • 静态 web 资源:指web 页面中供人们浏览的数据始终是不变。常见静态资源文件:htmlcss、各种图片类型(jpg、png)
  • 动态 web 资源:指 web 页面中供人们浏览的数据是由程序产生的,不同时间点访问 web 页面看到的内容各不相同。常见动态资源技术:JSP/ServletASPPHP

1.2. 常见 Web 服务器

二、Servlet 简介

2.1 什么是Servlet

Servlet(Server Applet)Servlet是运行在服务器端的组件,能够给客户端返回动态页面,即小服务程序或服务连接器。Servlet Java 编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态 Web 内容。

一个servlet应该继承HttpServlet,重写doGetdoPost等方法;可以使用 @WebServlet来注解来标识urlmapping等信息。

多个客户端访问同一个Servlet时,不再创建新的对象,而是共用同一个Servlet对象。可以说,<font color = "red">Servlet是多线程单实例的</font>。

  • 狭义的 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 生命周期

  1. 加载 - 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。容器通过类加载器使用 Servlet 类对应的文件加载 servlet,将类加载到JVM中.;
  2. 初始化 - Servlet 通过调用 init () 方法进行初始化,只会在第一次访问的时候初始化一次。
  3. 服务 - Servlet 调用 service() 方法来处理客户端的请求,请求一次就执行一次。
  4. 销毁 - Servlet 通过调用 destroy() 方法终止(结束),重新启动或者停止TomcatServlet销毁。
  5. 卸载 - Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

  • 类加载和构造
  • 初始化
  • 服务
  • 销毁

三、 注解:@WebServlet:

Servlet3.0开始,配置Servlet支持注解方式,但还是保留了配置web.xml方式,使用Servlet有两种方式:

属性名类型描述
nameString指定Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
valueString[]该属性等价于 urlPatterns 属性。两个属性不能同时使用。
urlPatternsString[]指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern>标签。
loadOnStartupint指定 Servlet 的加载顺序,等价于 <load-on-startup>标签。
initParamsWebInitParam[]指定一组 Servlet 初始化参数,等价于<init-param>标签。
asyncSupportedboolean声明 Servlet 是否支持异步操作模式,等价于<async-supported> 标签。
descriptionString该 Servlet 的描述信息,等价于 <description>标签。
displayNameString该 Servlet 的显示名,通常配合工具使用,等价于 <display-name>标签。

<h3 style="color: red;">WebServlet中的重要属性详解:</h3>

loadOnStartup属性:标记容器是否在启动应用时就加载Servlet,默认不配置或数值为负数时表示客户端第一次请求Servlet时再加载;0或正数表示启动应用就加载,正数情况下,数值越小,加载该Servlet的优先级越高;默认值为-1.

// loadOnStartup = 0 0或正数表示启动应用就加载,正数情况下,数值越小,加载该Servlet的优先级越高;默认值为-1.
// urlPatterns/value属性: String[]类型,可以配置多个映射,urlPatterns/value是一样的,用哪个都可以。

@WebServlet(urlPatterns = "/news",loadOnStartup = 0)

urlPatterns/value属性String[]类型,可以配置多个映射。urlPatterns/value是一样的,用哪个都可以,请求地址就是实际访问的Servlet地址。

urlPatterns的规则:

/*:拦截所有

*.do:拦截指定后缀,例如a.do,index.do

/index/test 或者 /UserServlet:拦截路径

/*.do是非法的,启动会报错

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 "";
}

四、Servlet API

4.1 HttpServletRequest

HttpServletRequest:负责处理请求,在servlet中使用:

<font color = "red"> HttpServletRequest的常见方法:</font>

  • request.getParameter("newstitle") 获取传递的参数的值,返回值是一个String类型.
  • request.getParameterValues("cks") 获取传递的参数的值,返回值是一个String[]类型.
  • request.setCharacterEncoding("utf-8") 和请求页面的编码要一致;
  • request.getRemoteAddr() 得到客户端请求的ip地址
  • String contextPath = request.getContextPath() 请求的上下文 /newsSys
  • request.getRequestDispatcher("index.jsp").forward(request, response) 页面的转发

4.2 HttpServletResponse

4.3 HttpSession

4.4 ServletContext

最后修改:2021 年 07 月 28 日 04 : 02 PM
如果觉得我的文章对你有用,请随意赞赏