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注释主要属性列表:
属性名 | 类型 | 描述 |
---|---|---|
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>标签。 |
smallIcon | String | 此Servlet的小图标。 |
largeIcon | String | 此Servlet的大图标。 |
description | String | 该Servlet的描述信息,等价于<description>标签。 |
displayName | String | 该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注释主要属性列表:
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定参数的名字,等价于<param-name>标签,必填项。 |
value | String | 指定参数的值,等价于<param-value>标签,必填项。 |
description | String | 关于参数的描述,等价于<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>