spring的困惑--org.springframework.web.servlet.DispatcherServlet noHandlerFound3

本文记录了一次使用SpringMVC框架过程中遇到的警告问题及其解决办法。问题表现为访问特定URL时,出现找不到映射的警告。通过调整web.xml中的servlet-mapping设置,将url-pattern从/*更改为/,成功解决了这一问题。

  今天试了下spring mvc遇到个很奇怪的事情,按照书上配置访问时总是出现如下警告:

org.springframework.web.servlet.DispatcherServlet noHandlerFound
警告: No mapping found for HTTP request with URI [/myspring/WEB-INF/jsp/hello.jsp] in DispatcherServlet with name 'spring'

web.xml

Xml代码  收藏代码
  1. <servlet>  
  2.   <servlet-name>spring</servlet-name>  
  3.   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.   <init-param>  
  5.      <param-name>contextConfigLocation</param-name>  
  6.      <param-value>/WEB-INF/springContext.xml</param-value>  
  7.   </init-param>  
  8. </servlet>  
  9.   
  10. <servlet-mapping>  
  11.   <servlet-name>spring</servlet-name>  
  12.   <url-pattern>/*</url-pattern>  
  13. </servlet-mapping>  

 springContext.xml

Xml代码  收藏代码
  1. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  2.     <property name="prefix" value="/WEB-INF/jsp/" />  
  3.     <property name="suffix" value=".jsp" />  
  4.  </bean>  
  5.        
  6.  <bean name="/hc"  class="com.hj.controllers.HelloController"/>  

   HelloController.java

Java代码  收藏代码
  1. @Override  
  2. protected ModelAndView handleRequestInternal(HttpServletRequest request,  
  3.         HttpServletResponse response) throws Exception {  
  4.   
  5.     return new ModelAndView("hello");  
  6. }  

   在项目/WEB-INF/jsp目录下防止hello.jsp文件。按照上述配置访问http://localhost:8081/myspring/hc,应该是出现hello.jsp内容才对,但是却出现了一开始提到的警告。我搜索了许多地方,结果在一老外的提供中找到了同样的问题(http://forum.springsource.org/archive/index.php/t-71263.html),解决方法老外也说明了,只是不知道为什么。

  就是将web.xml中

Xml代码  收藏代码
  1. <servlet-mapping>  
  2.     <servlet-name>spring</servlet-name>  
  3.     <url-pattern>/*</url-pattern>  
  4.   </servlet-mapping>  

  改成

 

Java代码  收藏代码
  1. <servlet-mapping>  
  2.     <servlet-name>spring</servlet-name>  
  3.     <url-pattern>/</url-pattern>  
  4.   </servlet-mapping>  

 

/*强迫所有的请求及响应都经过该servlet; 
/将使你配置的servlet成为默认的servlet。

 

untitled3:war exploded: Deploy took 3,923 milliseconds 11:14:22.577 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/", parameters={} 11:14:22.583 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped to org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@3e86ff1f 11:14:22.588 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 404 NOT_FOUND 11:14:22.596 [http-nio-8080-exec-2] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/", parameters={} 11:14:22.596 [http-nio-8080-exec-2] DEBUG org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped to org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@3e86ff1f 11:14:22.596 [http-nio-8080-exec-2] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 404 NOT_FOUND 11:14:23.809 [http-nio-8080-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/", parameters={} 11:14:23.810 [http-nio-8080-exec-3] DEBUG org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped to org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@3e86ff1f 11:14:23.811 [http-nio-8080-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 404 NOT_FOUND 11:14:25.192 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/favicon.ico", parameters={} 11:14:25.192 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped to org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@3e86ff1f 11:14:25.193 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 404 NOT_FOUND
最新发布
09-01
<think> 我们面对两个核心问题: 1. HTTP 500错误:由`FoodMapper.xml`文件的UTF-8编码问题引起 2. 404 NOT_FOUND:可能与Spring MVC配置相关 根据引用内容,主要原因是XML文件解析时出现UTF-8序列无效错误。常见原因是文件实际编码与声明编码不符,特别是含有中文注释时(引用[1][4])。同时,404错误可能与Spring MVC的控制器配置或请求映射有关。 解决方案分两部分: ### 第一部分:解决HTTP 500错误(编码问题) **步骤1:检查并修正XML文件编码** - 确保`FoodMapper.xml`文件实际编码为UTF-8无BOM(引用[4]) - 使用文本编辑器(如VS Code)打开文件,查看右下角编码显示,若为GBK或带BOM的UTF-8则需转换 - 将文件转换为UTF-8无BOM格式(可用`iconv`或编辑器另存为) **步骤2:修正XML声明** 确保文件第一行声明与实际编码匹配: ```xml <?xml version="1.0" encoding="UTF-8"?> ``` **步骤3:配置Maven保证编译时编码正确**(引用[4]) 在`pom.xml`中添加: ```xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ``` **步骤4:配置IDE全局编码**(引用[4]) - IntelliJ IDEA: `File -> Settings -> Editor -> File Encodings` - 设置Global Encoding、Project Encoding、Default encoding for properties files均为UTF-8 - 勾选“Transparent native-to-ascii conversion” ### 第二部分:解决404 NOT_FOUND错误 **步骤1:检查Spring MVC配置** 确保已启用注解驱动(引用[2]): ```xml <mvc:annotation-driven /> ``` **步骤2:检查控制器扫描包配置** 在Spring配置文件中,确保扫描包路径包含控制器所在包: ```xml <context:component-scan base-package="com.example.controller" /> ``` **步骤3:验证请求映射** 在控制器中,检查`@RequestMapping`注解的路径是否正确: ```java @Controller public class FoodController { @RequestMapping("/foods") // 确保路径与请求URL匹配 public String listFoods(Model model) { // ... return "foods"; } } ``` **步骤4:检查视图解析器配置** 确保视图前缀和后缀正确,例如: ```xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> ``` 此时控制器返回"foods"将解析为`/WEB-INF/views/foods.jsp` ### 第三部分:验证修复 1. 清理并重新构建项目:`mvn clean package` 2. 重启Tomcat服务器 3. 访问URL时使用正确路径(如`http://localhost:8080/your_context/foods`) 通过以上步骤,HTTP 500错误和404错误应被解决。若仍有问题,请检查Tomcat日志中的详细错误信息。 §§相关问题§§ 1. 如何批量检测项目中的XML文件编码是否一致? 2. Spring MVC中如何配置多个视图解析器? 3. 如何验证Spring的组件扫描(component-scan)是否包含了所有需要的包? 4. 使用MyBatis时,除了编码问题外还有哪些常见配置错误会导致启动失败? 5.Spring MVC中,如何全局处理404错误页面? </think> ### 解决 Spring MVC 项目 HTTP 500 错误及 404 问题的完整方案 #### 一、解决 HTTP 500 错误(编码问题) **核心问题**:`FoodMapper.xml` 文件的 UTF-8 编码无效(1 字节的 UTF-8 序列无效) ##### 解决方案: 1. **转换文件编码**(关键步骤) ```bash # 转换文件编码(Windows 用户使用记事本另存为 UTF-8) iconv -f GBK -t UTF-8 src/main/resources/mappers/FoodMapper.xml > fixed.xml mv fixed.xml src/main/resources/mappers/FoodMapper.xml ``` 2. **添加 XML 声明头**(确保第一行) ```xml <?xml version="1.0" encoding="UTF-8"?> <mapper namespace="com.seecen.dao.FoodDao"> <!-- SQL 内容 --> </mapper> ``` 3. **配置 Maven 强制 UTF-8 编码**(引用[1][4]) ```xml <!-- pom.xml 添加 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.0</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> ``` 4. **IDE 全局编码设置**(引用[4]) - IntelliJ:`File > Settings > Editor > File Encodings` - 设置 Global/Project Encoding 为 UTF-8 - 勾选 "Transparent native-to-ascii conversion" #### 二、解决 404 NOT_FOUND 问题 **核心问题**:Controller 未正确注册或请求路径不匹配 ##### 解决方案: 1. **启用注解驱动**(关键配置,引用[2]) ```xml <!-- springmvc-servlet.xml --> <mvc:annotation-driven /> ``` 2. **检查控制器扫描配置** ```xml <context:component-scan base-package="com.seecen.controller" /> ``` 3. **验证控制器映射**(示例) ```java @Controller @RequestMapping("/food") // 确保路径唯一 public class FoodController { @GetMapping("/list") // 明确请求方法 public String listFoods(Model model) { // 获取数据 return "food-list"; // 视图名称 } } ``` 4. **配置视图解析器** ```xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> ``` #### 三、解决 Bean 依赖问题 **核心问题**:`foodController` → `foodService` → `foodDao` 依赖链断裂 ##### 解决方案: 1. **添加 Service 层注解** ```java @Service // 关键注解 public class FoodServiceImpl implements FoodService { @Autowired private FoodDao foodDao; } ``` 2. **配置 MyBatis 扫描** ```xml <!-- application.xml --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.seecen.dao"/> </bean> ``` 3. **验证 SQLSessionFactory 配置** ```xml <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mappers/*.xml"/> </bean> ``` #### 四、验证步骤 1. 清理并重建项目: ```bash mvn clean package ``` 2. 检查 `target` 目录下的 `FoodMapper.xml` 文件编码: ```bash file -i target/classes/mappers/FoodMapper.xml # 应显示: charset=utf-8 ``` 3. 访问测试 URL: `http://localhost:8080/food/list` > **诊断技巧**:启动时观察控制台日志,确保看到: > - `Mapped URL path [/food/list] onto method ...` > - `Finished Spring MVC initialization in X ms` #### 五、预防措施 1. **Git 预提交钩子检查编码**(`.git/hooks/pre-commit`): ```bash #!/bin/sh find src -name "*.xml" -exec file -i {} \; | grep -v "utf-8" # 存在非UTF-8文件则阻止提交 ``` 2. **统一团队编辑器配置**(引用[4]) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值