Servlet技术

Servlet是用Java语言编写应用到Web服务器端的扩展技术,它先于JSP产生,可以方便的对Web应用中的HTTP请求进行处理。在Java Web程序开发中,Servlet主要用于处理各种业务逻辑,它比JSP更具有业务逻辑层的意义,而且Servlet的安全性、扩展性以及性能方面十分优秀,它在Java Web程序开发及MVC模式的应用方面起到了极其重要的作用。

1、Servlet基础

Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写,具有Java语言的优点。与Java程序的区别是,Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持,在Java Web应用方面,Servlet的应用占用十分重要的地位,它在Web请求的处理功能方面也非常强大。

1.1 Servlet结构体系

Servlet实际上就是按Servlet规范编写的Java类,但它可以处理Web应用中的相关请求。Servlet是一个标准,它由Sum公司(已被甲骨文公司收购)定义,其具体细节由Servlet容器进行实现,如Tomcat、JBoss等。在J2EE架构中,Servlet结构体系的UML图如下:

Servlet对象、ServletConfig对象与 Serializable对象是接口对象,其中Serializable是 java.io 包中的序列号接口,Servlet对象和ServletConfig对象是 javax.servlet 包中定义的对象,这两个对象定义了Servlet的基本方法以及封装了Servlet的相关配置信息。GenericServlet对象是一个抽象类,它分别实现了上述3个接口,该对象为Servlet接口及ServletConfig接口提供了部分实现,但它并没有对HTTP请求处理进行实现,这一操作由它的子类HttpServlet进行实现。这个对象为HTTP请求中POST、GET等类型提供了具体的操作方法,所以通常情况下,我们所编写的Servlet对象都是继承于HttpServlet,在开发中,所使用的具体的Servlet对象就是HttpServlet对象,原因是HttpServlet是Servlet的实现类,并提供了HTTP请求的处理方法。

1.2 Servlet与JSP的区别

Servlet是使用Java Servlet接口(API)运行在Web应用服务器上Java程序,其功能十分强大,它不但可以处理HTTP请求中的业务逻辑,而且还可以输出HTML代码来显示指定页面。而JSP是一种在Servlet规范之上的动态网页技术,在JSP页面之中,同样可以编写业务逻辑处理HTTP请求,也可以通过HTML代码来编辑页面,在实现功能上,Servlet与JSP貌似相同,实质存在一定的区别,表现在以下方面:

 角色不同

JSP页面可以存在HTML代码与Java代码并存的情况,而Servlet需要承担客户请求与业务处理的中间角色,只有调用固定的方法才能将动态内容输出为静态的HTML,所以,JSP更具有显示层的角色。

编程方法不同

Servlet与JSP在编程方法上存在很大的区别,使用Servlet开发Web应用程序需要遵循Java的标准,而JSP需要遵循一定的脚本语言规范。在Servlet代码中,需要调用Servlet提供的相关API接口方法,才可以对HTTP请求及业务进行处理,对于业务逻辑方面的处理功能更加强大。然而在JSP页面中,通过HTML代码与JSP内置对象实现对HTTP请求及页面的处理,其显示界面的功能更加强大。

Servlet需要编译后运行

Servlet需要在Java编译器编译后才可以运行,如果Servlet在编写完成或修改后没有被重新编译,则不能运行在Web容器中。而JSP则与之相反,JSP由JSP Container对其进行管理,它的编辑过程也由JSP Container对JSP进行自动编辑,所以,无论JSP文件被创建还是修改,都不需要对其编译即可执行。

速度不同

由于JSP页面有JSP Container对其进行管理,在每次执行不同内容的动态JSP页面时,JSP Container都要对其自动编译,所以,它的效率低于Servlet的执行效率。而Servlet在编译完成之后,则不需要再次编译,可以直接获取及输出动态内容。在JSP页面中的内容变化的情况下,JSP页面的编译完成之后,JSP Container不会再次对JSP进行编译。

说明:在JSP产生之前,无论是页面设计还是业务逻辑代码都需要编写于Servlet中。虽然Servlet在功能方面很强大,完全可以满足对Web应用的开发需求,但如果每一句HTML代码都由Servlet的固定方法来输出,则操作过于复杂。而且在页面中,往往还需要用到CSS样式代码、JS脚本代码等,对于程序开发人员而言,其代码量将不断增加,所以操作十分烦琐。针对这一问题,Sun提出了JSP(Java Server Page)技术,可以将HTML、CSS、JS等相关代码直接写入到JSP页面中,从而简化了程序员对Web程序的开发。

1.3 Servlet代码结构

在Java中,通常所说的Servlet是指HttpServlet对象,在声明一个对象为Servlet时,需要继承HttpServlet类。HttpServlet类是Servlet接口的一个实现类,继承此类后,可以重写HttpServlet类中的方法对HTTP请求进行处理。

示例:创建一个名称为TestServlet的Servlet。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	// 初始化方法
	public void init() throws ServletException
	{
	}

	// 处理HTTP Get请求
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
	}

	// 处理HTTP Post请求
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
	}

	// 处理HTTP Put请求
	public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
	}

	// 处理HTTP Delete请求
	public void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{

	}

	// 销毁方法
	public void destroy()
	{
		super.destroy();
	}
}

上述代码显示了一个Servlet对象的代码结构,TestServlet类通过继承HttpServlet类被声明为一个Servlet对象。该类中包含6个方法,其中init()方法与destroy()方法为Servlet初始化与生命周期结束所调用的方法,其余的4个方法为Servlet针对处理不同的HTTP请求类型所提供的方法,其作用如注释中所示。

在一个Servlet对象中,最常用的方法是doGet()与doPost()方法,这两个方法分别用于处理HTTP的Get和Post请求。例如,<form>表单对象所声明的method属性为post,提交到Servlet对象处理时,Servlet将调用doPost()方法进行处理。

 

2、Servlet API编程常用接口和类

Servlet是运行在服务器端的Java应用程序,由Servlet容器对其进行管理,当用户对容器发送HTTP请求时,容器将通知相应的Servlet对象进行处理,完成用户与程序之间的交互。在Servlet编程中,Servlet API提供了标准的接口与类,这些对象对Servlet的操作非常重要,它们为HTTP请求与程序回应提供了丰富的方法。

2.1 Servlet接口

Servlet的运行需要Servlet容器的支持,Servlet容器通过调用Servlet对象提供了标准的API接口,对请求进行处理。在Servlet开发中,任何一个Servlet对象都要直接或间接地实现 javax.servlet.Servlet接口。在该接口中包含5个方法,其功能及作用如下表:

方法说明
public void init(ServletConfig config)Servlet实例化后,Servlet容器调用该方法来完成初始化工作。
public void service(ServletRequest req, ServletResponse res)用于处理客户端的请求。
public void destroy()当Servlet对象从Servlet容器中移除时,容器调用该方法,以便释放资源。
public ServletConfig getServletConfig()用于获取Servlet对象的配置信息,返回ServletConfig对象。
public String getServletInfo()返回有关Servlet的信息,它是纯文本格式的字符串,如作者、版本等。

2.2 ServletConfig接口

ServletConfig接口位于 javax.servlet包中,它封装了Servlet的配置信息,在Servlet初始化期间被传递。每一个Servlet都有且只有一个ServletConfig对象。该对象定义了4个方法,如下表:

方法说明
public String getInitParameter(String name)返回String类型名称为name的初始化参数值。
public Enumeration<String> getInitParameterNames()获取所有初始化参数名的枚举集合。
public ServletContext getServletContext()用于获取Servlet上下文对象。
public String getServletName()返回Servlet对象的实例名。

 

2.3 HttpServletRequest接口

HttpServletRequest接口位于 javax.servlet.http 包中,继承了 javax.servlet.ServletRequest 接口,是Servlet中的重要对象,在开发过程中较为常用。

HttpServletRequest接口的常用方法:

方法说明
public String getContextPath()返回请求的上下文路径,此路径以“/”开头。
public String getHeader(String name)返回指定的作为字符串请求消息头的值。
public Enumeration<String> getHeaders(String name)

以一个字符串对象集合的形式,返回包含指定请求消息头的所有值。

public Enumeration<String> getHeaderNames()返回所有的本请求消息包含的头名字的集合。
public Cookie[] getCookies()返回请求中发送的所有cookie对象,返回值为cookie数组。
public String getMethod()返回请求所使用的HTTP类型,如 get、post等。
public String getQueryString()返回请求中参数的字符串形式,如请求MyServlet?username=mr,则返回username=mr。
public String getRequestURI()返回主机名到请求参数之间的字符串形式。
public StringBuffer getRequestURL()返回请求的URL,此URL中不包含请求的参数。注意此方法返回的数据类型为StringBuffer。
public String getServletPath()返回请求URL中的Servlet路径的字符串,不包含请求中的参数信息。
public HttpSession getSession()返回与请求关联的 HttpSession 对象。
public HttpSession getSession(boolean create)返回有关本请求的当前HttpSession,或者若该请求没有会话,且“创建”属性为真,则就创建一个。
public Part getPart(String name)获取请求中上传的文件,name参数表示请求的表单的name文件。
public Collection<Part> getParts()获取请求中上传的所有文件。

HttpServletRequest接口它继承了 javax.servlet.ServletRequest 接口。

ServletRequest 接口的常用方法:

方法说明
public Object getAttribute(String name)返回具有给动名字的 servlet container 的属性,或者当没有具有所给名字的属性时,返回一个空值。
public Enumeration<String> getAttributeNames()返回一个包含servlet context中属性名字变量的集合。
public String getCharacterEncoding()返回用在请求信息的body编码的字符的名称。
public void setCharacterEncoding(String env)覆盖此请求正文中使用的字符编码的名称。
public int getContentLength()返回请求体的用字节表示的长度,并被输入流改变为有效。如果长度未知,就返回-1。
public long getContentLengthLong()返回请求正文的长度(以字节为单位),并使其可用输入流,如果长度未知,则返回-1。 对于HTTP servlet,与CGI变量CONTENT_LENGTH的值相同。
public String getContentType()返回请求体的 MIME类型,当长度未知是就返回一个空值。
public ServletInputStream getInputStream()用一个 ServletInputStream重新得到二进制的请求消息体。
public String getParameter(String name)返回一个请求参数的字符串值。若该参数不存在,则返回一个空值。
public Enumeration<String> getParameterNames()返回一个包含了请求中的参数名字的字符串对象的枚举变量。
public String[] getParameterValues(String name)返回一个包含所有的给定请求参数的值的字符串对象的向量。若该参数不存在,则返回一个空值。
public Map<String, String[]> getParameterMap()返回此请求的参数的java.util.Map。 请求参数是随请求一起发送的额外信息。 对于HTTP servlet,参数包含在查询字符串或发布的表单中数据。
public String getProtocol()以 protocol/majorVersion.minorVersion, 的格式返回请求所用协议的名称和版本。例如HTTP/1.1。
public String getScheme()返回用以作出请求消息的方案的名称,如 http, https, 或ftp等.
public String getServerName()返回收到请求的服务器主机的名字。
public int getServerPort()返回收到请求的端口号。
public BufferedReader getReader()用一个 BufferedReader重新得到字符串数据的请求消息体。
public String getRemoteAddr()返回客户端发送请求的IP地址。
public String getRemoteHost()返回发送请求的客户端的完全合格的名称;或者如果客户端的名字没有确定则返回其IP地址。

public void setAttribute(String name, Object o)

存储一个请求消息中的属性。

public void removeAttribute(String name)

从请求消息中删除一个属性。
public Locale getLocale()返回 基于Accept-Language 的头部的客户端将接收内容的首选的场所。
public Enumeration<Locale> getLocales()返回一个地址对象的枚举变量,它以开始的首选地址的降序排列指明了基于 Accept-Language header 的客户端可接受的地点。
public boolean isSecure()返回一个布尔值以指明是否这个请求使用了一个安全信道,如HTTPS。
public RequestDispatcher getRequestDispatcher(String path)返回一个作为位于给定路径的资源资源的封装器的 RequestDispatcher 对象。
public int getRemotePort()返回客户端的Internet协议(IP)源端口或发送请求的最后一个代理。
public String getLocalName()返回接收请求的Internet协议(IP)接口的主机名。
public String getLocalAddr()返回接收请求的接口的Internet协议(IP)地址。
public int getLocalPort()返回接收请求的接口的Internet协议(IP)端口号。
public ServletContext getServletContext()获取上次调度此ServletRequest的servlet上下文
public AsyncContext startAsync()将此请求置于异步模式,并使用原始(未包装的)ServletRequest和ServletResponse对象初始化其AsyncContext。
public AsyncContext startAsync(ServletRequest servletRequest,
            ServletResponse servletResponse)
将此请求置于异步模式,并使用给定的请求和响应对象初始化其AsyncContext。
public boolean isAsyncStarted()检查此请求是否已进入异步模式。
public boolean isAsyncSupported()检查此请求是否支持异步操作。
public AsyncContext getAsyncContext()获取最近调用此请求的startAsync()或startAsync(ServletRequest,ServletResponse)创建或重新初始化的AsyncContext。
public DispatcherType getDispatcherType()获取此请求的调度程序类型。

 

2.4 HttpServletResponse接口

HttpServletResponse接口位于 javax.servlet.http 包中,它继承了 javax.servlet.ServletResponse接口,同样是一个非常重要的对象。

HttpServletResponse接口的常用方法:

方法说明
public void addCookie(Cookie cookie)向客户端写入 cookie 信息。
public void addHeader(String name, String value)给定的名字和和数值加到响应的头部。
public void setHeader(String name, String value)设置带有给定的名字和数值的响应消息头。
public void addDateHeader(String name, long date)把给定的名字和日期值加入到响应的头部 。
public void setDateHeader(String name, long date)设置带有给定的名字和数值的响应消息头。
public void addIntHeader(String name, int value)将给定的名字和整数值加到一个相应的头部。
public void setIntHeader(String name, int value)设置带有给定的名字和整数值的响应消息头。
public boolean containsHeader(String name)返回一个布尔值以反映是否指定的响应消息头部已被设置过了。
public void sendError(int sc)发送一个错误状态码为sc的错误响应到客户端。
public void sendError(int sc, String msg)

发送一个包含错误状态码及错误信息的响应到客户端,参数sc为错误状态码,参数msg为错误信息。

public void sendRedirect(String location)使用客户端重定向到新的URL,参数location为新的地址。
public String encodeRedirectURL(String url)为在 sendRedirect 方法中使用的指定的URL进行编码。或者,如果编码是没有必要的,就返回没有改变的URL。
public String encodeURL(String url)通过调用URL中的会话ID对指定的URL进行编码,或者如果编码时不必要的就返回“URL不变”。

HttpServletResponse接口它继承 javax.servlet.ServletResponse接口。

ServletResponse接口的常用方法:

方法说明
public PrintWriter getWriter()返回能够向一个客户机发送字符的 PrintWriter 对象。
public ServletOutputStream getOutputStream()返回一个适用于在响应消息中写入二进制数据的 ServletOutputStream。
public void flushBuffer()强制将buffer中的任何内容写入客户端。
public int getBufferSize()返回实际用于响应消息的buffer的大小。
public String getCharacterEncoding()返回用于在这个响应消息中被发送的 MIME body的charset的名称。
public Locale getLocale()

返回分配给响应消息的场所。 

public boolean isCommitted()返回一个布尔值,以指明是否响应消息已被执行。
public void reset()清除所有存在于buffer和状态码以及头的数据。
public void setBufferSize(int size)

为响应消息体设置合适的 buffer的大小。 

public void setContentLength(int len)设置响应中的内容长度。在HTTP servlet 中,这个方法就是设置HTTP Content-Length header。
public void setContentType(String type)设置正被发往客户端的响应的内容类型。
public void setLocale(Locale loc)设置响应消息的地址。适当地设置消息的头(包括 Content-Type的字符设置)。

 

2.5 GenericServlet类

在编写一个Servlet对象时,必须实现 javax.servlet.Servlet 接口,但在Servlet接口中包含5个方法,也就是说创建一个Servlet对象要实现这5个方法,这样操作非常不方便。javax.servlet.GenericServlet 类简化了此操作,实现了Servlet接口。

public abstract class GenericServlet implements Servlet, ServletConfig,java.io.Serializable

GenericServlet类是一个抽象类,分别实现了 Servlet接口、ServletConfig接口和 java.io.Serializable接口。该类实现了除service()之外的其他方法,在创建Servlet对象时,可以继承GenericServlet类来简化程序中的代码,但需要实现service()方法。

2.6 HttpServlet类

GenericServlet类实现了 javax.servlet.Servlet 接口,为程序的开发提供了方便;但在实际开发过程中,大多数的应用都是使用Servlet处理HTTP协议的请求,并对请求作出响应,所以通过继承GenericServlet类仍然不是很方便。 javax.servlet.http.HttpServlet 类对GenericServlet类进行了扩展,为HTTP请求的处理提供了灵活的方法。

public abstract class HttpServlet extends GenericServlet

HttpServlet类仍然是一个抽象类,实现了service()方法,并针对HTTP1.1定义的7种请求类型提供了相应的方法:doGet()、doPost()、doPut()、doDelete()、doHead()、doTrace()和doOptions()方法。在这7个方法中,除了doTrace()和doOptions()方法进行简单实现外,HttpServlet类并没有对其他方法进行实现,需要开发人员在使用过程中根据实际需要对其进行重新。

HttpServlet类继承了GenericServlet类,通过其对GenericServlet类的扩展,可以很方便地对HTTP请求进行处理及响应。

 

3、Servlet开发

在Java的Web开发中,Servlet具有重要的地位,程序中的业务逻辑可以有Servlet进行处理;它也可以通过HttpServletResponse对象对请求作出响应,功能十分强大。

3.1 Servlet创建

Servlet的创建十分简单,主要有两种创建方法。第一种方法为创建一个普通的Java类,使这个类继承HttpServlet类,再通过手动配置web.xml文件注册Servlet对象。此方法操作比较繁琐,在快速开发中通常不被采纳,而是使用第二种方法——直接通过IDE集成开发工具进行创建,使用集成开发工具创建Servlet非常方便。

示例:在Java Web项目中创建 com.pjb.servlet 包,并创建名为MyServlet的Servlet对象,它继承了HttpServlet类。在该类中重新doGet()方法,用于处理HTTP的get请求,通过PrintWriter对象进行简单输出。

package com.pjb.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet实例
 * 
 * @author pan_junbiao
 *
 */
public class MyServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<HTML>");
		out.println("<HEAD><TITLE>Servlet 实例</TITLE></HEAD>");
		out.println("<BODY>");
		out.println("您好,欢迎访问 pan_junbiao的博客!");
		out.println("<br/>博客地址:https://blog.csdn.net/pan_junbiao");
		out.println("<br/>Servlet实例:");
		out.println(this.getClass());
		out.println("</BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}
}

3.2 Servlet配置

要使Servlet对象正常地运行,需要进行适当的配置,以告知Web容器哪一个请求调用哪一个Servlet对象处理,对Servlet起到一个注册的作用。Servlet的配置包含在web.xml文件中,主要通过以下两步进行设置。

3.2.1 声明Servlet对象

在 web.xml 文件中,通过<servlet>标签声明一个Servlet对象。在此标签下包含两个主要子元素,分别为<servlet-name>与<servlet-class>。其中,<servlet-name>元素用于指定Servlet的名称,该名称可以为自定义的名称;<servlet-class>元素用于指定Servlet对象的完整位置,包含Servlet对象的包名与类名。其声明语法如下:

<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>com.pjb.servlet.MyServlet</servlet-class>
</servlet>

3.2.2 映射Servlet

在 web.xml 文件中声明了Servlet对象后,需要映射访问Servlet的URL。该操作使用<servlet-mapping>标签进行配置。<servlet-mapping>标签包含两个字元素,分别为<servlet-name>与<url-pattern>。其中,<servlet-name>元素与<servlet>标签中的<servlet-name>元素相对应,不可以随意命名。<url-pattern>元素用于映射访问URL。其配置方法如下:

<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/servlet/MyServlet</url-pattern>
</servlet-mapping>

最后启动Tomcat服务器,输入执行地址:http://127.0.0.1:8080/firstweb/servlet/MyServlet

执行结果:

 

4、Servlet3.0新特性

4.1 @WebServlet注释

在Servlet3.0中新增了@WebServlet注释,@WebServlet注释定义在Servlet的类声明之前,用于定义Servlet组件。使用该注释,就无须再 web.xml 文件中对Servlet进行配置。@WebServlet注释包含很多属性。

@WebServlet注释主要属性列表:

属性名类型描述
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>标签。
smallIconString此Servlet的小图标。
largeIconString此Servlet的大图标。
descriptionString该Servlet的描述信息,等价于<description>标签。
displayNameString该Servlet的显示名,通常配合工具使用,等价于<display-name>标签。

示例:使用Servlet实现用户注册功能。

(1)创建index.jsp页面。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
	<div>请输入注册信息
		<form name="form1" method="post" action="servlet/RegServlet">
			<table border="0" >
				<tr>
					<td>姓名:</td>
					<td><input type="text" name="name"/></td>
				</tr>
				<tr>
					<td>年龄:</td>
					<td><input type=text name="age"/></td>
				</tr>
				<tr>
					<td>性别:</td>
					<td>
						<select name = "sex">
							<option value="男" selected="selected">男</option>
							<option value="女">女</option>
						</select>
					</td>
				</tr>
				<!-- 以下是提交、取消按钮 -->
				<tr>
					<td>
						<input type="submit" value="提交" />
					</td>
					<td>
						<input type="reset" value="取消" />
					</td>
				</tr>
			</table>
		</form>
	</div>
</body>
</html>

(2)创建名为RegServlet的Servlet类。该类继承HttpServlet类,并应用@WebServlet注释,配置Servlet的name属性与urlPatterns属性。

package com.pjb.servlet;

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;

/**
 * 用户注册Servlet类
 * 
 * @author pan_junbiao
 *
 */
@WebServlet(name = "RegServlet", urlPatterns = "/servlet/RegServlet")
public class RegServlet extends HttpServlet
{

	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// 设置request的编码
		request.setCharacterEncoding("UTF-8");
		// 获取信息
		String name = request.getParameter("name");
		String age = request.getParameter("age");
		String sex = request.getParameter("sex");

		// 设置response的编码
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html");
		// 获取PrintWriter对象
		PrintWriter out = response.getWriter();
		// 输出信息
		out.println("<HTML>");
		out.println("<HEAD><TITLE>注册信息</TITLE></HEAD>");
		out.println("<BODY>");
		out.println("姓名:" + name + "<br>");
		out.println("年龄:" + age + "<br>");
		out.println("性别:" + sex + "<br>");
		out.println("</BODY>");
		out.println("</HTML>");
		// 释放PrintWriter对象
		out.flush();
		out.close();
	}
}

说明:使用@WebServlet注释,配置Servlet的name属性与urlPatterns属性,如下代码:

@WebServlet(name = "RegServlet", urlPatterns = "/servlet/RegServlet")

这样配置完成后,就不必在 web.xml 文件中配置相应的<servlet>和<servlet-mapping>元素了。与上面的代码等价的 web.xml 文件的配置如下:

<servlet>
  <servlet-name>RegServlet</servlet-name>
  <servlet-class>com.pjb.servlet.RegServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>RegServlet</servlet-name>
  <url-pattern>/servlet/RegServlet</url-pattern>
</servlet-mapping>

执行结果:

(1)注册页面 index.jsp。

(2)提交注册结果信息。

4.2 @WebInitParam注释

@WebInitParam注释等价于web.xml文件中的<servlet>和<filter>的<init-param>子标签,该注释通常不单独使用,而是配合@WebServlet或者@WebFilter使用。

@WebInitParam注释主要属性列表:

属性名类型描述
nameString指定参数的名字,等价于<param-name>标签,必填项。
valueString指定参数的值,等价于<param-value>标签,必填项。
descriptionString关于参数的描述,等价于<description>标签,非必填项。

示例:应用@WebInitParam注释配置初始化参数。

package com.pjb.servlet;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet(urlPatterns = { "/simple" }, name = "SimpleServlet", 
initParams = { @WebInitParam(name = "username", value = "pan_junbiao") })
public class SimpleServlet extends HttpServlet
{
	// 省略了Servlet中间的代码
}

这样配置完成后,就不必在 web.xml 文件中配置相应的<servlet>和<servlet-mapping>元素了。与上面的代码等价的 web.xml 文件的配置如下:

<servlet>
	<servlet-name>SimpleServlet</servlet-name>
	<servlet-class>com.pjb.servlet.SimpleServlet</servlet-class>
	<init-param>
		<param-name>username</param-name>
		<param-value>pan_junbiao</param-value>
	</init-param>
</servlet>

<servlet-mapping>
	<servlet-name>SimpleServlet</servlet-name>
	<url-pattern>/simple</url-pattern>
</servlet-mapping>

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值