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 这两个类以不推荐使用