SSH框架前后端数据交互——ajax+json

Struts2通过属性驱动和模型驱动将请求参数封装到后端的actio中,然后action处理完数据跳转到另一个页面,同时,Struts2也会将这些处理完数据压入值栈,在跳转后的页面就可以用el表达式取出使用。
这是一种很方便的形式,但是如果我不想让页面跳转,想要处理完这些数据之后还是想回到我原来的页面,同时又想带回一些不会被压入值栈的数据,这下该怎么办呢(注:不会被压入值栈的数据就是非实体类模型的属性,以及没有在动作类中声明并生成getter、setter方法的数据)?一个方法是:在动作类中声明我要带回到页面的数据的变量,然后生成getter、setter方法,这样这个变量就会被自动压入值栈中,可以在页面用el表达式获取。但随之而来的问题是:如果这些变量多了,那么动作类将会充满变量和getter、setter方法,使整个类臃肿不堪;同时值栈也会臃肿不堪。
那么此时就要使用ajax+json了。ajax用于前端页面的请求,将json数据带到action中。struts2的驱动也可以很简便的将ajax中的json数据带到action中。
这里使用ajax+json实现从前端页面到action中,以及action到前端页面的数据交互。关于ajax的原理及原生JavaScript实现ajax都不介绍,因为不是重点。只介绍用juqery+ajax+json便捷的实现数据在SSH框架中的交互的过程。
前端页面:
引入jquery,绑定事件和元素,创建JSON对象,再用ajax函数将数据发送到动作类中。
例如:想要页面一加载就发送ajax请求并将数据带到action:

<script type="text/javascript">
	//页面一加载就执行test()方法
	$(document).ready(test()) ;
</script>

具体的test()方法(注意顺序,js加载的顺序会影响具体的执行,实际上test()的实现要在上面的js代码前):

<script type="text/javascript">
function test(){
	var jsondata =  {
		"content" : "test ajax+json"		
		} ;
	$.ajax({
		//发送数据的方式,POST/GET
		type : "GET" ,
		//请求url,即请求的action,jsp中的js可以使用el表达式,html中就用路径
		url : "${pageContext.request.contextPath}/ajaxTest.action" ,
		//发送的
		data : jsondata, 
		//选择传输的数据的格式
		dataType : "JSON" ,
		//如果请求成功,并且action执行成功,则会返回到这个success的函数中,函数的返回值data就		     	是action中返回的数据,一般返回的是JSON字符串类型的数据
		success : function(data){
			//看看传回的数据
			alert(data) ;  //   "{ /"returndata/"  :   /" success/"}" 
			//将json字符串转为json对象
			var data=JSON.parse(data) ;   //{"returndata" : "success"}
			//取出显示json对象的value
			alert(data.returndata) ;      //"success"
		}
	}) ;
}
</script>

在前端的json数据为:

var jsondata =  {
		"content" : "test ajax+json"		
		} ;

json数据可以看做是一个key-value的键值对。
1.如果要在action中接收,则动作类要声明与这个json数据的k相同名称的变量,即上述的“content”,类型为String。
注意切忌声明的是jsondata,这样是接收不到的。
如果jsondata对象里面的数据很多,则将jsondata在后端创建为实体类domain,然后就可以声明这个实体类,用实体类对象来接收,每个key即是实体类的属性,value是值。
2.在动作类中还要声明一个String类型的data变量,用于存储回传的json字符串
3.动作类要继承的包从"struts-default"变为了"json-default"
4.要导入与json相关的jar包以及struts2对json的支持的jar包
jar包汇总:链接:https://pan.baidu.com/s/1lEuBQt8P06U6sW90_-WmyQ
提取码:316r (不需要用为了jar包这种东西烦心)
5.注意@Action注解的写法

后端action中:

@ParentPackage("json-default")
public class testAction extends ActionSupport {
private String content ;
	private String data ;
	
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
}

//固定写法,type="json"、params= {"root","data"}的"root"是固定的,"data"是要返回到前端页面的变量名
@Action(value="ajaxTest",results= {@Result(name="success",type="json",params= {"root","data"})})
	public String jsonTest() {
		//查看ajax发送的数据
		System.out.println(content);//test ajax+json
		//要发回到前端的数据,封装在jsondata中
		//拼接一个json字符串,实际用JSONObject类来将其他数据类型的对象(例如Map集合的对象)
		//转为json对象,然后再toString变成json字符串,这里用最简单的拼接
		data  = "{\"returndata\" : \"success\"}" ;
		return SUCCESS ;
	}

这样就可以将数据封装在data中用json字符串的方式返回到前端页面,并且不会进行页面的跳转

总结:注意细节

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值