Wetts's blog

Stay Hungry, Stay Foolish.

0%

SpringMVC-标签-《mvc:annotation-driven》

以下为spring mvc 3.1中annotation-driven所支持的全部配置

1
2
3
4
5
6
7
8
9
10
11
<mvc:annotation-driven  message-codes-resolver ="bean ref" validator="" conversion-service="">
<mvc:return-value-handlers>
<bean></bean>
</mvc:return-value-handlers>

<mvc:argument-resolvers>
</mvc:argument-resolvers>

<mvc:message-converters>
</mvc:message-converters>
</mvc:annotation-driven>

return-value-handlers

允许注册实现了HandlerMethodReturnValueHandler接口的bean,来对handler method的特定的返回类型做处理HandlerMethodReturnValueHandler接口中定义了两个方法:

  • supportsReturnType 方法用来确定此实现类是否支持对应返回类型。
  • handleReturnValue 则用来处理具体的返回类型

例如以下的handlerMethod

1
2
3
4
5
6
@RequestMapping("/testReturnHandlers")
public User testHandlerReturnMethod(){
User u = new User();
u.setUserName("test");
return u;
}

所返回的类型为一个pojo,正常情况下spring mvc无法解析,将转由DefaultRequestToViewNameTranslator 解析出一个缺省的view name,转到testReturnHandlers.jsp
我们增加以下配置

1
2
3
4
5
<mvc:annotation-driven validator="validator">
<mvc:return-value-handlers>
<bean class="net.zhepu.web.handlers.returnHandler.UserHandlers"></bean>
</mvc:return-value-handlers>
</mvc:annotation-driven>

实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class UserHandlers implements HandlerMethodReturnValueHandler {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public boolean supportsReturnType(MethodParameter returnType) {
Class<?> type = returnType.getParameterType();
if(User.class.equals(type))
{
return true;
}
return false;
}

@Override
public void handleReturnValue(Object returnValue,
MethodParameter returnType, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
logger.info("handler for return type users ");
mavContainer.setViewName("helloworld");
}
}

此时再访问 http://localhost:8080/springmvc/testReturnHandlers ,将交由 UserHandlers来处理返回类型为User的返回值

argument-resolvers

允许注册实现了WebArgumentResolver接口的bean,来对handlerMethod中的用户自定义的参数或annotation进行解析

1
2
3
4
5
<mvc:annotation-driven validator="validator">
<mvc:argument-resolvers>
<bean class="net.zhepu.web.handlers.argumentHandler.MyCustomerWebArgumentHandler" />
</mvc:argument-resolvers>
</mvc:annotation-driven>

java代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyCustomerWebArgumentHandler implements WebArgumentResolver {
@Override
public Object resolveArgument(MethodParameter methodParameter,
NativeWebRequest webRequest) throws Exception {
if (methodParameter.getParameterType().equals(MyArgument.class)) {
MyArgument argu = new MyArgument();
argu.setArgumentName("winzip");
argu.setArgumentValue("123456");
return argu;
}
return UNRESOLVED;
}
}

这里我们定义了一个 customer webArgumentHandler,当handler method中参数类型为 MyArgument时生成对参数的类型绑定操作

注意新注册的webArgumentHandler的优先级最低,即如果系统缺省注册的ArgumentHandler已经可以解析对应的参数类型时,就不会再调用到新注册的customer ArgumentHandler了

message-converters

允许注册实现了HttpMessageConverter接口的bean,来对requestbody 或responsebody中的数据进行解析

例如

假设我们使用text/plain格式发送一串字符串来表示User对象,各个属性值使用”|”来分隔。

例如 winzip|123456|13818888888,期望转为user对象,各属性内容为user.username = winzip,user.password=123456;user.mobileNO = 13818888888

以下代码中supports表示此httpmessageConverter实现类针对User类进行解析。

构造函数中调用super(new MediaType(“text”, “plain”));以表示支持 text/plain格式的输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MyCustomerMessageConverter extends AbstractHttpMessageConverter<Object> {
@Override
protected boolean supports(Class<?> clazz) {
if (clazz.equals(User.class)) {
return true;
}
return false;
}

public MyCustomerMessageConverter() {
super(new MediaType("text", "plain"));
}

@Override
protected Object readInternal(Class<? extends Object> clazz,
HttpInputMessage inputMessage) throws IOException,
HttpMessageNotReadableException {
Charset charset;
MediaType contentType = inputMessage.getHeaders().getContentType();
if (contentType != null && contentType.getCharSet() != null) {
charset = contentType.getCharSet();
} else {
charset = Charset.forName("UTF-8");
}
String input = FileCopyUtils.copyToString(new InputStreamReader(
inputMessage.getBody(), charset));
logger.info(input);
String[] s = input.split("\\|");
User u = new User();
u.setUserName(s[0]);
u.setPassword(s[1]);
u.setMobileNO(s[2]);
return u;
}

@Override
protected void writeInternal(Object t, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {

}
}

修改servlet context xml配置文件,增加message-converters的相应配置如下

1
2
3
<mvc:message-converters>
<bean class="net.zhepu.web.handlers.messageConverterHandler.MyCustomerMessageConverter"></bean>
</mvc:message-converters>