0%

spring-mvc返回json数据

在使用spring-mvc过程中遇到很多问题,记录下来方便查看

开发环境如下:

eclipse Oxygen Release (4.7.0)

java1.8

spring 4.3.3

freemarker 2.3.26(这个不是必须的)

maven依赖包如下:

<!-- spring mvc返回json所需依赖  -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.0</version>
    </dependency>
<!-- freemarker 引擎,有了这个就不需要使用jstl了,只需要使用freemarker表达式就行了 -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.26-incubating</version>
    </dependency>
    <!-- spring 核心 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.3.RELEASE</version>
    </dependency>
    <!-- springmvc 核心 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.3.RELEASE</version>
    </dependency>
<!-- spring bean 核心 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.3.3.RELEASE</version>
    </dependency>
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.3.RELEASE</version>
    </dependency>

web.xml 配置:

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup><!--启动顺序,让这个Servlet随Servletp容器一起启动。 -->
</servlet>
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern> <!--会拦截URL中带“/”的请求。 -->
</servlet-mapping>

spring-mvc配置:

<mvc:annotation-driven />
<context:component-scan base-package="canxing.web" />

spring-mvc配置freemarker:

<!-- freemarker 配置文件 -->
<!-- freemarker config -->
<bean id="freemarkerConfig"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
</bean>

<!-- View resolvers can also be configured with ResourceBundles or XML files.
    If you need different view resolving based on Locale, you have to use the
    resource bundle resolver. -->
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="cache" value="true" />
    <property name="prefix" value="" />
    <property name="suffix" value=".ftl" />
</bean>

JSONController.java:

@Controller
public class JSONController {
    @RequestMapping(path="/json",produces="application/json")
    public @ResponseBody User index() {//使用@RespnseBody将返回的对象转化为JSON数据
        System.out.println("index start");
        User user = new User();
        user.setUsername("canxing");
        user.setPassword("123");
        System.out.println("index end");
        return user;
    }
    @RequestMapping(path="/")
    public String test() {
        return "test";
    }
}

User.java:

//类不需要进行处理,只是一个普通的pojo类
public class User{
        private String username;
        private String password;
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        @Override
        public String toString() {
            return "User [username=" + username + ", password=" + password + "]";
        }
    }

test.flt:

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
<html>
<head>
<title>freemarker test </title>
<script type="text/javascript">
function loadXMLDoc()
{
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for Firefox, Mozilla, IE7, etc.
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET","http://localhost:8080/spring_web_test/json",true);
xmlhttp.send(null);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change(){
var obj = eval("(" + xmlhttp.responseText + ")");
document.getElementById("username").innerHTML=obj.username
document.getElementById("password").innerHTML=obj.password
}
</script>
</head>
<body>
<h1>freemarker test</h1>
username : <span id='username'></span><br>
password : <span id='password'></span><br>
<button type='button' onclick="loadXMLDoc()">adfads</button>
</body>
</html>

spring-mvc返回JSOn数据参考源码

寻找答案中遇到的问题

  1. 依赖问题,spring 默认的对象转化为 json 的 jar 包依赖,网上多是直接使用并没有说明依赖
  2. 还是依赖问题,spring 和 jackson 之间版本的兼容性太差,稍微更改以下 jackson 或者 spring 的版本就会导致 NoSuchMethodError 错误,据说这里可以看见版本支持,但是看不懂