8.1 配置

  • Spring MVC的配置是通过继承WebMvcConfigurerAdapter类并重载其方法实现的;
  • 前几个教程已做了得配置包括
    • 01点睛Spring MVC 4.1-搭建环境 配置viewResolver
    • 03点睛Spring MVC 4.1-REST 静态资源映射
    • 04点睛Spring MVC 4.1-拦截器 配置拦截器
    • 06点睛Spring MVC 4.1-文件上传 配置multipartResolver
    • 07点睛Spring MVC4.1-ContentNegotiatingViewResolver 配置ContentNegotiatingViewResolver

8.2 演示

8.2.1 配置路径匹配参数

  • 在Spring MVC中路径参数如果带.的话,.后面的值将被忽略,本例演示配置configurePathMatch不忽略点后面的参数;

  • 演示控制器

  1. @RequestMapping("/configPath/{test}")
  2. public @ResponseBody String configPath(@PathVariable String test){
  3. return "request value:"+test;
  4. }
  • 运行:访问http://localhost:8080/testSpringMVC/configPath/xx.yy

  • 在继承WebMvcConfigurerAdapterDemoMVCConfig类中重载configurePathMatch
  1. @Override
  2. public void configurePathMatch(PathMatchConfigurer configurer) {
  3. configurer.setUseSuffixPatternMatch(false);
  4. }
  • 再次运行:访问访问http://localhost:8080/testSpringMVC/configPath/xx.yy

8.2.2 快捷定义ViewController

  • 我们经常涉及到页面转向,但没任何处理业务的时候,快捷的页面转向定义会节省好多代码;
  • 在views目录下建一个任意的test.jsp
  • 常规的方案是这样写的
  1. @RequestMapping("/mytest")
  2. public String test(){
  3. return "test";
  4. }
  • 在继承WebMvcConfigurerAdapterDemoMVCConfig类中重载addViewControllers
  1. @Override
  2. public void addViewControllers(ViewControllerRegistry registry) {
  3. registry.addViewController("/mytest").setViewName("/test");
  4. //添加更多
  5. }
  • 以上效果等同,均会指向views下的test.jsp

8.2.3 配置HttpMessageConverter

  • HttpMessageConverter是对http的request和response进行自动转换
  • 配置HttpMessageConverter可重载下面两个方法任意一个

    • configureMessageConverters:重载会覆盖掉spring mvc默认注册的多个HttpMessageConverter
    • extendMessageConverters:仅添加一个自定义的HttpMessageConverter,不覆盖默认注册的HttpMessageConverter
  • 通过对上面的讲述,我们一般是重载extendMessageConverters方法;

  • 下面我们演示使用js向spring mvc发送自定义格式的字符串(属性用-隔开),通过自定义的HttpMessageConverter自动转换成对象,然后通过HttpMessageConverter输出指定格式到浏览器

  • 测试javabean

    • Person
  1. package com.wisely.domain;
  2.  
  3. public class Person {
  4.  
  5. private String firstName;
  6. private String lastName;
  7. public Person(String firstName, String lastName) {
  8. super();
  9. this.firstName = firstName;
  10. this.lastName = lastName;
  11. }
  12. public String getFirstName() {
  13. return firstName;
  14. }
  15. public void setFirstName(String firstName) {
  16. this.firstName = firstName;
  17. }
  18. public String getLastName() {
  19. return lastName;
  20. }
  21. public void setLastName(String lastName) {
  22. this.lastName = lastName;
  23. }
  24.  
  25. }
  • 自定义HttpMessageConverterWiselyMessageConverter
  1. package com.wisely.converters;
  2.  
  3. import java.io.IOException;
  4. import java.nio.charset.Charset;
  5.  
  6. import org.springframework.http.HttpInputMessage;
  7. import org.springframework.http.HttpOutputMessage;
  8. import org.springframework.http.MediaType;
  9. import org.springframework.http.converter.AbstractHttpMessageConverter;
  10. import org.springframework.http.converter.HttpMessageNotReadableException;
  11. import org.springframework.http.converter.HttpMessageNotWritableException;
  12. import org.springframework.util.StreamUtils;
  13.  
  14. import com.wisely.domain.Person;
  15.  
  16. public class WiselyMessageConverter extends AbstractHttpMessageConverter<Person> {
  17.  
  18. //自定义媒体类型
  19. public WiselyMessageConverter(){
  20. super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")));
  21. }
  22. //从request里获得构造Person实例的数据
  23. @Override
  24. protected Person readInternal(Class<? extends Person> clazz,
  25. HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
  26. String temp = StreamUtils.copyToString(inputMessage.getBody(),
  27.  
  28. Charset.forName("UTF-8"));
  29. String[] tempArr = temp.split("-");
  30. return new Person(tempArr[0],tempArr[1]);
  31. }
  32.  
  33. //只支持Person类
  34. @Override
  35. protected boolean supports(Class<?> clazz) {
  36. return Person.class.isAssignableFrom(clazz);
  37. }
  38.  
  39. //将person实例转换成你想要的字符串格式
  40. @Override
  41. protected void writeInternal(Person person, HttpOutputMessage outputMessage)
  42. throws IOException, HttpMessageNotWritableException {
  43. String out = "hello:" +person.getFirstName() + "-" + person.getLastName();
  44. outputMessage.getBody().write(out.getBytes());
  45. }
  46.  
  47. }
  • 配置WiselyMessageConverter
  1. @Override
  2. public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
  3. WiselyMessageConverter converter = new WiselyMessageConverter();
  4. converters.add(converter);
  5. }

注释掉上例的configureContentNegotiation,这里会自动将媒体类型变为text/html

  1. // 配置ContentNegotiationManager,在无后缀名情况下默认为jsp view resolver
  2. // @Override
  3. // public void configureContentNegotiation(
  4. // ContentNegotiationConfigurer configurer) {
  5. // //忽略请求的header信息,并将contentType置为text/html
  6. // configurer.ignoreAcceptHeader(true).defaultContentType(
  7. // MediaType.TEXT_HTML);
  8. // }
  • 测试控制器
  1. @RequestMapping(value = "/convert", produces = { "application/x-wisely" })
  2. public @ResponseBody Person convert(@RequestBody Person person) {
  3. return person;
  4. }
  • 测试页面:test.jsp
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <div id="resp"></div><input type="button" onclick="req();" value="请求"/>
  11. <script src="js/jquery.js" type="text/javascript"></script>
  12. <script>
  13. function req(){
  14. $.ajax({
  15. url: "convert",
  16. data: "wang-yunfei",//注意此处的格式
  17. type:"POST",
  18. contentType:"application/x-wisely",
  19. success: function(data){
  20. $("#resp").html(data);
  21. }
  22. });
  23. }
  24.  
  25. </script>
  26. </body>
  27. </html>
  • 运行效果

08点睛Spring MVC4.1-Spring MVC的配置(含自定义HttpMessageConverter)的更多相关文章

  1. 09点睛Spring MVC4.1-异步请求处理(包含兼容浏览器的服务器端推送)

    转发地址:https://www.iteye.com/blog/wiselyman-2215852 9.1 异步请求处理 Servlet 3开始支持异步请求处理 Spring MVC 3.2开始支持S ...

  2. spring mvc4:异常处理

    前面学习过struts2的异常处理,今天来看下spring mvc4的异常处理: 一.Servlet配置文件修改 <bean id="exceptionResolver" c ...

  3. Spring MVC的配置和使用

    Spring MVC的配置和使用 笔记仓库:https://github.com/nnngu/LearningNotes Spring MVC需要的jar包 文章中 Spring MVC 使用的版本是 ...

  4. Spring Mvc4 新特性(一)

    前言 Spring Framework的Web层,由spring-web,spring-webmvc,spring-websocket和spring-webmvc-portlet模块组成. 很多人刚学 ...

  5. spring笔记3 spring MVC的基础知识3

    4,spring MVC的视图 Controller得到模型数据之后,通过视图解析器生成视图,渲染发送给用户,用户就看到了结果. 视图:view接口,来个源码查看:它由视图解析器实例化,是无状态的,所 ...

  6. spring mvc基础配置

    web.xml 配置: <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> ...

  7. spring mvc 详细配置(转)

    转自: http://www.cnblogs.com/superjt/p/3309255.html 现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是 ...

  8. Struts2、Spring MVC4 框架下的ajax统一异常处理

    本文算是struts2 异常处理3板斧.spring mvc4:异常处理 后续篇章,普通页面出错后可以跳到统一的错误处理页面,但是ajax就不行了,ajax的本意就是不让当前页面发生跳转,仅局部刷新, ...

  9. Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 一.      XML,使用tx标签配置拦截器实现事务 一.   ...

随机推荐

  1. Linux shell - 按时间和文件大小排序显示文件

    在工作中有这样的情况,需要显示所有的文件,按照时间先后或者文件大小先后排序显示 命令:ls 1.按时间排序显示文件 1 test@> ll -rt 2.按文件大小排序显示文件(文件大小单位:k, ...

  2. 06.volatile关键字

    volatile volatile关键字的主要作用是使变量在多个线程间可见 使用方法: private volatile int number=0; 图示: 两个线程t1和t2共享一份数据,int a ...

  3. Windows异常的分发处理流程

    根据异常来源,一般分硬件异常和软件异常,它们处理的流程大致一样,下面简单讲一下. 如果是硬件异常,CPU会根据中断类型号转而执行对应的中断处理程序.CPU会在IDT中查找对应的函数来处理,各个异常处理 ...

  4. 特别的表格(overflow:hidden的一个小应用)

    做多个li,对各个边的边框有不同的要求,三层盒子,第一层盒子放li,设置右边和下边的虚线边框,浮动,第二层盒子ul设置宽度使li排列,第三层盒子最大的盒子,使用overflow:hidden,宽度高度 ...

  5. 关于css3属性filter

    今天看百度百科,看到其中一页所有图片背景全都设置为了灰白色,于是研究了番,发现是应用了filter滤镜这个属性. // 修改所有图片的颜色为黑白 (100% 灰度): img { -webkit-fi ...

  6. 桥接模式:探索JDBC底层实现

    一.目录概要 二.问题探究 需求:假设要设计一个电脑商场管理系统的某个模块设计,电脑分为品牌和类型两个纬度,我们应该怎么解决? 按照初学者的思路,利用继承就能简单粗暴的实现,那我们来看下这种思路的设计 ...

  7. biiset用法

    C++ bitset--高端压位卡常题必备STL 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力. bitset存储二进制数位. bitset就像一个bool类型的数组一样,但是有 ...

  8. linux线程操作

    初始化条件变量 int pthread_cond_init(pthread_cond_t *cv,pthread_cond_attr *cattr); 函数返回值:返回0表示成功,返回其他表示失败. ...

  9. golang-切片

    切片练习 package main import "fmt" /*func main() { arr := [10]int {1, 2, 3, 4, 5, 6, 7, 8, 9, ...

  10. 根据数据文件自定义边界条件timeVaryingUniformFixedValue【转载】

    转载自:http://blog.sina.com.cn/s/blog_e256415d0101nf9j.html 在OpenFOAM中,可以创建数据文件,自定义边界条件. 下面的例子读取outletP ...