Spring mvc系列六之 ajax运用(基于json格式)

此篇文章的讲解是基于前几篇文章的内容,如果大家有看不懂的地方可以看前几篇的内容.

spring mvc返回json数据可方法常用的有

  • 直接PrintWriter 输出
  • 使用Spring内置的支持

下面我分别对上面的两种方法进行讲解:注意这篇文章的讲解使用的是spring3.2版本,此版本与spring 3.0的配置有少许不同,希望大家注意,同时我使用的是jquery做演示.

 

首先讲解直接PrintWriter 输出,这个是最简单的,但是不可以使用java的复杂对象.

没有什么需要配置的,直接请求我们的ajax请求页面json.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>
<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="script/jquery-1.8.3.js"></script>
<title>添加用户</title>
<script type="text/javascript">
	$(function(){
		$("form :button").click(function(){
			var name = $("#name").val();
			var age = $("#age").val();
			$.ajax({
				   type: "POST",
				   url: "user/addUser",
				   data: {name:name , age:age},
				   success:function(data){
					   alert("名字:" + data.name + "年龄:" + data.age);
				   }
			});
		});
	});
</script>
</head>
<body>
	<form action="user/addUser" method="post">
		用户名:<input type="text" id="name" name="name" /><br/>
		年龄:<input type="text" id="age" name="age" />
		<input type="button" value="提交" />
	</form>
</body>
</html>

 

 

 

给提示按钮添加点击事件,当提交表单时获取用户名name,和年龄age,以post的方式提交表user/addUser,并把服务器返回的数据显示出来,这里要注意JSP页面头上最好加上

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">

 使用绝对路径,一切从根目录开始找起,要不然会因为路径问题,而且很烦,js也要声明为spring mvc不要拦截,这里之前文章有说过

 

Controller:

package gd.hz.springmvc.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import gd.hz.springmvc.model.User;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller("userController")
@RequestMapping("user")
public class UserController {

	// ajax请求一
	@RequestMapping("addUser")
	public void addUser(User user, HttpServletRequest request,
			HttpServletResponse response) {
		// 这里不能用单引号,无效,死的心都有
		System.out.println("过来了");
		String result = "{\"name\":\"" + user.getName() + "\"}";
		PrintWriter out = null;
		System.out.println(result);
		response.setContentType("application/json");
		try {
			out = response.getWriter();
			out.write(result);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 这里我们用User这个实体接收ajax传过来的参数,当然也可以这样写:

public void addUser(String name , int age , HttpServletRequest request,HttpServletResponse response)

 注意名字要与from表单传过来的参数名称一样,当然也可以不一样,不一样时的用法可以看我之前的文章.

 

User类:

package gd.hz.springmvc.model;

public class User {
	private String name ;
	private int age ;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

 

 

String result = "{\"name\":\"" + user.getName() + "\"}";

 这句话,把传过来的数据拼成类json格式("key":"value"),这里要注意字符串里面的双引号不能用单引号表示,

 

response.setContentType("application/json");

 修改协议头,声明返回json格式.然后输出. 测试时可要注意年龄输入数字.

 

 使用Spring内置的支持返回json.这个方法比较灵活,虽然复杂了一点,不过建议使用:

首先这里需要引入commons-fileupload-*.jar commons-io-*.jar commons-logging-*.jar  jackson-annotations-*.jar  jackson-core-*.jar  jackson-databind-*.jar

看一下spring mvc的配置文件的配置

<?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:p="http://www.springframework.org/schema/p"
	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-3.0.xsd      
           http://www.springframework.org/schema/context      
           http://www.springframework.org/schema/context/spring-context-3.0.xsd     
           http://www.springframework.org/schema/mvc      
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
	<!-- 开启注解扫描功能 -->
	<context:component-scan base-package="gd.hz.springmvc.controller"></context:component-scan>

	<!-- 将上面两个注解和并 -->
	<mvc:annotation-driven />

	<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
		<property name="mediaTypes">
			<map>
				<entry key="atom" value="application/atom+xml" />
				<entry key="html" value="text/html" />
				<entry key="json" value="application/json" />
			</map>
		</property>
		<property name="viewResolvers">
			<list>
				<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
				<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
					<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
					<property name="prefix" value="/" />
					<property name="suffix" value=".jsp" />
				</bean>
			</list>
		</property>
		<property name="defaultViews">
			<list>
				<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
			</list>
		</property>
	</bean>
	
	<!-- 声明DispatcherServlet不要拦截下面声明的目录 -->
	<mvc:resources location="/script/" mapping="/script/**" />
</beans>

这里我们声明的数据除text/html还有application/json和application/atom+xml.

 

先看一下我们的jsp页面json.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>
<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="script/jquery-1.8.3.js"></script>
<title>添加用户</title>
<script type="text/javascript">
	$(function(){
		$("form :button").click(function(){
			$.ajax({
				   type: "POST",
				   url: "user/testJson",
				   success:function(data){
					   alert("名字:" + data.name + "年龄:" + data.age);
				   }
			});
		});
	});
</script>
</head>
<body>
	<form action="user/addUser" method="post">
		用户名:<input type="text" id="name" name="name" /><br/>
		年龄:<input type="text" id="age" name="age" />
		<input type="button" value="提交" />
	</form>
</body>
</html>

 

 向user/testJson发送请求.成功后显示返回数据.

 

看一下Controller

package gd.hz.springmvc.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller("userController")
@RequestMapping("user")
public class UserController {
	
	@RequestMapping("testJson")
	@ResponseBody
	public Map<String, Object> testJson() {
		System.out.println("testJson");
		Map<String, Object> modelMap = new HashMap<String, Object>();
		modelMap.put("name", "lfd");
		modelMap.put("age", "20");
		return modelMap;
	}
}

 @ResponseBody 将内容或对象作为 HTTP 响应正文返回,使用@ResponseBody将会跳过视图处理部分,将返回值写入输出流。

这里我放入的是简单的数据类型,也可以是复杂对象.集合.在页面可以用循环获取

 

再看一下使用ajax发送和接收数据:

还先看一下我们的jsp页面json2.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="script/jquery-1.8.3.js"></script>
<script type="text/javascript" src="script/jquery.json-2.4.js"></script>
<title>添加用户</title>
<script type="text/javascript">
	$(function(){
		$.fn.serializeObject = function(){
		    var o = {};
		    var a = this.serializeArray();
		    $.each(a, function(){
		        if (o[this.name]) {
		            if (!o[this.name].push) {
		                o[this.name] = [o[this.name]];
		            }
		            o[this.name].push(this.value || '');
		        }
		        else {
		            o[this.name] = this.value || '';
		        }
		    });
		    return o;
		};
		
		$("#form :button").click(function(){
	        var jsonuserinfo = $.toJSON($('#form').serializeObject());
	        alert(jsonuserinfo);
	        jQuery.ajax({
	            type: 'POST',
	            contentType: 'application/json',
	            url: 'user/testJson2',
	            data: jsonuserinfo,
	            dataType: 'json',
	            success: function(data){
	                alert("名字:" + data.name + "年龄:" + data.age);	            
		    },
	            error: function(){
	                alert("error");
	            }
	        });
	    });
	});
</script>
</head>
<body>
	<form action="user/addUser" method="post" id="form">
		用户名:<input type="text" id="name" name="name" /><br/>
		年龄:<input type="text" id="age" name="age" />
		<input type="button" value="提交" />
	</form>
</body>
</html>

 这里除了使用jquery-1.8.3.js外还使用了一个插件jquery.json-2.4.js,大家可以上网下载

它的简单用法:

var thing = { plugin: 'jquery-json', version: 2.4 };

var encoded = $.toJSON( thing );
// '{"plugin":"jquery-json","version":2.4}'
var name = $.evalJSON( encoded ).plugin;
// "jquery-json"
var version = $.evalJSON(encoded).version;

  

 

 下面这个方法是将表单中的数据组成json格式.

$.fn.serializeObject = function(){
		    var o = {};
		    var a = this.serializeArray();
		    $.each(a, function(){
		        if (o[this.name]) {
		            if (!o[this.name].push) {
		                o[this.name] = [o[this.name]];
		            }
		            o[this.name].push(this.value || '');
		        }
		        else {
		            o[this.name] = this.value || '';
		        }
		    });
		    return o;
		};

 

Controller这边

package gd.hz.springmvc.controller;

import gd.hz.springmvc.model.User;

import java.util.HashMap;
import java.util.Map;

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("userController")
@RequestMapping("user")
public class UserController {

	@RequestMapping("testJson2")
	@ResponseBody
	public Map<String, Object> testJson2(@RequestBody User user) {
		System.out.println("testJson2");
		System.out.println(user.getName());
		System.out.println(user.getAge());
		Map<String, Object> modelMap = new HashMap<String, Object>();
		modelMap.put("name", user.getName());
		modelMap.put("age", user.getAge());
		return modelMap;
	}
}

 

@RequestBody 将 HTTP 请求正文插入方法中,将请求体写入某个对象。

还是要注意,输入年龄时要是数值.祝大家测试成功. 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVCAJAX 可以相互调用,具体步骤如下: 1. 在 Spring MVC 的控制器中定义一个处理 AJAX 请求的方法,使用 @ResponseBody 注解将方法返回值转化为 JSON 格式。 2. 在前端页面中使用 AJAX 发送请求到该方法。 3. 接收到请求后,Spring MVC 控制器处理请求并返回 JSON 数据。 4. 在前端页面中使用 JavaScript 解析 JSON 数据,完成页面的渲染和交互。 具体实现方式可以参考以下代码: 1. Spring MVC 控制器中的方法: ``` @RequestMapping(value = "/ajax", method = RequestMethod.GET) @ResponseBody public Map<String, Object> handleAjaxRequest() { Map<String, Object> result = new HashMap<>(); // 处理 AJAX 请求,返回数据 result.put("key1", "value1"); result.put("key2", "value2"); return result; } ``` 2. 前端页面中的 AJAX 请求: ``` $.ajax({ url: "/ajax", type: "GET", dataType: "json", success: function(data) { // 处理返回的 JSON 数据 console.log(data); }, error: function(xhr, status, error) { // 处理请求失败的情况 console.log("AJAX request failed: " + status + ", " + error); } }); ``` 注意,在 Spring MVC 的配置文件中,需要添加以下配置,以支持将方法返回值转化为 JSON 格式: ``` <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值