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:


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


在前端的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字符串的方式返回到前端页面,并且不会进行页面的跳转

总结:注意细节

你可能感兴趣的:(ssh)