灵活一点的 Spring MVC 的 Url Mapping

本文介绍了SpringMVC中URL映射的实现方式,包括传统BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping的不足之处,以及如何结合使用@ControllerClassNameHandlerMapping和@RequestMapping来实现更灵活的方法级别的URL映射。

 

Spring MVC 中常见的 URL Mapping 有两种 BeanNameUrlHandlerMappingSimpleUrlHandlerMapping 。但是使用这两种 UrlHandlerMapping 都有不足。前者只能将 Url 定位到 Class 级别;后者缺乏灵活性。

 

在 Spring 2.5 的 MVC 中,有了 @RequestMapping。它能够将 Url Mapping 对应到 Method 级别。但直接将 Url 对应到 Method 也不是很好的方式。

 

其实,将 @RequestMapping 和传统的 UrlHandlerMapping 结合使用,我们就能够得到一个较为理想的解决方案。通过使用 ControllerBeanNameHandlerMapping 或 ControllerClassNameHandlerMapping,我们能够将 Url 对应到 Controller 级别,这只是 Url 中的一级。通过 @RequestMapping,我们可以将最终的 Url 对应到 Method 上。

 

举个例子:

 

@Controller
public class TestController extends BaseController {
	@RequestMapping
	public void create() {
	}
}

 

Spring 配置:

 

<context:component-scan base-package="com.xxx.xxx" />
	
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
	
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
		

 

通过这些代码,我们就可以将 app_root/test/create.(do) (.do 是可换的,这取决于 web.xml 的配置) 对应到 TestController 的 create 方法上了。但是,目前这种 Url Mapping 方式还不能处理 Method overload。

### 解决Spring MVC中No mapping for GET的错误 在Spring MVC框架中,当出现“No mapping for GET”的错误时,通常表示服务器无法找到与请求路径匹配的控制器方法。以下是可能的原因及解决方案: #### 1. 检查Controller类和方法的注解 确保`@Controller`注解正确应用到控制器类上,并且使用了`@RequestMapping`或其派生注解(如`@GetMapping`、`@PostMapping`等)来定义映射路径[^1]。 ```java @Controller @RequestMapping("/dummy") public class DummyController { @GetMapping("/home") public String home() { return "home"; // 返回视图名称 } } ``` 如果未正确配置这些注解,可能会导致路径无法匹配。 --- #### 2. 配置扫描包路径 如果控制器所在的包路径未被Spring扫描到,也会导致路径无法匹配。需要确保在配置文件或Java配置类中正确指定了扫描路径[^4]。 例如,在Spring Boot项目中: ```java @Configuration @ComponentScan(basePackages = "com.ocean.controller") // 确保扫描到正确的包路径 @EnableWebMvc public class SpringMvcConfig { } ``` 如果使用XML配置,则需要在`<context:component-scan>`中指定正确的包路径: ```xml <context:component-scan base-package="com.ocean.controller" /> ``` --- #### 3. 配置servlet-mapping 如果使用的是传统的Spring MVC项目(非Spring Boot),需要检查`web.xml`中的`servlet-mapping`配置。如果配置不正确,可能导致所有请求都无法映射到控制器[^3]。 正确的配置如下: ```xml <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> <!-- 确保使用"/"作为默认路径 --> </servlet-mapping> ``` --- #### 4. 检查视图解析器配置 如果控制器方法返回的是视图名称(如`return "home";`),需要确保视图解析器已正确配置。如果没有配置视图解析器,可能导致请求无法正确渲染视图[^2]。 例如,在Spring Boot中可以配置如下: ```java @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } ``` 如果使用XML配置,则需要添加以下内容: ```xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> ``` --- #### 5. 检查资源文件是否被正确加载 如果项目中存在`.properties`或`.xml`文件,但未被正确加载,也可能导致路径无法匹配。可以通过在`pom.xml`中添加资源文件的扫描配置来解决[^4]。 示例配置如下: ```xml <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </resource> </resources> ``` --- ### 总结 通过以上步骤可以有效解决Spring MVC中“No mapping for GET”的问题。具体操作需根据项目的实际配置情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值