Servlet3.0版本对Servlet配置进行了重大变革,Servlet类不需要再麻烦的去编辑web.xml文件了,只需要在类上面进行注释就可以了,获得了 Java 社区的一片赞誉之声,以下是新增的注解支持。
@WebServlet
@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值):
表 1. @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> 标签。 |
description | String | 该 Servlet 的描述信息,等价于 <description> 标签。 |
displayName | String | 该 Servlet 的显示名,通常配合工具使用,等价于 <display-name> 标签。 |
下面是一个简单的示例:
1 2 3 4 5 |
|
如此配置之后,就可以不必在 web.xml 中配置相应的 <servlet> 和 <servlet-mapping> 元素了,容器会在部署时根据指定的属性将该类发布为 Servlet。它的等价的 web.xml 配置形式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
@WebInitParam
该注解通常不单独使用,而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数,这等价于 web.xml 中 <servlet> 和 <filter> 的 <init-param> 子标签。@WebInitParam 具有下表给出的一些常用属性:
表 2. @WebInitParam 的常用属性
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
name | String | 否 | 指定参数的名字,等价于 <param-name>。 |
value | String | 否 | 指定参数的值,等价于 <param-value>。 |
description | String | 是 | 关于参数的描述,等价于 <description>。 |
@WebFilter
@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 ):
表 3. @WebFilter 的常用属性
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定过滤器的 name 属性,等价于 <filter-name> |
value | String[] | 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。 |
urlPatterns | String[] | 指定一组过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。 |
servletNames | String[] | 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 <servlet-name> 的取值。 |
dispatcherTypes | DispatcherType | 指定过滤器的转发模式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。 |
initParams | WebInitParam[] | 指定一组过滤器初始化参数,等价于 <init-param> 标签。 |
asyncSupported | boolean | 声明过滤器是否支持异步操作模式,等价于 <async-supported> 标签。 |
description | String | 该过滤器的描述信息,等价于 <description> 标签。 |
displayName | String | 该过滤器的显示名,通常配合工具使用,等价于 <display-name> 标签。 |
下面是一个简单的示例:
1 2 |
|
如此配置之后,就可以不必在 web.xml 中配置相应的 <filter> 和 <filter-mapping> 元素了,容器会在部署时根据指定的属性将该类发布为过滤器。它等价的 web.xml 中的配置形式为:
1 2 3 4 5 6 7 8 |
|
@WebListener
该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:
- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
- HttpSessionListener
- HttpSessionAttributeListener
该注解使用非常简单,其属性如下:
表 4. @WebListener 的常用属性
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
value | String | 是 | 该监听器的描述信息。 |
一个简单示例如下:
1 2 |
|
如此,则不需要在 web.xml 中配置 <listener> 标签了。它等价的 web.xml 中的配置形式如下:
1 2 3 |
|
@MultipartConfig
该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面,以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外,它还提供了若干属性用于简化对上传文件的处理。具体如下:
表 5. @MultipartConfig 的常用属性
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
fileSizeThreshold | int | 是 | 当数据量大于该值时,内容将被写入文件。 |
location | String | 是 | 存放生成的文件地址。 |
maxFileSize | long | 是 | 允许上传的文件最大值。默认值为 -1,表示没有限制。 |
maxRequestSize | long | 是 | 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。 |
以上引用于https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/index.html
Servlet核心接口:
在Servlet体系结构中,除了用于实现Servlet的Servlet接口,GenericServlet类和HttpServlet类外,还有一些辅助Servlet获取相关资源信息的重要接口,了解这些接口的作用并熟练掌握这些接口的常用方法是使用Servlet进行Web应用开发的基础,下面我将介绍以下几种接口:
1.ServletConfig接口:用于获取Servlet初始化参数和ServletContext对象;
1 // 2 // Source code recreated from a .class file by IntelliJ IDEA 3 // (powered by Fernflower decompiler) 4 // 5 6 package javax.servlet; 7 8 import java.util.Enumeration; 9 10 public interface ServletConfig { 11 String getServletName(); 12 13 ServletContext getServletContext(); 14 15 String getInitParameter(String var1); 16 17 Enumeration<String> getInitParameterNames(); 18 }
ServletConfig接口的主要方法:
getInitParameter(String param); 根据给定的初始化参数名称,返回参数值,若参数不存在,返回null
getInitParameterNames():返回一个枚举集合对象,里面包含了所有的初始化参数名称
getServletContext():返回当前ServletContext()对象
getServletName():返回当前Servlet的名字,即@WebServlet的name属性值。如果没有配置这个属性,则返回Servlet类的全限定名(绝对路径)
2.ServletContext接口:
1 // 2 // Source code recreated from a .class file by IntelliJ IDEA 3 // (powered by Fernflower decompiler) 4 // 5 6 package javax.servlet; 7 8 import java.io.InputStream; 9 import java.net.MalformedURLException; 10 import java.net.URL; 11 import java.util.Enumeration; 12 import java.util.EventListener; 13 import java.util.Map; 14 import java.util.Set; 15 import javax.servlet.ServletRegistration.Dynamic; 16 import javax.servlet.descriptor.JspConfigDescriptor; 17 18 public interface ServletContext { 19 String TEMPDIR = "javax.servlet.context.tempdir"; 20 String ORDERED_LIBS = "javax.servlet.context.orderedLibs"; 21 22 String getContextPath(); 23 24 ServletContext getContext(String var1); 25 26 int getMajorVersion(); 27 28 int getMinorVersion(); 29 30 int getEffectiveMajorVersion(); 31 32 int getEffectiveMinorVersion(); 33 34 String getMimeType(String var1); 35 36 Set<String> getResourcePaths(String var1); 37 38 URL getResource(String var1) throws MalformedURLException; 39 40 InputStream getResourceAsStream(String var1); 41 42 RequestDispatcher getRequestDispatcher(String var1); 43 44 RequestDispatcher getNamedDispatcher(String var1); 45 46 /** @deprecated */ 47 @Deprecated 48 Servlet getServlet(String var1) throws ServletException; 49 50 /** @deprecated */ 51 @Deprecated 52 Enumeration<Servlet> getServlets(); 53 54 /** @deprecated */ 55 @Deprecated 56 Enumeration<String> getServletNames(); 57 58 void log(String var1); 59 60 /** @deprecated */ 61 @Deprecated 62 void log(Exception var1, String var2); 63 64 void log(String var1, Throwable var2); 65 66 String getRealPath(String var1); 67 68 String getServerInfo(); 69 70 String getInitParameter(String var1); 71 72 Enumeration<String> getInitParameterNames(); 73 74 boolean setInitParameter(String var1, String var2); 75 76 Object getAttribute(String var1); 77 78 Enumeration<String> getAttributeNames(); 79 80 void setAttribute(String var1, Object var2); 81 82 void removeAttribute(String var1); 83 84 String getServletContextName(); 85 86 Dynamic addServlet(String var1, String var2); 87 88 Dynamic addServlet(String var1, Servlet var2); 89 90 Dynamic addServlet(String var1, Class<? extends Servlet> var2); 91 92 Dynamic addJspFile(String var1, String var2); 93 94 <T extends Servlet> T createServlet(Class<T> var1) throws ServletException; 95 96 ServletRegistration getServletRegistration(String var1); 97 98 Map<String, ? extends ServletRegistration> getServletRegistrations(); 99 100 javax.servlet.FilterRegistration.Dynamic addFilter(String var1, String var2); 101 102 javax.servlet.FilterRegistration.Dynamic addFilter(String var1, Filter var2); 103 104 javax.servlet.FilterRegistration.Dynamic addFilter(String var1, Class<? extends Filter> var2); 105 106 <T extends Filter> T createFilter(Class<T> var1) throws ServletException; 107 108 FilterRegistration getFilterRegistration(String var1); 109 110 Map<String, ? extends FilterRegistration> getFilterRegistrations(); 111 112 SessionCookieConfig getSessionCookieConfig(); 113 114 void setSessionTrackingModes(Set<SessionTrackingMode> var1); 115 116 Set<SessionTrackingMode> getDefaultSessionTrackingModes(); 117 118 Set<SessionTrackingMode> getEffectiveSessionTrackingModes(); 119 120 void addListener(String var1); 121 122 <T extends EventListener> void addListener(T var1); 123 124 void addListener(Class<? extends EventListener> var1); 125 126 <T extends EventListener> T createListener(Class<T> var1) throws ServletException; 127 128 JspConfigDescriptor getJspConfigDescriptor(); 129 130 ClassLoader getClassLoader(); 131 132 void declareRoles(String... var1); 133 134 String getVirtualServerName(); 135 136 int getSessionTimeout(); 137 138 void setSessionTimeout(int var1); 139 140 String getRequestCharacterEncoding(); 141 142 void setRequestCharacterEncoding(String var1); 143 144 String getResponseCharacterEncoding(); 145 146 void setResponseCharacterEncoding(String var1); 147 }
ServletContext也成为Servlet上下文,代表当前Servlet运行环境,是Servlet与Servlet容器之间直接通信的接口。Servlet容器在启动一个Web应用时,会为该应用创建一个唯一的ServletContext对象供该应用中所有的Servlet对象共享,Servlet对象可以通过ServletContext对象来访问容器的各种资源。
获取ServletContext对象可以通过ServletConfig接口或者Generic抽象类中的getServletContext()方法
ServletContext接口中提供了以下几种类型的方法:
获取应用范围的初始化参数的方法:
getInitParameter(String param); 根据给定的初始化参数名称,返回参数值,若参数不存在,返回null
getInitParameterNames():返回一个枚举集合对象,里面包含了所有的初始化参数名称
存取应用范围域属性的方法:
setAttribute(String name,Object obj)把一个对象和一个属性名以key+value的形式绑定并存放在ServletContext中
getAttribute(String name) 返回用上一方法中存的对象,根据其对应的属性名
getAttributeNames():返回一个枚举集合对象,该对象包含了所有存放在ServletContext中的属性名
removeAttribute(String name):同getAttribute()方法相反,删除一个匹配的对象
获取当前Web应用信息的方法:
getContextPath():返回当前web应用的根路径
getServletContextName():返回web应用的名字,即<web-app>中<display-name>元素的值
getRequestDispatcher(String path):返回一个用于其他web组件转发请求的RequestDispatcher对象
getContext(Srting uripath):根据参数制定的URL返回当前Servlet容器中其他web应用的ServletContext对象,URL必须时以“/”开头的绝对路径
获取当前容器信息和输出日志的方法:
getServletInfo():返回Web容器的名字和版本
getMajorVersion():返回Web容器支持的Servlet API主版本号
getMinorVersion():返回Web容器支持的Servlet API次版本号
log(String msg):用于记录一般的日志
log(String msg throwable):用于记录带异常类型的日志
获取服务器端文件资源的方法:
getResourceAsStream(String path):返回一个读取参数指定的文件的输入流,参数路径必须以“/”开头
getResouce(String path):返回由path指定的的资源路径对应的一个URL对象,参数路径必须以“/”开头
getRealPath(String path):根据参数指定的虚拟路径,返回文件系统中的一个真实的路径
getMimeType(String path):返回参数指定的文件的MIME类型
3.HttpServletRequest接口
1 // 2 // Source code recreated from a .class file by IntelliJ IDEA 3 // (powered by Fernflower decompiler) 4 // 5 6 package javax.servlet.http; 7 8 import java.io.IOException; 9 import java.security.Principal; 10 import java.util.Collection; 11 import java.util.Collections; 12 import java.util.Enumeration; 13 import java.util.Map; 14 import javax.servlet.ServletException; 15 import javax.servlet.ServletRequest; 16 17 public interface HttpServletRequest extends ServletRequest { 18 String BASIC_AUTH = "BASIC"; 19 String FORM_AUTH = "FORM"; 20 String CLIENT_CERT_AUTH = "CLIENT_CERT"; 21 String DIGEST_AUTH = "DIGEST"; 22 23 String getAuthType(); 24 25 Cookie[] getCookies(); 26 27 long getDateHeader(String var1); 28 29 String getHeader(String var1); 30 31 Enumeration<String> getHeaders(String var1); 32 33 Enumeration<String> getHeaderNames(); 34 35 int getIntHeader(String var1); 36 37 default HttpServletMapping getHttpServletMapping() { 38 return new HttpServletMapping() { 39 public String getMatchValue() { 40 return ""; 41 } 42 43 public String getPattern() { 44 return ""; 45 } 46 47 public String getServletName() { 48 return ""; 49 } 50 51 public MappingMatch getMappingMatch() { 52 return null; 53 } 54 }; 55 } 56 57 String getMethod(); 58 59 String getPathInfo(); 60 61 String getPathTranslated(); 62 63 default PushBuilder newPushBuilder() { 64 return null; 65 } 66 67 String getContextPath(); 68 69 String getQueryString(); 70 71 String getRemoteUser(); 72 73 boolean isUserInRole(String var1); 74 75 Principal getUserPrincipal(); 76 77 String getRequestedSessionId(); 78 79 String getRequestURI(); 80 81 StringBuffer getRequestURL(); 82 83 String getServletPath(); 84 85 HttpSession getSession(boolean var1); 86 87 HttpSession getSession(); 88 89 String changeSessionId(); 90 91 boolean isRequestedSessionIdValid(); 92 93 boolean isRequestedSessionIdFromCookie(); 94 95 boolean isRequestedSessionIdFromURL(); 96 97 /** @deprecated */ 98 @Deprecated 99 boolean isRequestedSessionIdFromUrl(); 100 101 boolean authenticate(HttpServletResponse var1) throws IOException, ServletException; 102 103 void login(String var1, String var2) throws ServletException; 104 105 void logout() throws ServletException; 106 107 Collection<Part> getParts() throws IOException, ServletException; 108 109 Part getPart(String var1) throws IOException, ServletException; 110 111 <T extends HttpUpgradeHandler> T upgrade(Class<T> var1) throws IOException, ServletException; 112 113 default Map<String, String> getTrailerFields() { 114 return Collections.emptyMap(); 115 } 116 117 default boolean isTrailerFieldsReady() { 118 return false; 119 } 120 }
在Servlet API中,ServletRequest接口被定义为用于封装请求的信息,ServletRequest对象由Servlet容器在用户每次请求Servlet时创建并传入Servlet的service方法中。
HttpServletRequest接口继承自ServletRequest接口,该接口提供了具有如下HTTP请求信息的处理
获取请求报文信息(包括请求行,请求头和请求正文)的方法:
获取请求行信息:
getMethod():获取请求使用的HTTP方法,例如GET,POST和PUT
getRequestURL():获取请求行中的资源名部分
getProtocol():获取协议和版本号
getQueryString():获取请求URL后面的查询字符串,只对GET有效
getServletPath():获取Servlet所映射的路径
getContextPath():获取请求资源所属于的Web应用的路径
获取请求头信息:
getIntHeader(String name):获取整数类型的请求头
getDateHeader(String name):获取单值毫秒类型的请求头
getContextLength():获取请求内容的长度,以字节为单位
getContentType():获取请求的文档类型和编码
getLocale():获取用户浏览器设置的locale信息
getCookies():获取一个包含在这个请求中所有cookie的数组
获取请求正文:
getParameter(String name):返回由name指定的用户请求参数的值
getParameterNames():返回所有用户请求的参数名
getParameterValues(String name):返回由name制定的用户请求参数对应的一组值
getParameterMaps():返回一个请求参数的MAP对象
ServletInputStream getInputStream():获取上传文件二进制输出流
BufferedReader getReader():获取上传文件字符缓冲输入流
获取网络连接信息的方法:
getRequestURL:返回客户端发出请求时的完整URL。
getRequestURI:返回请求行中的资源名部分。
getRemoteAddr:返回发出请求的客户机的IP地址。
getRemoteHost:返回发出请求的客户机的完整主机名。
getRemotePort:返回客户机所使用的网络端口号。
getLocalAddr:返回WEB服务器的IP地址。
getLocalName:返回WEB服务器的主机名。
存取请求域属性的方法:
setAttribute(String name,Object obj)把一个对象和一个属性名以key+value的形式绑定并存放在ServletContext中
getAttribute(String name) 返回用上一方法中存的对象,根据其对应的属性名
getAttributeNames():返回一个枚举集合对象,该对象包含了所有存放在ServletContext中的属性名
removeAttribute(String name):同getAttribute()方法相反,删除一个匹配的对象
HttpServletResponse接口:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package javax.servlet.http; import java.io.IOException; import java.util.Collection; import java.util.Map; import java.util.function.Supplier; import javax.servlet.ServletResponse; public interface HttpServletResponse extends ServletResponse { int SC_CONTINUE = 100; int SC_SWITCHING_PROTOCOLS = 101; int SC_OK = 200; int SC_CREATED = 201; int SC_ACCEPTED = 202; int SC_NON_AUTHORITATIVE_INFORMATION = 203; int SC_NO_CONTENT = 204; int SC_RESET_CONTENT = 205; int SC_PARTIAL_CONTENT = 206; int SC_MULTIPLE_CHOICES = 300; int SC_MOVED_PERMANENTLY = 301; int SC_MOVED_TEMPORARILY = 302; int SC_FOUND = 302; int SC_SEE_OTHER = 303; int SC_NOT_MODIFIED = 304; int SC_USE_PROXY = 305; int SC_TEMPORARY_REDIRECT = 307; int SC_BAD_REQUEST = 400; int SC_UNAUTHORIZED = 401; int SC_PAYMENT_REQUIRED = 402; int SC_FORBIDDEN = 403; int SC_NOT_FOUND = 404; int SC_METHOD_NOT_ALLOWED = 405; int SC_NOT_ACCEPTABLE = 406; int SC_PROXY_AUTHENTICATION_REQUIRED = 407; int SC_REQUEST_TIMEOUT = 408; int SC_CONFLICT = 409; int SC_GONE = 410; int SC_LENGTH_REQUIRED = 411; int SC_PRECONDITION_FAILED = 412; int SC_REQUEST_ENTITY_TOO_LARGE = 413; int SC_REQUEST_URI_TOO_LONG = 414; int SC_UNSUPPORTED_MEDIA_TYPE = 415; int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; int SC_EXPECTATION_FAILED = 417; int SC_INTERNAL_SERVER_ERROR = 500; int SC_NOT_IMPLEMENTED = 501; int SC_BAD_GATEWAY = 502; int SC_SERVICE_UNAVAILABLE = 503; int SC_GATEWAY_TIMEOUT = 504; int SC_HTTP_VERSION_NOT_SUPPORTED = 505; void addCookie(Cookie var1); boolean containsHeader(String var1); String encodeURL(String var1); String encodeRedirectURL(String var1); /** @deprecated */ @Deprecated String encodeUrl(String var1); /** @deprecated */ @Deprecated String encodeRedirectUrl(String var1); void sendError(int var1, String var2) throws IOException; void sendError(int var1) throws IOException; void sendRedirect(String var1) throws IOException; void setDateHeader(String var1, long var2); void addDateHeader(String var1, long var2); void setHeader(String var1, String var2); void addHeader(String var1, String var2); void setIntHeader(String var1, int var2); void addIntHeader(String var1, int var2); void setStatus(int var1); /** @deprecated */ @Deprecated void setStatus(int var1, String var2); int getStatus(); String getHeader(String var1); Collection<String> getHeaders(String var1); Collection<String> getHeaderNames(); default void setTrailerFields(Supplier<Map<String, String>> supplier) { } default Supplier<Map<String, String>> getTrailerFields() { return null; } }
HttpServletResponse同HttpServletRequest一样都是继承与javax.servlet包内的接口,它被用来进行HTTP相应信息的处理
HttpServletResponse接口提供了具有如下功能类型的方法:
设置响应状态的方法:
setStatus(int sc):以指定的状态码相应返回给客户端
setError(int sc):使用制定的状态码向客户端返回一个错误响应
sendError(int sc,String msg):使用指定的状态码和状态描述向客户端返回一个错误响应
sendRedirect(String):请求的重定向
构建响应头的方法:
setContentType(String mimeType):设置Content-type报头。
setContentLength(int length):设置Content-length报头,用于浏览器持续性HTTP连接。
addCookie(Cookie c):向set-cookie报头插入一个cookie。
addHeader(String name, String value):新增String类型值到名为name的http头部
addIntHeader(String name, int value):新增Int类型值到名为name的http头部
addDateHeader(String name, long value):新增long类型值到名为name的http头部
创建相应正文的方法:
getOutputStream():返回字节输出流对象ServletOutputStream
getWriter():返回字符输出流对象PrintWrite
原文地址:https://www.cnblogs.com/qq965921539/p/10162765.html