Servlet和Filter的url匹配url-pattern

本文详细解析了Servlet容器如何根据URL匹配Servlet的过程及规则,并解释了Filter与Servlet匹配的不同之处,帮助开发者理解并正确配置web.xml。

Servlet和filter是J2EE开发中常用的<nobr oncontextmenu="return false" id="clickeyekey0" onmousemove="kwM(0)" onmouseover="kwE(event,0, this)" onclick="kwC(event,0)" onmouseout="kwL(event,this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">技术</nobr>,使用方便,配置简单,老少皆宜。

  估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet和filter中的url-pattern还是有一些文章在里面的,总结了一些东西,放出来供大家参考,以免遇到问题又要浪费时间。

<clk>  一、servlet<nobr oncontextmenu="return false" id="clickeyekey1" onmousemove="kwM(1)" onmouseover="kwE(event,1, this)" onclick="kwC(event,1)" onmouseout="kwL(event,this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">容器</nobr>对url的匹配过程: </clk>

  当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:

  1. 精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。

  2. 最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

  3. 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action

  4. 如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。

  根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。

  对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。

  二、url-pattern详解

  在web.xml文件中,以下语法用于定义映射:

  以”/’开头和以”/*”结尾的是用来做路径映射的。

  以前缀”*.”开头的是用来做扩展映射的。

  ”是用来定义default servlet映射的。

  剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action

  所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>web application framework</display-name> <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/waf</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <session-config> <session-timeout>60</session-timeout> <cookie-config><name>JSESSIONID</name></cookie-config> </session-config> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring_context.xml ,classpath:quartz_context.xml ,classpath:spring_context_misc.xml ,classpath:bpms_context.xml, classpath:process_group.xml </param-value> </context-param> <listener> <listener-class>cn.ccccltd.waf.listener.SessionListener</listener-class> </listener> <listener> <listener-class>cn.ccccltd.waf.listener.CacheFileEvent</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.apache.commons.fileupload.servlet.FileCleanerCleanup</listener-class> </listener> <listener> <listener-class>cn.ccccltd.bpms.BpmsInitializer</listener-class> </listener> <listener> <listener-class>cn.ccccltd.bpms.ou.listener.BpmsSessionListener</listener-class> </listener> <filter> <filter-name>SigninFilter</filter-name> <filter-class>cn.ccccltd.waf.SigninFilter</filter-class> <init-param> <param-name>signinUrlPattern</param-name> <param-value>bo,dhtml,dhtm,shtml,shtm</param-value> </init-param> </filter> <filter-mapping> <filter-name>SigninFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- ****************************************************************************** --> <filter> <filter-name>xssFilter</filter-name> <filter-class>cn.ccccltd.waf.filter.XssFilter</filter-class> </filter> <filter-mapping> <filter-name>xssFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>SSOLoginFilter</filter-name> <filter-class>cn.ccccltd.waf.sso.controller.SSORequestController</filter-class> </filter> <filter-mapping> <filter-name>SSOLoginFilter</filter-name> <url-pattern>*.bo</url-pattern> </filter-mapping> <!--<filter> <filter-name>springSessionRepositoryFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSessionRepositoryFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>--> <servlet> <servlet-name>appDispatcher</servlet-name> <servlet-class>cn.ccccltd.waf.AppDispatcher</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring_dispatcher_context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- Spring MVC 请求映射 --> <servlet-mapping> <servlet-name>appDispatcher</servlet-name> <url-pattern>*.bo</url-pattern> </servlet-mapping> <servlet> <servlet-name>appLoader</servlet-name> <servlet-class>cn.ccccltd.waf.AppLoader</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet> <servlet-name>monitorLoader</servlet-name> <servlet-class>cn.ccccltd.waf.MonitorLoader</servlet-class> <load-on-startup>30</load-on-startup> </servlet> <servlet> <servlet-name>fileUpload</servlet-name> <servlet-class>cn.ccccltd.waf.tool.FileUpload</servlet-class> <load-on-startup>97</load-on-startup> </servlet> <servlet> <servlet-name>randomCode</servlet-name> <servlet-class>cn.ccccltd.waf.tool.RandomCode</servlet-class> <load-on-startup>99</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appDispatcher</servlet-name> <url-pattern>*.dhtml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>appDispatcher</servlet-name> <url-pattern>*.dhtm</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>appDispatcher</servlet-name> <url-pattern>*.shtml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>appDispatcher</servlet-name> <url-pattern>*.shtm</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>fileUpload</servlet-name> <url-pattern>/waf/tool/fileUpload</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>randomCode</servlet-name> <url-pattern>/waf/tool/randomCode</url-pattern> </servlet-mapping> <servlet> <servlet-name>FileUploadServlet</servlet-name> <servlet-class>cn.ccccltd.comm.upload.FileUploadServlet</servlet-class> <init-param> <param-name>fileSizeLimit</param-name> <param-value>2000</param-value> </init-param> </servlet> <servlet> <servlet-name>DeleteFileServlet</servlet-name> <servlet-class>cn.ccccltd.comm.upload.DeleteFileServlet</servlet-class> </servlet> <servlet> <servlet-name>FileDownloadServlet</servlet-name> <servlet-class>cn.ccccltd.comm.upload.FileDownloadServlet</servlet-class> </servlet> <!-- 帆软报表 --> <!-- <servlet> <servlet-name>ReportServer</servlet-name> <servlet-class>com.fr.web.ReportServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ReportServer</servlet-name> <url-pattern>/ReportServer</url-pattern> </servlet-mapping> --> <servlet-mapping> <servlet-name>FileDownloadServlet</servlet-name> <url-pattern>/FileDownloadServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>FileUploadServlet</servlet-name> <url-pattern>/FileUploadServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>DeleteFileServlet</servlet-name> <url-pattern>/DeleteFileServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- error-page START --> <!-- 400 --> <error-page> <error-code>400</error-code> <location>/errorPage.jsp</location> </error-page> <!-- 403 --> <error-page> <error-code>403</error-code> <location>/errorPage.jsp</location> </error-page> <!-- 404 --> <error-page> <error-code>404</error-code> <location>/errorPage.jsp</location> </error-page> <!-- 500 --> <error-page> <error-code>500</error-code> <location>/errorPage.jsp</location> </error-page> <!-- error-page END --> </web-app>那你给我修改一下文件都在项目之中。
06-11
<think>我们正在解决如何修改web.xml以确保所有引用的配置文件都存在于项目目录中并正确加载的问题。根据引用,web.xml中主要使用contextConfigLocation参数指定Spring配置文件,以及通过其他方式(如quartz的插件)加载配置文件。步骤:1.检查contextConfigLocation参数:该参数用于指定Spring的配置文件位置。在引用[1]中,使用了classpath:前缀,表示从类路径加载;引用[2]中使用了/WEB-INF/目录。我们需要确保这些文件在项目的对应位置存在。2.对于quartz的配置文件,引用[3]提到quartz会使用插件加载自己的xml配置文件,默认从classes目录加载(如classes/quartz_jobs.xml)。我们需要确保这些文件存在。3.检查DispatcherServlet的配置,如引用[4]中配置了DispatcherServlet,它会默认加载WEB-INF下的[servlet-name]-servlet.xml(如springDispatcherServlet-servlet.xml)。同时也可能通过contextConfigLocation指定其他文件。具体操作:1.在web.xml中,我们通常会使用context-param来定义全局的Spring配置文件,然后使用listener(ContextLoaderListener)来加载。例如:<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-common-config.xml,classpath:spring-budget-config.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>注意:这里使用了classpath,那么这些文件应该放在项目的src/main/resources目录下(如果是Maven项目),这样编译后才会在类路径中。2.另外,我们可能还有DispatcherServlet的配置,它会加载自己的配置文件。但是,如果我们在contextConfigLocation中已经包含了所有的配置,DispatcherServlet也可以不单独配置,或者只配置一个空的contextConfigLocation,然后通过父上下文来共享。3.对于quartz的配置文件,引用[3]提到需要放在classes目录下(即类路径下)。所以,在项目中我们放在src/main/resources/scheduler/quartz_jobs.xml,然后在配置中指定路径。如何确保文件存在?-在IDE中检查文件位置:*对于classpath:spring-common-config.xml,在src/main/resources下应该有spring-common-config.xml。*对于/WEB-INF/applicationContext*.xml,在webapp/WEB-INF目录下应该有applicationContext开头的xml文件(如果使用这种配置方式)。-如果不存在,需要创建这些文件或调整路径。修改建议:-统一使用classpath方式加载,这样无论文件在哪个模块,只要在类路径中就可以。-如果有些配置文件必须放在WEB-INF目录下(如为了安全),则使用/WEB-INF/...的路径,并确保文件位置。示例:修改contextConfigLocation,确保所有配置文件都存在且路径正确<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/spring-common-config.xml,classpath:spring/spring-budget-config.xml,/WEB-INF/applicationContext-security.xml</param-value></context-param>注意:如果混合使用classpath文件路径,需要注意Spring是否支持。通常,Spring支持多种前缀,包括classpath:、file:、以及不使用前缀(相对于Web应用根路径)。但是,为了避免混淆,建议全部使用classpath。另外,如果使用多个模块,可以考虑使用通配符,如引用[2]中的:/WEB-INF/applicationContext*.xml但是,通配符在classpath中也是支持的,如:classpath*:spring/applicationContext-*.xml关于quartz的配置:通常,quartz的配置文件并不在contextConfigLocation中指定,而是由quartz自己加载。因此,我们需要按照引用[3]所说,将文件放在类路径下的指定位置。例如,我们可以在quartz.properties中指定:org.quartz.plugin.jobInitializer.fileNames=scheduler/quartz_jobs.xml那么,在项目中的位置就是src/main/resources/scheduler/quartz_jobs.xml。最后,建议检查项目结构,确保所有文件都被正确放置在以下位置:-Spring配置文件:src/main/resources/spring/...-WEB-INF下的配置文件:src/main/webapp/WEB-INF/...-quartz配置文件:src/main/resources/scheduler/...并且,在构建后(如mvnpackage),这些文件会被复制到:-classpath下的文件会在WEB-INF/classes目录下(或jar文件内)-WEB-INF下的配置文件会直接在WEB-INF目录下因此,修改web.xml后,需要确保这些文件在项目构建后出现在目标位置。可以通过检查构建后的war文件结构来确认。总结步骤:1.检查web.xml中contextConfigLocation参数指定的文件路径。2.确保这些文件在项目中存在(检查源代码目录中的位置)。3.如果文件不存在,创建它们或者调整路径。4.对于其他框架的配置文件(如quartz),确保它们被放在正确的路径并被正确配置(不一定是web.xml中,可能是框架的配置文件)。5.测试应用启动,查看日志是否有配置文件加载失败的错误。特别提示:如果项目是使用Maven构建,在pom.xml中需要确保资源文件被正确包含(默认src/main/resources下的文件会被包含到类路径)。</think> ### 修正 web.xml 配置的完整指南 #### 步骤 1:验证 contextConfigLocation 配置 1. **检查所有引用文件路径**: ```xml <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-common-config.xml, classpath:spring-budget-config.xml, classpath:/scheduler/quartz_jobs.xml </param-value> </context-param> ``` *需要确保这些文件存在于以下位置:* - `src/main/resources/spring-common-config.xml` - `src/main/resources/spring-budget-config.xml` - `src/main/resources/scheduler/quartz_jobs.xml` 2. **项目目录验证**(Maven 标准结构): ``` project-root/ └── src/ └── main/ ├── java/ ├── resources/ │ ├── spring-common-config.xml │ ├── spring-budget-config.xml │ └── scheduler/ │ └── quartz_jobs.xml └── webapp/ └── WEB-INF/ └── web.xml ``` [^1][^2] #### 步骤 2:解决 Quartz 配置加载 1. **明确配置 Quartz 初始化器**: ```xml <context-param> <param-name>quartz:configLocation</param-name> <param-value>classpath:scheduler/quartz_jobs.xml</param-value> </context-param> ``` 在 `quartz_jobs.xml` 中确保包含: ```xml <job> <job-detail> <name>ExampleJob</name> <job-class>com.example.QuartzJob</job-class> </job-detail> </job> ``` [^3] #### 步骤 3:优化 Spring 上下文加载 1. **通配符简化配置**: ```xml <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:spring-*-config.xml </param-value> </context-param> ``` *匹配所有以 `spring-` 开头且以 `-config.xml` 结尾的文件* 2. **DispatcherServlet 配置优化**: ```xml <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> <!-- 使用根上下文 --> </init-param> <load-on-startup>1</load-on-startup> </servlet> ``` [^4] #### 步骤 4:验证配置的工具方法 1. **启动检查脚本** (在应用初始化时执行): ```java public void contextInitialized(ServletContextEvent sce) { String[] configs = {"spring-common-config.xml", "scheduler/quartz_jobs.xml"}; for(String config : configs) { if(getClass().getClassLoader().getResource(config) == null) { throw new RuntimeException("缺失配置文件: " + config); } } } ``` 2. **日志验证配置**: ```xml <!-- 在 log4j2.xml 中添加 --> <Logger name="org.springframework.context" level="DEBUG"/> ``` 启动时会输出: ``` DEBUG: Loading Spring contexts from [classpath:spring-common-config.xml] ``` #### 最佳实践建议 1. **配置集中管理**: - 创建核心配置文件 `spring-core-config.xml` - 其他文件通过 `<import>` 引入: ```xml <import resource="classpath:spring-security-config.xml"/> ``` 2. **环境区分策略**: ```xml <context-param> <param-name>spring.profiles.active</param-name> <param-value>production</param-value> </context-param> ``` 对应创建 `spring-common-config-production.xml` 3. **构建时验证**(Maven POM 配置): ```xml <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <executions> <execution> <id>verify-resources</id> <phase>process-resources</phase> <goals> <goal>validate</goal> </goals> <configuration> <files> <file>src/main/resources/quartz_jobs.xml</file> </files> </configuration> </execution> </executions> </plugin> ``` #### 常见问题排查 1. **404 配置文件错误**: - 检查类路径:`mvn dependency:build-classpath` - 确认资源过滤:`mvn resources:resources` 2. **XML 语法错误**: ```bash xmllint --noout src/main/resources/*.xml ``` 3. **Spring 上下文初始化失败**: - 查看 `org.springframework.context` 的 DEBUG 日志 - 检查是否有 `BeanDefinitionStoreException` > **关键点**:所有路径需遵循 Maven/Gradle 的约定,资源文件必须放在 `src/main/resources` 下才能正确打包到 WAR 文件的 `WEB-INF/classes` 中。[^1][^2][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值