无论是Servlet,还是Filter,Listener等,在自定义Filter时,要想使它起作用,那么必须要对它进行配置,一般都有两种配置的方式,一种是基于
配置式
的,另一种则是基于注解式
的。
以Servlet为例:
在web.xml中配置:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>mysservlet-name> <servlet-class>com.mycat.web.MyFirstServletservlet-class> <init-param> <param-name>tomparam-name> <param-value>123param-value> init-param> servlet> <servlet-mapping> <servlet-name>mysservlet-name> <url-pattern>/myserurl-pattern> servlet-mapping> web-app>
类上注解式:(基于配置式的话,就不要使用它的配置式了,即不要同时配置该Servlet的web.xml的servlet配置和类上注解添加)
package com.mycat.web; import javax.servlet.*; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import java.io.IOException; import java.io.PrintWriter; /** * 自定义的Servlet必须实现Servlet接口 */ @WebServlet(value = "/myser",initParams = @WebInitParam(name="tom",value="123")) public class MyFirstServlet implements Servlet { private ServletConfig servletConfig; private ServletRequest servletRequest; @Override public void init(ServletConfig servletConfig) throws ServletException { this.servletConfig=servletConfig; System.out.println("Servlet的初始化方法..."); } @Override public ServletConfig getServletConfig() { return servletConfig; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { this.servletRequest=servletRequest; System.out.println("service....运行时方法"); PrintWriter writer = servletResponse.getWriter(); System.out.println("获得Servlet的配置对象:"+this.getServletConfig()); System.out.println("变量tom的值:"+servletConfig.getInitParameter("tom")); servletRequest.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=utf-8"); servletResponse.setCharacterEncoding("utf-8"); writer.println("==============================="); writer.println("去myser2"); } @Override public String getServletInfo() { return servletRequest.getServletContext().getServerInfo(); } @Override public void destroy() { System.out.println("Servlet的销毁方法..."); } }
@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 {}; // 使用:@WebInitParam(参数列表)
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
对于Servlet来说,他有 name, value, urlpattern, loadOnStatus, initParams, asyncSupported, smallIcon, largeIcon, description, displayName 共10的属性
name: 自定义Servlet的名称 ,String类型。对应于web.xml中< servlet-name>的配置
value: 自定义 Servlet的映射模式,即等价于urlPattern属性,与urlPattern属不同同时使用,多个的话,使用逗号分隔开。参数是String[]。
urlPattern:自定义 Servlet的映射模式,即等价于value属性,与value属不同同时使用,对应于web.xml中< url-pattern>标签的配置。多个的话,使用逗号分隔开。参数是String[]。
loadOnStartup: 指定Servlet的加载顺序,等同于web.xml中< load-on-startup>标签的配置,整型数值
initParams:指定一组Servlet的初始化参数,相当于web.xml中的< init-param>标签,可以看做是Servlet的全局变量。
asyncSupported: 声明Servlet是否支持异步操作模式,等同于web.xml中< asyn-supported>标签
description: 对于Servlet的描述,等同于web.xml中< description>标签
displayName: 该Servlet的显示名,通常配合工具使用,等价于web.xml中< display-name>标签
smallIcon和largeIcon: 表示的是Servlet的显示图标,即标签页左侧的小图标。这里只是表示两个尺寸的,值为String类型的,即小图标的地址。
使用示例:
loadOnStartUp: 即只是Servlet法人加载顺序,当其值为负数时,表示只有在第一次请求这个Servlet,才会被加载,当其值为0或者整数时则表示整个应用程序启动时就立即加载,而且 loadOnStartUp 越小的越先被加载。
//一个参数时,默认是value,因此可以也写成@WebServlet("/myser2")) @WebServlet(value = "/myser2")) public class MySecondServlet extends HttpServlet { ....
@WebServlet(value = "/myser2",initParams = @WebInitParam(name="tom",value="123")) public class MySecondServlet extends HttpServlet { ....
// 多个初始化参数 initParams={@WebInitParam(...),@WebInitParam(...)...} @WebServlet(value = "/myser2",initParams = {@WebInitParam(name="username",value="tom"),@WebInitParam(name="password",value="123")}) public class MySecondServlet extends HttpServlet { ....
@WebServlet(value = "/myser2",initParams = @WebInitParam(name="tom",value="123")) public class MySecondServlet extends HttpServlet { ....
@WebServlet(value = "/myser2",loadOnStartup = -1) public class MySecondServlet extends HttpServlet { ....
分析总结:
无论是基于配置配置式的,还是基于注解式的,都会提供给对应的参数,让引擎来解析为一个Servlet,但是注解的话,应该有个配置啥的来扫描:那就是web.xml中< web-app>标签的metadata-complete属性。
metadata-complete属性表示部署时当前的配置是否完全,值为true,表示完全,只会应用web.xml的配置,而不会去扫描类似@WebServlet,@WebFilter,@WebListener等注解和web-frame.xml配置。
默认值
是metadata-complete=false,即不完全,会对项目中类进行扫描,是否有相关的注解配置,同时也会加载web-frame.xml等插件配置。
示例代码:
four.jsp链接到映射到/myser4的Servlet
web.xml中配置:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> web-app>
MyFourServlet代码:
package com.mycat.web; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet("/myser4") public class MyFourServlet implements Servlet { private ServletRequest servletRequest; private ServletConfig servletConfig; @Override public void init(ServletConfig servletConfig) throws ServletException { this.servletConfig=servletConfig; System.out.println("Servlet名称:"+servletConfig.getServletName()); System.out.println("应用上下文路径:"+servletConfig.getServletContext().getContextPath()); } @Override public ServletConfig getServletConfig() { return servletConfig; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { this.servletRequest=servletRequest; System.out.println("运行方法..."); } @Override public String getServletInfo() { return servletConfig.getServletContext().getServerInfo(); } @Override public void destroy() {} }
测试结果:(正常运行)
Servlet名称:com.mycat.web.MyFourServlet
应用上下文路径:/my
运行方法…
web.xml中配置:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" metadata-complete=true version="4.0"> web-app>
MyFourServlet代码:
不变
测试结果:(页面运行状态 404 ,运行出错,找不到对应的Servlet)
Type Status Report
Message /my/myser4
Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
本意是元数据书否完全(web.xml中),如果需要注解方式定义组件时,显然必须设置为false,也就是默认值