Spring MVC 学习笔记 十五 what's new in spring mvc 3.1
1:mvc annotation-driven 新增标签
以下为spring mvc 3.1中annotation-driven所支持的全部配置。
<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>[/color]</mvc:annotation-driven>
@RequestMapping("/testReturnHandlers")public User testHandlerReturnMethod(){User u = new User();u.setUserName("test");return u;}<mvc:annotation-driven validator="validator">[color=red] <mvc:return-value-handlers> <bean name="code">public class UserHandlers implements HandlerMethodReturnValueHandler { Logger logger = LoggerFactory.getLogger(this.getClass());@Overridepublic boolean supportsReturnType(MethodParameter returnType) {Class<?> type = returnType.getParameterType();if(User.class.equals(type)){return true;}return false;}@Overridepublic void handleReturnValue(Object returnValue,MethodParameter returnType, ModelAndViewContainer mavContainer,NativeWebRequest webRequest) throws Exception {logger.info("handler for return type users ");mavContainer.setViewName("helloworld");}}<mvc:annotation-driven validator="validator"><mvc:argument-resolvers><bean/></mvc:argument-resolvers></mvc:annotation-driven>
public class MyCustomerWebArgumentHandler implements WebArgumentResolver {@Overridepublic 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;}}public class MyCustomerMessageConverter extendsAbstractHttpMessageConverter<Object> {@Overrideprotected boolean supports(Class<?> clazz) {if (clazz.equals(User.class)) {return true;}return false;}public MyCustomerMessageConverter() {super(new MediaType("text", "plain"));}@Overrideprotected 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;}@Overrideprotected void writeInternal(Object t, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException {} <mvc:message-converters> <bean name="code">public String helloWorld2(@ModelAttribute("user") User u,BindingResult result)<mvc:annotation-driven validator="validator" message-codes-resolver="messageCodeResolver"></mvc:annotation-driven>
<bean id="messageCodeResolver" value="validation."></property></bean>
@RequestMapping(value="/testMsgConverter",consumes="text/plain",produces="application/json")
@RequestMapping("/develop/apps/edit/{slug}")public String editForm(@PathVariable String slug, Model model) {model.addAttribute("slug", slug); // ...}@RequestMapping("/develop/apps/edit/{slug}")public String editForm(@PathVariable String slug, Model model) { // model contains "slug" variable}@RequestMapping( value="/groups/{group}/events/{year}/{month}/{slug}/rooms", method=RequestMethod.POST)public String createRoom( @PathVariable String group, @PathVariable Integer year, @PathVariable Integer month, @PathVariable String slug) { // ... return "redirect:/groups/" + group + "/events/" + year + "/" + month + "/" + slug;}@RequestMapping( value="/groups/{group}/events/{year}/{month}/{slug}/rooms", method=RequestMethod.POST)public String createRoom( @PathVariable String group, @PathVariable Integer year, @PathVariable Integer month, @PathVariable String slug) { // ... return "redirect:/groups/{group}/events/{year}/{month}/{slug}";}@RequestMapping("/people/{firstName}/{lastName}/SSN")public String find(Person person, @PathVariable String firstName, @PathVariable String lastName) { person.setFirstName(firstName); person.setLastName(lastName); // ...}@RequestMapping("/people/{firstName}/{lastName}/SSN")public String search(Person person) { // person.getFirstName() and person.getLastName() are populated // ...}public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {Object arg = readWithMessageConverters(webRequest, parameter, parameter.getParameterType());if (shouldValidate(parameter, arg)) {String argName = Conventions.getVariableNameForParameter(parameter);WebDataBinder binder = binderFactory.createBinder(webRequest, arg, argName);binder.validate();Errors errors = binder.getBindingResult();if (errors.hasErrors()) {throw new RequestBodyNotValidException(errors);}}return arg;}