<mvn:default-servlet-handler/>标签作用

servlet在找页面时,走的是dispatcherServlet路线。找不到的时候会报404

加上这个默认的servlet时候,servlet在找不到的时候会去找静态的内容。


另外一篇文章介绍了访问静态文件的几种方法:

访问到静态的文件,如jpg,js,css

  

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。

目的:可以正常访问静态文件,不要找不到静态文件报404。


方案一:激活Tomcat的defaultServlet来处理静态文件
[html]  view plain copy
  1. <servlet-mapping>     
  2.     <servlet-name>default</servlet-name>    
  3.     <url-pattern>*.jpg</url-pattern>       
  4. </servlet-mapping>      
  5. <servlet-mapping>         
  6.     <servlet-name>default</servlet-name>      
  7.     <url-pattern>*.js</url-pattern>      
  8. </servlet-mapping>      
  9. <servlet-mapping>          
  10.     <servlet-name>default</servlet-name>         
  11.     <url-pattern>*.css</url-pattern>        
  12. </servlet-mapping>      
  13. 要配置多个,每种文件配置一个  

要写在DispatcherServlet的前面, 让 defaultServlet先拦截,这个就不会进入Spring了 


Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 -- "default"
Google App Engine 默认 Servlet的名字 -- "_ah_default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字  -- "FileServlet"
WebSphere  默认 Servlet的名字 -- "SimpleFileServlet" 


方案二: 在spring3.0.4以后版本提供了mvc:resources 
mvc:resources 的使用方法:
[html]  view plain copy
  1. <!-- 对静态资源文件的访问 -->      
  2. <mvc:resources mapping="/images/**" location="/images/" />    

[html]  view plain copy
  1. <span style="font-weight: normal;">mapping<span style="font-family: Arial; line-height: 1.5em; ">映射到ResourceHttpRequestHandler进行处理  
  2. location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中  
  3. cache-period 可以使得静态资源进行web cache </span></span>  

如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。 
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

 

使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,否则无法处理static resources request.


方案三 ,使用<mvc:default-servlet-handler/>
[html]  view plain copy
  1. <mvc:default-servlet-handler/>  

会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler处理并返回.DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

 

补充说明:多个HandlerMapping的执行顺序问题:

DefaultAnnotationHandlerMapping的order属性值是:0
<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping的order属性值是: 2147483646

<mvc:default-servlet-handler/>自动注册 的SimpleUrlHandlerMapping 的order属性值是: 2147483647

spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫a.jpg的Action。再按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹 "/**"的,所以一定会匹配上,再响应图片。


<think>嗯,用户的问题是关于Maven项目中无法找到webapp下的main.jsp文件,并且提到了jakarta.servlet的依赖问题。首先,我需要回忆一下Maven项目的标准目录结构。Maven的web项目通常把web资源放在src/main/webapp目录下,包括JSP文件。如果文件找不到,可能是因为目录结构不正确,或者配置有问题。 接下来,用户提到使用jakarta.servlet的依赖,这可能涉及到Tomcat版本的问题。高版本的Tomcat(如10及以上)使用了jakarta包名,而低版本则是javax。如果依赖配置不正确,可能会导致编译或运行时找不到相关的类,进而影响JSP文件的解析。 然后,我需要检查用户提供的依赖配置是否正确。用户引用了参考中的代码,其中提到了javax.servlet-api的依赖,但Tomcat版本过高可能需要改用jakarta.servlet-api。所以,用户需要确认Tomcat版本,并选择对应的依赖。例如,Tomcat 10+使用jakarta.servlet,版本号可能是5.0.0或更高,而Tomcat 9及以下使用javax.servlet,版本号如4.0.1。 另外,项目结构是否正确也很重要。确保webapp目录位于src/main下,并且没有被错误地放置在src/main/resources或其他位置。同时,检查pom.xml中的packaging是否为war,确保项目被打包成Web应用。 还有可能是IDE的配置问题,比如没有正确识别webapp目录。在Eclipse或IntelliJ中,可能需要手动标记目录为Web资源根目录。此外,Maven的clean和install操作可以清除缓存并重新生成项目结构,有时候能解决路径问题。 最后,用户可能需要配置Maven插件,如maven-war-plugin,确保资源文件被正确包含。如果JSP文件放在非标准位置,需要显式配置插件来包含这些文件。 总结下来,解决方案应包括:检查目录结构、确认Tomcat版本和依赖、检查pom.xml配置、IDE设置、清理项目以及可能的插件配置。同时,生成相关问题时要覆盖常见的Maven Web项目问题,比如依赖冲突、目录结构、插件配置等。</think>### Maven项目中webapp下main.jsp文件无法找到的解决方案 #### 1. 检查标准目录结构 Maven Web项目必须遵循以下结构: ``` src/ ├── main/ │ ├── java/ │ ├── resources/ │ └── webapp/ <-- JSP文件存放位置 │ ├── WEB-INF/ │ └── main.jsp ``` + **关键验证点**: - 确认`main.jsp`位于`src/main/webapp`目录(不是`src/main/resources`) - 检查`pom.xml`中的打包方式:`<packaging>war</packaging>` #### 2. 添加正确的Servlet依赖 根据Tomcat版本选择依赖: ```xml <!-- Tomcat 10+ 使用 --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> <!-- Tomcat 9- 使用 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> ``` **注意**:错误使用javax/jakarta依赖会导致`ClassNotFoundException`[^1] #### 3. 配置Maven插件 在`pom.xml`中添加: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <warSourceDirectory>src/main/webapp</warSourceDirectory> </configuration> </plugin> </plugins> </build> ``` #### 4. IDE配置检查 + **IntelliJ**:右键`webapp`目录 → `Mark Directory as` → `Web Resource Directory` + **Eclipse**:项目属性 → `Project Facets` → 勾选`Dynamic Web Module` + **通用操作**:执行`mvn clean install`重新构建项目 #### 5. 部署验证 部署后检查生成的WAR包结构: ``` project.war ├── META-INF/ └── WEB-INF/ ├── classes/ └── main.jsp <-- 确认文件存在 ``` ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值