Servlet - 匹配模式加注解源码分析
Servlet - 注解源码分析
- urlPatterns 对应 web.xml 的 < url-pattern> </ u rl-pattern>
- {“/ok1”, “/ok2”} 可以给OkServlet配置多个 url-pattern
- 相当于这个@WebServlet(urlPatterns = {“/ok1”, “/ok2”}) 代替了 web.xml的配置 底层使用了 反射+注解+IO+集合 来完成一个支撑
- 浏览器可以这样访问OkServlet时,可以 http://localhost:8080/servlet/ok1 或者 http://localhost:8080/servlet/ok2
- 我们可以根据 @interface WebServlet 源码知道可以配置哪些
- 注解方式开发Servlet和 web.xml配置servlet 流程机制是一样
7. @WebServlet 是一个注解 => java基础->注解 8. @WebServlet 源码 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented => 在javadoc工具生成文档有记录 /* public @interface WebServlet { * String name() default ""; * * String[] value() default {}; * * String[] urlPatterns() default {}; * * int loadOnStartup() default -1; * * WebInitParam[] initParams() default {}; * * boolean asyncSupported() default false; * * String smallIcon() default ""; * } */ 3. urlPatterns 对应 web.xml 的 <url-pattern></url-pattern> 4. {"/ok1", "/ok2"} 可以给OkServlet配置多个 url-pattern 5. 相当于这个@WebServlet(urlPatterns = {"/ok1", "/ok2"}) 代替了 web.xml的配置 底层使用了 反射+注解+IO+集合 来完成一个支撑 6. 浏览器可以这样访问OkServlet时,可以 http://localhost:8080/servlet/ok1 或者 http://localhost:8080/servlet/ok2 8. 我们可以根据 @interface WebServlet 源码知道可以配置哪些 web.xml init-param 在注解中,如何指定呢? <param-name></param-name> <param-value></param-value> </init-param> @wenInitParam(name="XX",value="yy") 多个就{@wenInitParam(name="XX",value="yy"),@wenInitParam(name="XX1",value="yy1").。。。。} 9. 注解方式开发Servlet和 web.xml配置servlet 流程机制是一样
匹配模式
匹配模式可以更加方便和符合业务逻辑来实现需求,是http请求可以更快找到需要的方法 减少服务器的压力
精确匹配
@WebServlet(“/ok/zs”)//配置路径 :
访问 servlet: localhost:8080/servlet/ok
目录匹配
@WebServlet(“/ok/*”)//配置路径 :
访问文件: localhost:8080/servlet/ok/aaa localhost:8080/servlet/ok/bbb
扩展名匹配
@WebServlet(urlPatterns = “*.action”)
配置路径 : @WebServlet(“.action")
访问文件: localhost:8080/hsp/zs.action localhost:8080/hsp/ls.action
提示: @WebServlet("/.action”) , 不能带 / , 否则 tomcat 报错
任意匹配
@WebServlet(urlPatterns = “/”)
配置路径 : @WebServlet(“/”) @WebServlet(“/*”)
访问文件: localhost:8080/wyx//**
提醒:/ 和 /*的配置,会匹配所有的请求,这个比较麻烦,要避免
具体代码
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @version 1.0 */ //精确匹配 @WebServlet("/ok/zs")//配置路径 : //访问 servlet: localhost:8080/servlet/ok/zs //目录匹配 @WebServlet("/ok/*")//配置路径 : //访问文件: localhost:8080/servlet/ok/aaa localhost:8080/servlet/ok/bbb //扩展名匹配 @WebServlet(urlPatterns = "*.action") // 配置路径 : @WebServlet("*.action") // 访问文件: localhost:8080/hsp/zs.action localhost:8080/hsp/ls.action //提示: @WebServlet("/*.action") , 不能带 / , 否则 tomcat 报错 //任意匹配 @WebServlet(urlPatterns = "/") //配置路径 : @WebServlet("/") @WebServlet("/*") //访问文件: localhost:8080/wyx//** // 提醒:/ 和 /*的配置,会匹配所有的请求,这个比较麻烦,要避免 public class OkServlet5 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("okServlet doPost"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("OkServlet5 doGet"); } }
注意事项和使用细节
当 Servlet 配置了 “/”, 会覆盖 tomcat 的 DefaultServlet, 当其他的 utl-pattern 都匹配不上时 ,都会走这个Servlet, 这样可以拦截到其它静态资源
1、The default servlet for all web applications, that serves static resources. 这个默认的 servlet 是处理静态资源的,一旦拦截,静态资源不能处理
2、当 Servelt 配置了 “/*”, 表示可以匹配任意访问路径
3、提示: 建议不要使用 / 和 /*, 建议尽量使用精确匹配
4、优先级遵守: 精确路径 > 目录路径 > 扩展名路径 > /* >
代码示例
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- The mapping for the default servlet --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>