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>