JSP转译成Servlet
转译方法
假设:jsp文件为:test.jsp;项目名为FirstServlet
1. JSP文件可以放到这两个路径任意一个:WebContent,WebContent\jsp
2. 运行Tomcat
3. 浏览器访问test.jsp:http://localhost:8080/FirstServlet/test.jsp
此时会生成两个文件:test_jsp.java,test_jsp.class。所在路径如下:
工作空间路径\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\FirstServlet\org\apache\jsp\
//注意:通过指定HTML文件的form的action属性为test.jsp也可以生成test_jsp.java和test_jsp.class
转译详细过程:
JSP转译成Servlet详细过程
web.xml的url-pattern
简介
servlet或Filter的url请求匹配规则既不是简单的通配,也不是正则表达式,而是由自己的规则。
servlet
- 浏览器发起一个url请求后,该请求发送到servlet容器时,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url:比如url是http://10.43.11.143/myapp/kata/detail.html,其应用上下文是myapp,容器会将http://10.43.11.143/myapp去掉,剩下的/kata/detail.html部分拿来做servlet的映射匹配。
- 这个映射匹配过程有优先顺序:精确路径 > 最长路径 > 扩展名。
- 有一个servlet匹配成功以后,就不会去理会剩下的servlet了。
Filter:
- Filter的匹配规则与servlet一样,但对于filter,不会像servlet那样只匹配一个servlet。
- 因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。
- Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。
w eb.xml示例
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.nau.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>xxxxxx</url-pattern>
<url-pattern>yyyyyyy</url-pattern>
</servlet-mapping>
匹配原则
假设本处有一项目,项目名为myapp,应用上下文(Application Context)为:myapp。
(Application Context在Tomcat设置,见:)
精确匹配
<url-pattern>中配置的项必须与url完全精确匹配。
如配置信息如下:
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/kata/detail.html</url-pattern>
<url-pattern>/demo.html</url-pattern>
<url-pattern>/table</url-pattern>
</servlet-mapping>
如下几种url都会被匹配到该servlet
http://10.43.11.143/myapp/kata/detail.html
http://10.43.11.143/myapp/demo.html
http://10.43.11.143/myapp/table //本处table后不能加/
注意:
http://10.43.11.143/myapp/table/ 是非法的url,不会被当作http://10.43.11.143/myapp/table识别
url后可以跟任意的查询条件,都会被匹配,如:http://10.43.11.143/myapp/table?hello 这个请求就会被匹配到MyServlet。
路径匹配
若匹配信息如下
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/kata/*</url-pattern>
</servlet-mapping>
url只要前面(myapp之后)的路径是/kata,而后面的路径可以任意。
下面的url都会被匹配。
http://10.43.11.143/myapp/kata/demo.html
http://10.43.11.143/myapp/kata/test.jsp
http://10.43.11.143/myapp/kata/test/detail.html
http://10.43.11.143/myapp/kata/action
http://10.43.11.143/myapp/kata/action/
匹配任意url:
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
/与/*的区别
项 | / | /* |
匹配 | 匹配:/**/login, /**/test等 不匹配:/**/login.jsp, /**/test.js等任意有后缀的 | 匹配所有 |
覆盖问题 | 不覆盖任何servlet,只替换了servlet容器中内建的默认servlet。 | 覆盖所有servlet |
扩展名匹配
如果匹配规则如下
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
则任何扩展名为jsp(文件名和路径任意)的url请求都会匹配,比如下面的url都会被匹配
http://10.43.11.143/myapp/a/b/c/demo.jsp
http://10.43.11.143/myapp/test.jsp
路径和扩展名匹配无法同时设置
比如下面的三个<url-pattern>都是非法的,若设置,启动tomcat服务器会报错。
<url-pattern>/kata/*.jsp</url-pattern>
<url-pattern>/*.jsp</url-pattern>
<url-pattern>he*.jsp</url-pattern>
另外注意:<url-pattern>/aa/*/bb</url-pattern> 这个是精确匹配,url必须是 /aa/*/bb,这里的*不是通配的含义
匹配优先级
一个url与多个servlet的匹配规则可以匹配时,按照 “ 精确路径 > 最长路径>扩展名”这样的优先级匹配到对应的servlet。
- 例1:servletA 的url-pattern为 /test,servletB的url-pattern为 /* 。url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。
- 例2:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*。url为:http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
- 例3: servletA的url-pattern:*.action ,servletB的url-pattern为 /* 。url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB
特殊项
<url-pattern></url-pattern>
这种空串的形式。当上下文的根被请求的时候,它将被调用。
这与<welcome-file>的方式是不同的,因为这种形式在当任何子目录被请求的时候不会被调用。当你期望一个“首页servlet”的时候,这种URL模式就是适合你的。
<url-pattern>*</url-pattern>
不能用这个,否则会出错
Tomcat默认的文件
如果url不指定文件,例如:localhost:8080/test/,则会跳到index.html,index.htm或者index.jsp
Idea