spring mvc 自动 映射方法名

 

spring mvc 默认 映射路径为 方法名

 

spring mvc 的具体用法 就不具体说明了。

首先是 用@Controller 标明类  @RequestMapping来标名具体的请求路径

 

每个Controller 上面写标记一下 @Controller 和 @RequestMapping 问题不大

 

Controller的每个方法都需要标注 @RequestMapping也没什么问题

问题是每个@RequestMapping必须指定路径。

个人觉得这个有些不必要。特殊情况下可以指定,非特殊情况下我觉得可以提供默认规则。

方法上指定一个@RequestMapping即可。如果没有指定value 那么 直接映射成方法名

 

spring mvc 不比struts  struts所有的描述 都在xml中。命名规则再混乱  页面上找到请求去xml中搜寻 怎么样都能很快的找到对应的action及方法

而spring mvc 不同。所有的配置都是分散的。指定在controller及具体的方法上。如果路径的映射不规范,前台一个请求出错了难以找到对应的处理类及方法

 

下面看具体的实现。我这里用的是spring mvc 4

 

很简单。重写一下RequestMappingHandlerMapping即可

 

具体代码

 

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.accept.ContentNegotiationManager;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition;
import org.springframework.web.servlet.mvc.condition.HeadersRequestCondition;
import org.springframework.web.servlet.mvc.condition.ParamsRequestCondition;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.condition.ProducesRequestCondition;
import org.springframework.web.servlet.mvc.condition.RequestCondition;
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

public class MyRequestMappingHandlerMapping extends RequestMappingHandlerMapping {

	private boolean useSuffixPatternMatch = true;

	private boolean useTrailingSlashMatch = true;
	
	private ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager();

	private final List<String> fileExtensions = new ArrayList<String>();
	
	@Override
	protected RequestMappingInfo getMappingForMethod(Method method,
			Class<?> handlerType) {
		RequestMappingInfo info = null;
		RequestMapping methodAnnotation = AnnotationUtils.findAnnotation(method, RequestMapping.class);
		if (methodAnnotation != null) {
			RequestCondition<?> methodCondition = getCustomMethodCondition(method);
			info = createRequestMappingInfo(methodAnnotation, methodCondition,method);
			RequestMapping typeAnnotation = AnnotationUtils.findAnnotation(handlerType, RequestMapping.class);
			if (typeAnnotation != null) {
				RequestCondition<?> typeCondition = getCustomTypeCondition(handlerType);
				info = createRequestMappingInfo(typeAnnotation, typeCondition,method).combine(info);
			}
		}
		return info;
	}
	protected RequestMappingInfo createRequestMappingInfo(RequestMapping annotation, RequestCondition<?> customCondition,Method method) {
		String[] patterns = resolveEmbeddedValuesInPatterns(annotation.value());
		if(patterns!=null && (patterns.length == 0)){
			patterns= new String[]{method.getName().toLowerCase()};
		}
		return new RequestMappingInfo(
				new PatternsRequestCondition(patterns, getUrlPathHelper(), getPathMatcher(),
						this.useSuffixPatternMatch, this.useTrailingSlashMatch, this.fileExtensions),
				new RequestMethodsRequestCondition(annotation.method()),
				new ParamsRequestCondition(annotation.params()),
				new HeadersRequestCondition(annotation.headers()),
				new ConsumesRequestCondition(annotation.consumes(), annotation.headers()),
				new ProducesRequestCondition(annotation.produces(), annotation.headers(), this.contentNegotiationManager),
				customCondition);
	}
	
}

 

    老配置文件

   

	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
			</bean>
			<bean id="jsonHttpMessageConverter"
				class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="supportedMediaTypes">
					<list>
						<value>text/plain;charset=UTF-8</value>
						<value>text/html;charset=UTF-8</value>
						<value>text/json;charset=UTF-8</value>
						<value>application/json;charset=UTF-8</value>
					</list>
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

 

    新配置文件

   

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="messageConverters">
			<list>
				<bean class="org.springframework.http.converter.StringHttpMessageConverter">
					<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
				</bean>
				<bean id="jsonHttpMessageConverter"
					class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
					<property name="supportedMediaTypes">
						<list>
							<value>text/plain;charset=UTF-8</value>
							<value>text/html;charset=UTF-8</value>
							<value>text/json;charset=UTF-8</value>
							<value>application/json;charset=UTF-8</value>
						</list>
					</property>
				</bean>
			</list>
		</property>
	</bean>
    <bean name='handlerMapping' class='com.idresschina.idress.model.web.MyRequestMappingHandlerMapping'>
<!-- 	 <property name='useTrailingSlashMatch' value='false'></property> -->
	</bean>

 

   将老的配置文件替换成新配置文件

    

@RequestMapping("index1")
	public String index1(){
		return "index1";
	}
	
	@RequestMapping
	@ResponseBody
	public String index2(){
		return "index2";
	}

   /index1 对应 index1()

  /index2 对应 index2()   

 

   2015-01-08 14:03:14,342 INFO [MyRequestMappingHandlerMapping] - <Mapped "{[/admin/index],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String web.ctrl.AppCtrl.index()>

2015-01-08 14:03:14,354 INFO [MyRequestMappingHandlerMapping] - <Mapped "{[/admin/index2],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String web.ctrl.AppCtrl.index2()>

 

  spring3.1之后    <mvc:annotation-driven>  标签默认给你干了两件事

   注册 RequestMappingHandlerMapping和RequestMappingHandlerAdapter

   

  spring3.1之前为DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter  这两个类以不推荐使用

    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值