web应用程序servlet的映射名称的规则及请求过程
首先用MyEclipse创建一个web Project(工程名起为TestServletProject),新建一个Servlet(这里servlet的名字起TestServlet),将请求的servlet映射名称设为/TestServlet,(具体步骤可以查看tomcat上servlet程序的配置与处理servlet请求过程)。并在TestServlet的doGet方法中在控制台打印一句“this is TestServlet”
jxf.servlet.TestServlet.java
1 package jxf.servlet; 2 import java.io.IOException; 3 import java.util.Date; 4 import java.io.PrintWriter; 5 import java.text.SimpleDateFormat; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 public class TestServlet extends HttpServlet { 12 public void doGet(HttpServletRequest request, HttpServletResponse response) 13 throws ServletException, IOException { 14 response.getWriter().write(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); 15 System.out.println("this is TestServlet"); 16 } 17 }
此时打开工程的web.xml配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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"> 3 <display-name></display-name> 4 <servlet> 5 <description>This is the description of my J2EE component</description> 6 <display-name>This is the display name of my J2EE component</display-name> 7 <!--3、 servlet的内部名称--> 8 <servlet-name>TestServlet</servlet-name> 9 <!--4、 servlet的类全名: 包名+简单类名 --> 10 <servlet-class>jxf.servlet.TestServlet</servlet-class> 11 </servlet> 12 <servlet-mapping> 13 <!--2、 servlet的映射内部名称,通过他可以找到上面的servlet的内部名称--> 14 <servlet-name>TestServlet</servlet-name> 15 <!--1、 请求servlet的映射路径--> 16 <url-pattern>/TestServlet</url-pattern> 17 </servlet-mapping> 18 <welcome-file-list> 19 <welcome-file>index.jsp</welcome-file> 20 </welcome-file-list> 21 </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应用的静态资源文件。
并且通过此我们还可以得出一个结论:先找动态资源,当动态资源不存在的时候,再找静态资源
转载于:https://www.cnblogs.com/fnz0/p/5586019.html
web应用程序servlet的映射名称的规则及请求过程相关推荐
- Linux部署Web应用程序超链接下载中文名称文件404问题解决办法
超链接内容如下: <a href="jsp/plugin/用户手册.doc">用户手册</a> 开发环境为Windows,Tomcat和WebSphere都 ...
- Web 应用程序的自动化测试
如今,大多数的应用软件被写为基于 Web 的应用程序并通过浏览器展示给用户并与之进行交互.不同公司和机构组织都需要测试这些应用程序的有效性.在一个高度交互性和响应的软件流程时代,许多组织倾向于运用敏捷 ...
- JSP、ASP、PHP Web应用程序怎么这么多P!
之前我们说完了计算机网络应用程序的两种结构:C/S,B/S(传送门)今天我们详细说一说B/S开发中的这么多P是干什么的. 1.什么是Web应用程序 一个Web应用程序是由完成特定任务的各种Web组件( ...
- Web 应用程序安全检查表
概述 对于开发人员来说,这很可怕!代码中的一个错误,依赖项中的一个漏洞,一个受感染的开发人员工作站,你的数据库在 Pastebin 中,你就上了新闻. 那么,到哪里寻求指导呢?OWASP 的前 10 ...
- 构建移动Web应用程序的技术堆栈
编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重 ...
- Web应用程序安全性测试指南
由于存储在Web应用程序中的数据量巨大,并且Web上的事务数量增加,因此,对Web应用程序进行适当的安全测试正变得越来越重要. 在本文中,我们将详细了解网站安全测试中使用的关键术语及其测试方法. 什么 ...
- EE Servlet 3:如何在Web应用程序中设置后端服务
在Web应用程序中,提供用户界面(UI)通常只是工作的一半. 许多应用程序都有后端服务支持的要求. 后端服务的一些示例是调度程序进程(批处理),侦听队列并在消息进入时作出响应,或者是简单的事情,例如存 ...
- 使用WebServlet注解和web.xml配置servlet映射路径的区别及注意事项
配置servlet映射路径 一.使用web.xml配置url 二.使用servlet注解设置url 三.有关使用web.xml重写WebServlet注解 一.使用web.xml配置url 格式: & ...
- 解决web应用程序[]中的Servlet[dispatcherServlet]引发了load()异常
今天在学习springMVC入门程序的时候,遇到了如下问题: ```java 24-Nov-2021 11:57:27.506 信息 [RMI TCP Connection(3)-127.0.0.1] ...
最新文章
- Java NIO 学习笔记 缓冲区补充
- bd3.2 Python高级
- 直接拿来用!最火的Android开源项目(完结篇)
- python创建子进程_Python--- subprocess 创建子进程
- Linux 查看服务器开放的端口号
- mysql gtid配置_mysql 5.7 GTID主从配置
- dst发育筛查有意义吗_儿童视力筛查,都筛些啥?
- 循环神经网络(RNN)Recurrent Neural Networks
- 服务器与普通电脑的区别?
- linux系统vi编辑器按esc没反应,关于ubuntu14.04版本vi编辑模式按下ESC无法回到一般模式的问题...
- 轮式联合收割机液压系统设计
- python处理卫星云图获取亮温值
- unity WWW读取StreamingAssets文件
- 公告栏文本横向循环滚动
- 2020-10《信息资源管理 02378》真卷(独家文字版),圈定章节考点+统计真题分布
- 显示651_没有太阳,白天黑夜怎么区分?腕表昼夜显示功能
- 物联网渐行渐近 你准备好了吗?
- 有毒气体检测的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 深脑链启动“天网计划” 向全球征集AI算力
- 微信三方及AE,PR资源
热门文章
- linux删除php文件权限不够,linux - 用php的exec()删除目录文件提示权限不够
- 一个C++工程CPU占用100%问题的排查
- 【算法】 哈希表 自己模拟hashMap
- 95-910-170-源码-FlinkSQL-Flink SQL 中的流和动态表
- 95-872-064-源码-CEP-CepOperator源码
- 95-070-040-源码-源码调试-FLINK源代码调试方式
- 【java】java原生序列化和Kryo序列化性能实例对比分析
- 【Kafka】【未解决】kafka反序列化数据报错jackson2 JsonParseException: Invalid UTF-8 middle byte 0xc0
- Netty : netty 3如何解决空轮询bug
- spark学习-Spark的groupByKey