Java Web 学习与总结(二)Servlet核心接口+Servlet3.0配置
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
|
@WebServlet(urlPatterns = {"/simple"}, asyncSupported = true, loadOnStartup = -1, name = "SimpleServlet", displayName = "ss", initParams = {@WebInitParam(name = "username", value = "tom")} ) public class SimpleServlet extends HttpServlet{ … } |
如此配置之后,就可以不必在 web.xml 中配置相应的 <servlet> 和 <servlet-mapping> 元素了,容器会在部署时根据指定的属性将该类发布为 Servlet。它的等价的 web.xml 配置形式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< servlet > < display-name >ss</ display-name > < servlet-name >SimpleServlet</ servlet-name > < servlet-class >footmark.servlet.SimpleServlet</ servlet-class > < load-on-startup >-1</ load-on-startup > < async-supported >true</ async-supported > < init-param > < param-name >username</ param-name > < param-value >tom</ param-value > </ init-param > </ servlet > < servlet-mapping > < servlet-name >SimpleServlet</ servlet-name > < url-pattern >/simple</ url-pattern > </ servlet-mapping > |
@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
|
@WebFilter(servletNames = {"SimpleServlet"},filterName="SimpleFilter") public class LessThanSixFilter implements Filter{...} |
如此配置之后,就可以不必在 web.xml 中配置相应的 <filter> 和 <filter-mapping> 元素了,容器会在部署时根据指定的属性将该类发布为过滤器。它等价的 web.xml 中的配置形式为:
1
2
3
4
5
6
7
8
|
< filter > < filter-name >SimpleFilter</ filter-name > < filter-class >xxx</ filter-class > </ filter > < filter-mapping > < filter-name >SimpleFilter</ filter-name > < servlet-name >SimpleServlet</ servlet-name > </ filter-mapping > |
@WebListener
该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:
- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
- HttpSessionListener
- HttpSessionAttributeListener
该注解使用非常简单,其属性如下:
表 4. @WebListener 的常用属性
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
value | String | 是 | 该监听器的描述信息。 |
一个简单示例如下:
1
2
|
@WebListener("This is only a demo listener") public class SimpleListener implements ServletContextListener{...} |
如此,则不需要在 web.xml 中配置 <listener> 标签了。它等价的 web.xml 中的配置形式如下:
1
2
3
|
< listener > < listener-class >footmark.servlet.SimpleListener</ listener-class > </ listener > |
@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
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package javax.servlet; import java.util.Enumeration; public interface ServletConfig {
String getServletName(); ServletContext getServletContext(); String getInitParameter(String var1); Enumeration<String> getInitParameterNames();
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package javax.servlet; import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletRegistration.Dynamic;
import javax.servlet.descriptor.JspConfigDescriptor; public interface ServletContext {
String TEMPDIR = "javax.servlet.context.tempdir";
String ORDERED_LIBS = "javax.servlet.context.orderedLibs"; String getContextPath(); ServletContext getContext(String var1); int getMajorVersion(); int getMinorVersion(); int getEffectiveMajorVersion(); int getEffectiveMinorVersion(); String getMimeType(String var1); Set<String> getResourcePaths(String var1); URL getResource(String var1) throws MalformedURLException; InputStream getResourceAsStream(String var1); RequestDispatcher getRequestDispatcher(String var1); RequestDispatcher getNamedDispatcher(String var1); /** @deprecated */
@Deprecated
Servlet getServlet(String var1) throws ServletException; /** @deprecated */
@Deprecated
Enumeration<Servlet> getServlets(); /** @deprecated */
@Deprecated
Enumeration<String> getServletNames(); void log(String var1); /** @deprecated */
@Deprecated
void log(Exception var1, String var2); void log(String var1, Throwable var2); String getRealPath(String var1); String getServerInfo(); String getInitParameter(String var1); Enumeration<String> getInitParameterNames(); boolean setInitParameter(String var1, String var2); Object getAttribute(String var1); Enumeration<String> getAttributeNames(); void setAttribute(String var1, Object var2); void removeAttribute(String var1); String getServletContextName(); Dynamic addServlet(String var1, String var2); Dynamic addServlet(String var1, Servlet var2); Dynamic addServlet(String var1, Class<? extends Servlet> var2); Dynamic addJspFile(String var1, String var2); <T extends Servlet> T createServlet(Class<T> var1) throws ServletException; ServletRegistration getServletRegistration(String var1); Map<String, ? extends ServletRegistration> getServletRegistrations(); javax.servlet.FilterRegistration.Dynamic addFilter(String var1, String var2); javax.servlet.FilterRegistration.Dynamic addFilter(String var1, Filter var2); javax.servlet.FilterRegistration.Dynamic addFilter(String var1, Class<? extends Filter> var2); <T extends Filter> T createFilter(Class<T> var1) throws ServletException; FilterRegistration getFilterRegistration(String var1); Map<String, ? extends FilterRegistration> getFilterRegistrations(); SessionCookieConfig getSessionCookieConfig(); void setSessionTrackingModes(Set<SessionTrackingMode> var1); Set<SessionTrackingMode> getDefaultSessionTrackingModes(); Set<SessionTrackingMode> getEffectiveSessionTrackingModes(); void addListener(String var1); <T extends EventListener> void addListener(T var1); void addListener(Class<? extends EventListener> var1); <T extends EventListener> T createListener(Class<T> var1) throws ServletException; JspConfigDescriptor getJspConfigDescriptor(); ClassLoader getClassLoader(); void declareRoles(String... var1); String getVirtualServerName(); int getSessionTimeout(); void setSessionTimeout(int var1); String getRequestCharacterEncoding(); void setRequestCharacterEncoding(String var1); String getResponseCharacterEncoding(); void setResponseCharacterEncoding(String var1);
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package javax.servlet.http; import java.io.IOException;
import java.security.Principal;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest; public interface HttpServletRequest extends ServletRequest {
String BASIC_AUTH = "BASIC";
String FORM_AUTH = "FORM";
String CLIENT_CERT_AUTH = "CLIENT_CERT";
String DIGEST_AUTH = "DIGEST"; String getAuthType(); Cookie[] getCookies(); long getDateHeader(String var1); String getHeader(String var1); Enumeration<String> getHeaders(String var1); Enumeration<String> getHeaderNames(); int getIntHeader(String var1); default HttpServletMapping getHttpServletMapping() {
return new HttpServletMapping() {
public String getMatchValue() {
return "";
} public String getPattern() {
return "";
} public String getServletName() {
return "";
} public MappingMatch getMappingMatch() {
return null;
}
};
} String getMethod(); String getPathInfo(); String getPathTranslated(); default PushBuilder newPushBuilder() {
return null;
} String getContextPath(); String getQueryString(); String getRemoteUser(); boolean isUserInRole(String var1); Principal getUserPrincipal(); String getRequestedSessionId(); String getRequestURI(); StringBuffer getRequestURL(); String getServletPath(); HttpSession getSession(boolean var1); HttpSession getSession(); String changeSessionId(); boolean isRequestedSessionIdValid(); boolean isRequestedSessionIdFromCookie(); boolean isRequestedSessionIdFromURL(); /** @deprecated */
@Deprecated
boolean isRequestedSessionIdFromUrl(); boolean authenticate(HttpServletResponse var1) throws IOException, ServletException; void login(String var1, String var2) throws ServletException; void logout() throws ServletException; Collection<Part> getParts() throws IOException, ServletException; Part getPart(String var1) throws IOException, ServletException; <T extends HttpUpgradeHandler> T upgrade(Class<T> var1) throws IOException, ServletException; default Map<String, String> getTrailerFields() {
return Collections.emptyMap();
} default boolean isTrailerFieldsReady() {
return false;
}
}
在Servlet API中,ServletRequest接口被定义为用于封装请求的信息,ServletRequest对象由Servlet容器在用户每次请求Servlet时创建并传入Servlet的service方法中。
HttpServletRequest接口继承自ServletRequest接口,该接口提供了具有如下HTTP请求信息的处理
getRequestURI:返回请求行中的资源名部分。
getRemoteAddr:返回发出请求的客户机的IP地址。
getRemoteHost:返回发出请求的客户机的完整主机名。
getRemotePort:返回客户机所使用的网络端口号。
getLocalAddr:返回WEB服务器的IP地址。
getLocalName:返回WEB服务器的主机名。
//
// 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
最新文章
- 我的c++学习(11)数组和指针
- C#中返回值封装
- .AndroidRuntimeException: requestFeature() must be called before adding content
- java 中遇到的问题及解决方法
- 四 GPU 并行编程的存储系统架构
- PHP 文件操作函数大全
- 第三集 欠拟合与过拟合的概念、局部加权回归、logistic回归、感知器算法
- WPF 多线程处理(6)
- Python第一个入门程序
- Data Structure导论的导论
- linux下so动态库一些不为人知的秘密 系列
- C语言-字符编码转换:UTF与GB2312
- 在github 网页上,删除已经建好的库
- A SPI class of type org.apache.lucene.codecs.PostingsFormat with name &#39;Lucene40&#39; does not exist.
- HTTP 前端需明白的相关知识点
- Centos7 系统下搭建.NET Core2.0+Nginx+Supervisor+Mysql环境
- Ajax的工作原理以及优缺点
- Linux pip 命令无法使用问题
- jQuery事件处理(四)
- Javascript Madness: Mouse Events