首页 > 代码库 > springmvc(二)

springmvc(二)

请求信息转换

  异步发送表单数据到JavaBean,并响应JSON文本返回

操作步骤:
(1)加入Jackson2或fastjson框架包,springmvc默认支持Jackon2,不需要做任何操作,而fastjson需要重新配置HttpMessageConverter。
(2)使用@RequestBody接收数据和@ResponseBody返回数据,
这两个动作完全是透明的。

使用jackson转换json数据

代码示例:

创建动态web项目,配置web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Jackson处理json</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 定义Springmvc的前端控制器 -->
  <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 指定解析文件 -->
  <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/springmvc-config.xml</param-value>
  </init-param>
  <!-- 指定一开始就加载 -->
  <load-on-startup>1</load-on-startup>
  </servlet>
  
  <!-- 让spring mvc 的前端控制器拦截所有的请求 -->
  <servlet-mapping>
          <servlet-name>springmvc</servlet-name>
          <url-pattern>*.jspx</url-pattern>
  </servlet-mapping>
</web-app>

配置springmvc-config.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
       
     <!-- 自动扫描该包,SpringMVC会将包下用了@controller注解的类注册为Spring的controller -->
    <context:component-scan base-package="org.fkjava.action"/>
    
    <mvc:annotation-driven/>
    
    <!-- 视图解析器  -->
     <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
        <!-- 前缀 -->
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <!-- 后缀 -->
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
</beans>

index.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>

<a href="test1.jspx">测试RequestBody</a>
<br><br>
<a href="test2.jspx">测试ResponseBody</a>
<br><br>
<a href="test3.jspx">集合数据做成json返回</a>

</body>
</html>

TestAction.java类

package org.fkjava.action;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.fkjava.domain.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller//声明该类为控制器
public class TestJson {

    @RequestMapping("/test1.jspx")//映射index.jspx的请求
    public String test1(){
    //返回/WEB-INF/jsp/test1.jsp页面,这里在springmvc-config.xml配置了前缀和后缀
        return "test1";
    }
    
    @RequestMapping("/test2.jspx")
    public String test2(){
        return "test2";
    }
    
    @RequestMapping("/json/testRequestBody.jspx")//映射对应的请求路径
    public void testRequestBody(
            @RequestBody Book book,
            HttpServletResponse response) throws Exception{
        //用@RequestBody接收数据,得到Book对象
        //向book里添加数据
        book.setAuthor("张山");
        //Jackson开源类包操作json的类
        ObjectMapper mapper = new ObjectMapper();
        //将对象转成json字符串
        String json = mapper.writeValueAsString(book);
        //设置字符编码,输出到json客户端
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print(json);
    }
    
    /**(重点)
     * @ResponseBody会将集合数据转换json格式返回客户端
     * @return
     */
    @ResponseBody   //使用@RequestBody接收数据和@ResponseBody返回数据
    @RequestMapping("/json/testResponseBody.jspx")
    public Object testResponseBody(
            @RequestBody Book book){
        book.setAuthor("李四");
        return book;    
    }
    
    @ResponseBody
    @RequestMapping("/json/testArray.jspx")
    public Object testArray(){
        //模拟数据库查询返回多个book对象
        List<Book> books = new ArrayList<>();
        books.add(new Book(1,"轻量级Java","李刚"));
        books.add(new Book(2,"疯狂讲义","李刚"));
        books.add(new Book(3,"Spring","肖"));
        return books;
    }
    
}

test1.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试接收JSON格式的数据</title>
<script type="text/javascript"  src="js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript">
$(document).ready(function(){//页面一加载就会加载testRequestBody()方法
    testRequestBody();
});

function testRequestBody(){
    $.ajax("${pageContext.request.contextPath}/json/testRequestBody.jspx",//发送请求
            {
             dataType : "json",//预期服务器返回的数据类型
             type : "post",//请求方式
             contentType : "application/json", //发送信息至服务器时的内容编码类型
             //发送到服务器的数据
             data:JSON.stringify({id : 1, name : "Spring MVC企业应用实战"}),
             async : true ,//默认设置下,所有请求均为异步请求,如果设置为false,则发送同步请求
             //请求成功后回调函数
             success : function(data){
                 $("#id").html(data.id);
                 $("#name").html(data.name);
                 $("#author").html(data.author);
             },
             //请求出错时调用函数
             error : function(){
                 alert("数据发送失败");
             }
        });
}
</script>
</head>
<body>
编号:<span id="id"></span><br>
书名:<span id="name"></span><br>
作者:<span id="author"></span><br></br>
</body>
</html>

test2.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试接收JSON格式的数据</title>
<script type="text/javascript"  src="js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript">
$(document).ready(function(){//页面一加载就会加载testRequestBody()方法
    testRequestBody();
});

function testRequestBody(){
    $.ajax("${pageContext.request.contextPath}/json/testResponseBody.jspx",//发送请求
            {
             dataType : "json",//预期服务器返回的数据类型
             type : "post",//请求方式
             contentType : "application/json", //发送信息至服务器时的内容编码类型
             async : true ,//默认设置下,所有请求均为异步请求,如果设置为false,则发送同步请求
             //请求成功后回调函数
             success : function(data){
                 $("#id").html(data.id);
                 $("#name").html(data.name);
                 $("#author").html(data.author);
             },
             //请求出错时调用函数
             error : function(){
                 alert("数据发送失败");
             }
        });
}
</script>
</head>
<body>
编号:<span id="id"></span><br>
书名:<span id="name"></span><br>
作者:<span id="author"></span><br></br>
</body>
</html>

test3.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试接收JSON格式的数据</title>
<script type="text/javascript"  src="js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript">
$(document).ready(function(){//页面一加载就会加载testRequestBody()方法
    testRequestBody();
});

function testRequestBody(){
    $.ajax("${pageContext.request.contextPath}/json/testArray.jspx",//发送请求
            {
             dataType : "json",//预期服务器返回的数据类型
             type : "post",//请求方式
             contentType : "application/json", //发送信息至服务器时的内容编码类型
             //发送到服务器的数据
             data:JSON.stringify({id : 1, name : "Spring MVC企业应用实战"}),
             async : true ,//默认设置下,所有请求均为异步请求,如果设置为false,则发送同步请求
             //请求成功后回调函数
             success : function(data){
                 $.each(data,function(){
                     var tr = $("<tr align=‘center‘/>");
                     $("<td/>").html(this.id).appendTo(tr);
                     $("<td/>").html(this.name).appendTo(tr);
                     $("<td/>").html(this.author).appendTo(tr);
                     $("#booktable").append(tr);
                 })
             },
             //请求出错时调用函数
             error : function(){
                 alert("数据发送失败");
             }
        });
}
</script>
</head>
<body>
<table id="booktable" border="1"  style="border-collapse: collapse;">
    <tr align="center">
      <th>编号</th>
      <th>书名</th>
      <th>作者</th>
    </tr>    
</table>
</body>
</html>

domain

package org.fkjava.domain;

public class Book {
    
    private Integer id;
    private String name;
    private String author;
    public Book() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Book(Integer id, String name, String author) {
        super();
        this.id = id;
        this.name = name;
        this.author = author;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    @Override
    public String toString() {
        return "Book [id=" + id + ", name=" + name + ", author=" + author + "]";
    }
    
}

使用fastJson转换json数据

1、导包

2、配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>fastjson操作json</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 定义springmvc的前端控制器 -->
  <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 指定解析配置文件 -->
  <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/springmvc-config.xml</param-value>
  </init-param>
          <!-- 设置一开始就加载 -->
          <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
          <servlet-name>springmvc</servlet-name>
          <url-pattern>*.jspx</url-pattern>
  </servlet-mapping>
 
</web-app>

2、配置springmvc-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd     
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd">
        
    <!-- spring可以自动去扫描base-pack下面的包或者子包下面的java文件,
        如果扫描到有Spring的相关注解的类,则把这些类注册为Spring的bean -->
    <context:component-scan base-package="org.fkjava.action"/>
    
    <mvc:annotation-driven>
        <!-- 设置不使用默认的消息转换器 -->
        <mvc:message-converters register-defaults="false">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
            <!-- 配置fastjson中实现HttpMessageConverter接口的转换器 
            FastJsonHttpMessageConverter是fastjson中实现了HttpMessageConverter接口的类-->
            <bean id="fastJsonHttpMessageConverter" 
                class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <!-- 加入支持的媒体类型:返回contentType -->
                <property name="supportedMediaTypes">
                    <list>
                        <!-- 这里顺序不能反,一定先写text/html,不然ie下会出现下载提示 -->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    
    <mvc:default-servlet-handler/>
    
    <!-- 视图解析器  -->
     <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
        <!-- 前缀 -->
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <!-- 后缀 -->
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
    
</beans>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>

<a href="test1.jspx">测试RequestBody</a>
<br><br>
<a href="test2.jspx">测试ResponseBody</a>
<br><br>
<a href="test3.jspx">集合数据做成json返回</a>

</body>
</html>

TestJson.java类

@Controller
public class TestJson {
    
    @RequestMapping("/test1.jspx")
    public String test1(){
        return "test1";
    }
    
    @RequestMapping("/test2.jspx")
    public String test2(){
        return "test2";
    }
    
    @RequestMapping("/test3.jspx")
    public String test3(){
        return "test3";
    }
    
    @RequestMapping(value="/json/testRequestBody.jspx")
    public void setJson(@RequestBody Book book,
            HttpServletResponse response) throws Exception{
        book.setAuthor("肖老师");
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print(JSONObject.toJSONString(book));
    }
    
    //@esponseBody会将数据转换json格式返回客户端
    @ResponseBody
    @RequestMapping("/json/testResponseBody.jspx")
    public Object setJson2(
            @RequestBody Book book,
            HttpServletResponse response) throws Exception{
        book.setAuthor("张");
        return book;
    }
    
    // @ResponseBody会将数据转换json格式返回客户端
            @ResponseBody
            @RequestMapping(value="/json/testArray.jspx")
            public Object testArray() throws Exception {
                List<Book> list = new ArrayList<Book>();
                list.add(new Book(1,"Spring MVC企业应用实战","肖文吉"));
                list.add(new Book(2,"轻量级JavaEE企业应用实战","李刚"));
                return list;
            }
}

test1.jsp页面和test2.jsp,和test3.jsp页面以及domain同上

springmvc(二)