前段时间用ssh做Web开发用到了需要使用ajax传输数据的地方,主要涉及的内容是struts2中异步传输的方法。这里主要写返回类型为html和json的使用方法。
1.返回html内容。
先上使用ajax的代码:
$.ajax({
type: "POST",
url: "testAjax.action",
dataType: 'html',
success: function(msg) {
$("#blackCover").show();
$("#ajaxShow").html(msg);
$("#showContent").show(1000);
}
});
这个是在点击一个button以后触发的操作,使用的原因是想在一个网页上实现弹出框然后从后台读入一段数据组成的表格,显示在一个div里面。
后台对应的Action的写法:
@Controller
@Scope("prototype")
public class ExamAdminAction extends ActionSupport {
private Course course;
private List<Subjective> subjectiveS;
@Resource //基于注入的sessionFracory
private SessionFactory sessionFactory;
@Action(value="testAjax",
results={@Result(name=SUCCESS,
location="/WEB-INF/page/exam/exam_selectlist.jsp")})
public String testAction(){
course=(Course)ActionContext.getContext().getSession().get("course");
sessionFactory.getCurrentSession().refresh(course);
subjectiveS = new ArrayList<Subjective>( course.getSubjectives());
return SUCCESS;
}
/********getters and setters*******************/
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
public List<Subjective> getSubjectiveS() {
return subjectiveS;
}
public void setSubjectiveS(List<Subjective> subjectiveS) {
this.subjectiveS = subjectiveS;
}
}
这个action的目的是从后台读入数据然后装入subjectiveS这个list里面,并且返回的是一个jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<table id="showtable" class="table table-striped table-bordered table-hover manage_table" >
<thead>
<tr><th>序号</th><th>课程名称</th><th>题目内容</th> <th>操作</th>
</thead>
<tbody>
<c:forEach items="${subjectiveS}" var="subjectiveQuestion" varStatus="status" >
<tr>
<td>${status.count} </td>
<td>${subjectiveQuestion.course.courseName } </td>
<td>${subjectiveQuestion.substem } </td>
<td><button class="selectItem" value="${subjectiveQuestion.pid }" >选择</button></td>
</tr>
</c:forEach>
</tbody>
</table>
由struts完成在把数据从List里读出来填在页面上${变量}处,然后再把这个页面作为返回结果传到前端,并被ajax里的函数捕获。然后调用$(“#ajaxShow”).html(msg)是把这段页面显示在相应的位置。
2.使用json传值。
首先要确保struts安装了json插件。
在Struts中配置json插件的步骤:
1. 在lib中加入包struts2-json-plugin.jar
2. Struts.xml的package配置中使用:
<package name="default" extends="json-default">
....拦截器和基于xml的action配置....
</package>
这样就能用json传递Action中设置了setter与getter属性的方法的对象了。
值得注意的是,json插件会把所有包含getter方法的属性都序列化到返回结果中,如果Action中的某些变量不需要序列化,要在这些变量的getter方法上面加上@JSON(serialize=false)
像这样:
@JSON(serialize=false)
public Course getCourse() {
return course;
}
如果某些变量并未分配内存被序列化,程序运行时会出现异常,而且,ssh中的hibernate关联能力很强,如果漏掉了该标签,可能会导致从数据库读取大量冗余数据从而降低系统性能。
json只适合小范围传输数据,所以保留几个必要的变量不加标签用于ajax数据互动即可。
剩下的就是前后台的写法,写个测试脚本用json传值
以下是Action定义,result里面要标明是json:
@Controller
@Scope("prototype")
public class ExamAdminAction extends ActionSupport {
//不使用json
private Course course;
//使用json传值
private String searchInfo;
@Action(value="testAjax",
results={@Result(name=SUCCESS,type="json")})
public String testAction(){
return SUCCESS;
}
/********getters and setters*******************/
@JSON(serialize=false) //不序列化,加标签
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
//传值
public String getSearchInfo() {
return searchInfo;
}
public void setSearchInfo(String searchInfo) {
this.searchInfo = searchInfo;
}
}
这样searchInfo这个变量就会被封装成为json传到前台以下是ajax写法:
$.ajax({
type: "POST",
url: "testAjax.action",
dataType: 'json',
success: function(msg) {
/******调用方法*****/
alert(msg.searchInfo);
}
});