美文网首页
spring-mvc-6-控制器返回json类型数据

spring-mvc-6-控制器返回json类型数据

作者: liangxifeng833 | 来源:发表于2018-01-22 20:25 被阅读257次

第一个实例

  • 导入jar包如下:

jackson-annotations-2.1.5.jar
jackson-core-2.1.5.jar
jackson-databind-2.1.5.jar

1.控制器中的方法

@Controller
public class SpringMVCTestNew {
    @Autowired
    private EmployeeDao employDao ;
    
    /**
     * 测试返回json数据
     * @return
     */
    @ResponseBody
    @RequestMapping("/testJson")
    public Collection<Employee> testJson()
    {
        return employDao.getAll();
    }
}

2.index.jsp

<script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
    $(function(){
        $("#testJson").click(function(){
            var url = this.href;
            var args = {};
            $.post(url, args, function(data){
                console.log(data)
                for(var i = 0; i < data.length; i++){
                    var id = data[i].id;
                    var lastName = data[i].lastName;
                    alert(id + ": " + lastName);
                }
            });
            return false;
        });
    })
</script>
<body>
    <a href="testJson" id="testJson">ajax测试返回json格式的数据</a>
    <br><br>
</body>

实现原理

  • HttpMessageConverter<T> 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息

    Paste_Image.png
  • HttpMessageConverter<T>的实现类

    Paste_Image.png
  • 加入 jackson jar 包后, RequestMappingHandlerAdapter
    装配的 HttpMessageConverter 如下:


    Paste_Image.png
  • 当控制器处理方法使用到 @RequestBody/@ResponseBody 或
    HttpEntity<T>/ResponseEntity<T> 时, Spring 首先根据请求头或响应头的
    Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的
    HttpMessageConverter 将报错.

  • @RequestBody 和 @ResponseBody 不需要成对出现


    Paste_Image.png

关于国际化:

新建三个国际化资源文件:
i18n.properties文件内容:

Paste_Image.png

i18n_zh_CN.properties中文文件内容:

Paste_Image.png

i18n_en_US.properties英文文件内容:

Paste_Image.png

配置springmvc.xml

     <!-- 配置国际化资源文件,用来验证错误信息显示 -->
     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n"></property>
     </bean>
  1. 在页面上能够根据浏览器语言设置的情况对文本(不是内容), 时间, 数值进行本地化处理, 使用 JSTL 的 fmt 标签
    在WEB_INF/views/i18n.jsp中使用fmt标签
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:message key="i18n.user"></fmt:message>

配置springmvc.xml文件直接访问i18n.jsp

    <!-- 国际化测试,配置直接请求jsp页面 --> 
     <mvc:view-controller path="i18n" view-name="i18n"/>

访问测试:http://localhost:8081/spring-mvc-2/i18n
浏览器输出结果:

用户名 

此时如果在浏览器改变浏览器的语言设置为英文,再次访问则会显示 username

  1. 可以在 bean 中获取国际化资源文件 Locale 对应的消息, 在 bean 中注入 ResourceBundleMessageSource 的示例, 使用其对应的 getMessage 方法即可
    在controller的目标方法中获取国际化属性:
    @RequestMapping("/i18n")
    public String testI18n(Locale locale){
        String val = messageSource.getMessage("i18n.user", null, locale);
        System.out.println(val); 
        return "i18n";
    }

此时访问:http://localhost:8081/spring-mvc-2/testI18n,会在控制台输出:用户名

  1. 可以通过超链接切换 Locale, 而不再依赖于浏览器的语言设置情况, 配置 LocalResolver 和 LocaleChangeInterceptor

配置springmvc.xml配置文件

     <!-- 配置SessionLocalResolver和LoaclChangeInterceptor拦截器, 可以通过超链接切换 Locale而不再依赖于浏览器的语言设置情况-->
     <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
     <!-- 配置LoaclChangeInterceptor拦截器 -->
     <mvc:interceptors>
        <bean  class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
     </mvc:interceptors>

修改 i18n.jsp 页面

    <a href="i18n?locale=zh_CH">中文</a>
    
    <br><br>
    <a href="i18n?locale=en_US">英文</a>
Paste_Image.png

点击查看代码练习

相关文章

网友评论

      本文标题:spring-mvc-6-控制器返回json类型数据

      本文链接:https://www.haomeiwen.com/subject/avvvrxtx.html