web应用程序servlet的映射名称的规则及请求过程
2016-06-15 01:06
239 查看
首先用MyEclipse创建一个web Project(工程名起为TestServletProject),新建一个Servlet(这里servlet的名字起TestServlet),将请求的servlet映射名称设为/TestServlet,(具体步骤可以查看tomcat上servlet程序的配置与处理servlet请求过程)。并在TestServlet的doGet方法中在控制台打印一句“this is TestServlet”
jxf.servlet.TestServlet.java
此时打开工程的web.xml配置文件
将项目部署(在tomcat服务器)好后在浏览器中输入http://localhost:8081/TestServletProject/TestServlet(我的端口为8081),这时候服务器就会先找到TestServletProject工程下的web.xml,然后寻找这一次请求的映射路径/TestServlet,如上图绿色注释部分 根据映射/TestServlet找到注释1,然后找到同级servlet的映射内部名称注释2,在根据映射的内部名称找到servlet的内部名称注释3,最后找到同级的servlet的具体类名注释4,然后服务器在根据反射执行这个类的doGet方法...详细的Servlet请求的整个生命周期就不在这里讨论了。
最终在控制台输出this is TestServlet,并且页面上也显示出当前系统时间,说明该Servlet被请求并执行了。
本文主要介绍 请求servlet的映射路径 的写法:
上面的例子就是一种写法,为精确匹配
如:
/first http://localhost:8080/ProjectName/first
/xxx/demoServlet http://localhost:8080/ProjectName/xxx/demoServlet
还有一种写法是模糊匹配如:
/* http://localhost:8080/ProjectName/任意路径
/test/* http://localhost:8080/ProjectName/test/任意路径
*.后缀名 http://localhost:8080/ProjectName/任意路径.do 如:*.do *.action *.html(伪静态)
假如将上面的配置文件
<url-pattern>/TestServlet</url-pattern>改为<url-pattern>/*</url-pattern>
在浏览器地址栏中输入http://localhost:8080/ProjectName/xxxx(任意的请求映射路径/xxxx)一样可以请求到TestServlet.
注意:
1)url-pattern(请求servlet的映射路径)要么以 / 开头,要么以*开头。 例如, 只写test是非法路径。
2)不能同时使用两种模糊匹配,例如 /test/*.do是非法路径
3)当有输入的URL有多个servlet同时被匹配的情况下:
3.1 精确匹配优先。(长的最像优先被匹配,这里就做不验证了)
3.2 以后缀名结尾的模糊url-pattern优先级最低
4)虽然能够以/开头(/和/*两种写法是等价的),但是不推荐这种写法。为什么?
注意4解答:
当上面的配置文件<url-pattern>/TestServlet</url-pattern>改为<url-pattern>/*</url-pattern> 以后,我们想要访问项目中默认的静态文件index.html(创建项目后就自动有了),在浏览器中输入http://localhost:8080/ProjectName/index.html,发现请求的结果也是页面输出当前系统时间,控制台也输出this is TestServlet,可见其实最终访问到的是/TestServlet。因为 “请求servlet的映射路径”已经匹配到,服务器就当成是请求该servlet了。所以这里最好不要只写/或/*,因为项目中的其他静态资源都将无法访问到。
可以查看 tomcat根目录/conf/web.xml ,有下面一段代码
可以得知,/是servlet中预定义好的一个映射路径:servlet的缺省映射路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个映射路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。
并且通过此我们还可以得出一个结论:先找动态资源,当动态资源不存在的时候,再找静态资源
jxf.servlet.TestServlet.java
package jxf.servlet; import java.io.IOException; import java.util.Date; import java.io.PrintWriter; import java.text.SimpleDateFormat; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); System.out.println("this is TestServlet"); } }
此时打开工程的web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name></display-name> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <!--3、 servlet的内部名称--> <servlet-name>TestServlet</servlet-name> <!--4、 servlet的类全名: 包名+简单类名 --> <servlet-class>jxf.servlet.TestServlet</servlet-class> </servlet> <servlet-mapping> <!--2、 servlet的映射内部名称,通过他可以找到上面的servlet的内部名称--> <servlet-name>TestServlet</servlet-name> <!--1、 请求servlet的映射路径--> <url-pattern>/TestServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
将项目部署(在tomcat服务器)好后在浏览器中输入http://localhost:8081/TestServletProject/TestServlet(我的端口为8081),这时候服务器就会先找到TestServletProject工程下的web.xml,然后寻找这一次请求的映射路径/TestServlet,如上图绿色注释部分 根据映射/TestServlet找到注释1,然后找到同级servlet的映射内部名称注释2,在根据映射的内部名称找到servlet的内部名称注释3,最后找到同级的servlet的具体类名注释4,然后服务器在根据反射执行这个类的doGet方法...详细的Servlet请求的整个生命周期就不在这里讨论了。
最终在控制台输出this is TestServlet,并且页面上也显示出当前系统时间,说明该Servlet被请求并执行了。
本文主要介绍 请求servlet的映射路径 的写法:
上面的例子就是一种写法,为精确匹配
如:
/first http://localhost:8080/ProjectName/first
/xxx/demoServlet http://localhost:8080/ProjectName/xxx/demoServlet
还有一种写法是模糊匹配如:
/* http://localhost:8080/ProjectName/任意路径
/test/* http://localhost:8080/ProjectName/test/任意路径
*.后缀名 http://localhost:8080/ProjectName/任意路径.do 如:*.do *.action *.html(伪静态)
假如将上面的配置文件
<url-pattern>/TestServlet</url-pattern>改为<url-pattern>/*</url-pattern>
在浏览器地址栏中输入http://localhost:8080/ProjectName/xxxx(任意的请求映射路径/xxxx)一样可以请求到TestServlet.
注意:
1)url-pattern(请求servlet的映射路径)要么以 / 开头,要么以*开头。 例如, 只写test是非法路径。
2)不能同时使用两种模糊匹配,例如 /test/*.do是非法路径
3)当有输入的URL有多个servlet同时被匹配的情况下:
3.1 精确匹配优先。(长的最像优先被匹配,这里就做不验证了)
3.2 以后缀名结尾的模糊url-pattern优先级最低
4)虽然能够以/开头(/和/*两种写法是等价的),但是不推荐这种写法。为什么?
注意4解答:
当上面的配置文件<url-pattern>/TestServlet</url-pattern>改为<url-pattern>/*</url-pattern> 以后,我们想要访问项目中默认的静态文件index.html(创建项目后就自动有了),在浏览器中输入http://localhost:8080/ProjectName/index.html,发现请求的结果也是页面输出当前系统时间,控制台也输出this is TestServlet,可见其实最终访问到的是/TestServlet。因为 “请求servlet的映射路径”已经匹配到,服务器就当成是请求该servlet了。所以这里最好不要只写/或/*,因为项目中的其他静态资源都将无法访问到。
可以查看 tomcat根目录/conf/web.xml ,有下面一段代码
<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> <!--中间有很多代码--> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
可以得知,/是servlet中预定义好的一个映射路径:servlet的缺省映射路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个映射路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。
并且通过此我们还可以得出一个结论:先找动态资源,当动态资源不存在的时候,再找静态资源
相关文章推荐
- “爸爸用键盘养活了全家”
- ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux Error: 2: No suc
- 53. Maximum Subarray
- iOS多线程_获取线程队列执行完毕的信号
- (?)企业部分之高可用集群(1)
- Android Studio开发JNI - 第一个JNI程序
- [LeetCode] Rearrange String k Distance Apart 按距离为k隔离重排字符串
- 【翻译】Ext JS 6.2 早期访问版本发布
- 微信公众号资料整理
- 递归算法
- 鼠标双击范围基于Win7
- Android应用开发环境的搭建和使用
- Linux read/write fread/fwrite两者区别
- UIwebView的使用,把网页以UIView的形式展示出来
- 【翻译】Ext JS 6.2 早期访问版本发布
- 【翻译】Ext JS 6.2 早期访问版本发布
- 【翻译】Ext JS 6.2 早期访问版本发布
- Python学习笔记(五)
- 一个屌丝程序猿的人生(二十五)
- Linux目录结构