日期:2014-05-16  浏览次数:20324 次

struts2+prototype.js实现ajax的无刷新crud操作
CRUD是Create(创建)、Read(读取)、Update(更新)和Delete(删除)的缩写,除了R,其它每次操作都是对数据库进行了改动,所以,无可避免的要重新对数据库取一遍数据,然后在JSP页面进行显示。如果是无刷新,最笨的方法就是将html代码写到java类里,但如果这样做,你肯定要被扔鸡蛋,下面介绍一种比较容易上手的操作。
首先,我们看一下,仅仅使用struts2,怎么实现CRUD操作。这里,拿删除做例子,其它都雷同。
看一下action类的的内容
public class CRUDAction extends ActionSupport {
	private CRUDEntity crudEntity;//实体Bean

	private List<CRUDEntity> entityList;

	private CRUDService crudService;//实体业务类

	private int cpage = 1;//默认当前页是1

	private static final int pageSize = 10;//每页显示10条

	public void setCrudEntity(CRUDEntity curdEntity){
		this.crudEntity = curdEntity;
	}

	public CRUDEntity getCrudEntity(){
		return this.crudEntity
	}

	public void setCrudService(CRUDService crudService){
		this.crudService = crudService;
	}

	public CURDService getCRUDService(){
		return this.crudService;
	}
	....//其它set,get方法

	/**
	* 分页显示实体信息
	*
	**/
	public 
	public String list(){
		entityList = crudService.pagedQuery(cpage,pageSize);
		return SUCCESS;
	}

	/**
	* 删除实体记录
	*
	**/
	public String delete(){
		if(crudEntity!=null && crudEntity.getId() !=null){//首先判断不为空
			crudService.deleteById(crudEntity.getId());//id是主键
		}
		return SUCCESS;
	}
}

这里service层,使用了spring 的IOC进行了注入。
再看一下,struts.xml配置文件如何写
<action name="list" method="list" class="crudAction">
	<result>/entityManage.jsp</result>
</action>
<action name="delete" method="delete" class="crudAction">
	<result type="redirect-action">list</result>
</action>

配置文件的class也把action类交给了spring管理,但是action类在spring千万不能singleton,否则当多人访问这个action时,你的action就成了有状态的类。举个例子,这里的删除主健id就有可能不是你提交的id。
注意这里的result的type是redirect-action,它表明当删除成功后,直接转向list.action操作,去数据库重新取一遍数据,其实就是response.sendRedirect()。
<%@page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<head>
		<title>资源来源管理</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
	</head>
<body>
	<table width="100%" cellspacing="0" cellpadding="0" align="center">
		<tr>
			<th>
				序号
			</th>
			<th>
				名称
			</th>
			...
			<th>
				删除
			</th>
		</tr>
		<s:iterator value="entityList" status="stats">
			<tr>
				<td>
					<s:property value="#stats.count"/>
				</td>
				<td>
					<s:property value="name"/>
				</td>
				...
				<td>
					<s:url action="delete" id="delete">
						<s:param name="crudEntity.id" value="%{id}"/>
					</s:url>
					<s:a href="%{deelte}">
						删除
					</s:a>
				</td>
			</tr>
		</s:iterator>
	</table>
</body>
</html>


到这里,应该很清楚整个流程了吧。如果不使用ajax,则每次点击删除时,重新刷一下页面。如果不想让它刷新呢?怎么办?
其实实现也是很简单的,我们对上面的例子做一点小小的感动。
类文件不用改动,XML配置文件只需改动一点

<action name="list" method="list" class="crudAction">
	<result>/entityManage.jsp</result>
</action>
<action name="show" method="list" class="crudAction">
	<result>/entityManage_main.jsp</result>
</action>
<action name="delete" method="delete" class="crudAction">
	<result type="redirect-action">show</result>
</action>


细心的读者可能比较快发现了已经修改了两处,第一:增加了一个action,原来的list是实体管理显示列表的,而在list之后又增加了一个show.action,但其实是用得Action类的一个方法,目的还是在删除后,重新到数据库里取数据。第二,将原来的delete.action的result改为show,有什么用处,往下看。
主要的改动是jsp和js
通过配置文件,可以观察到多了一个jsp文件,这个jsp文件里面是什么,代码奉上:
entityManage.jsp
<%@page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<head>
		<title>资源来