1. 需求:在如下的显示页面中,删除一条记录。
2.实现方法之一:在action中使用重定向。
2.1 jsp请求页面。(查询出数据库中所有的员工结果如上。) 发送请求经由struts.xml文件中配置的action到达指定的
action类的指定方法。
<a href="emp-list"> List All Employees</a>
2.2 struts.xml(发送emp-list请求时,会获取到所有的员工。再次点击Delete超链接)
<action name="emp-*" class="employeeAction" method="{1}">
<result name="list">/WEB-INF/views/emp-list.jsp</result>
<result name="success" type="redirect">/emp-list</result>
</action>
2.3 emp-list.jsp 页面如下。点击Delete超链接会发送请求,同上,去调用对应action类(class="employeeAction")的指定方
法(delete方法)
<table border="1" cellpadding="10" cellspacing="0">
<tr>
<td>ID</td>
<td>LASTNAME</td>
<td>EMAIL</td>
<td>BRITH</td>
<td>CREATETIME</td>
<td>DEPT</td>
<td>DELETE</td>
</tr>
<s:iterator value="#request.employees">
<tr>
<td>${id}</td>
<td>${lastName}</td>
<td>${mail}</td>
<td>${brith}</td>
<td>${creatTime}</td>
<td>${department.departmentName}</td>
<td><a href="emp-delete?id=${id}" class="delete">Delete</a>
<input type="hidden" id="hidName" value="${lastName}"></td>
</tr>
</s:iterator>
</table>
2.4 EmployeeAction类(指定的action类)执行delete方法,id是jsp页面传过来的参数。
中间在调用service层(服务层) 的EmployeeService类的相关方法(delete方法)
其中会调用dao层(EmployeeDao类)去查询数据库,执行指令。
最终如果成果返回success,到struts.xml配置的action的result处,经过重定向重新加载目标页面
此时就会全页面刷新,重新显示删除后的结果。
public class EmployeeAction extends ActionSupport implements RequestAware {
private EmployeeService employeeService;
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
private Integer id;
public void setId(Integer id) {
this.id = id;
}
public String delete(){
employeeService.delete(id);
return success;
}
}
public class EmployeeService {
private EmployeeDao employeeDao;
public void setEmployeeDao(EmployeeDao employeeDao) {
this.employeeDao = employeeDao;
}
public void delete(Integer id){
employeeDao.delete(id);
}
}
public class EmployeeDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getSession(){
return this.sessionFactory.getCurrentSession();
}
public void delete(Integer id){
String hql = "delete from Employee e where e.id= ?";
getSession().createQuery(hql).setInteger(0, id).executeUpdate();
}
}
2.5 既然这样已经可以实现删除操作,为什么还要使用ajax呢?
2.5.1. 需要实现在删除操作时消息框弹出的需求。
2.5.2. 使用在action中的重定向来实现的删除操作,重定向时,会重新加载目标页面,实现整个页面刷新。
但是我只想要页面的某一部分刷新,所以得使用ajax技术。
其实使用ajax后,到指定的action中的指定方法之后的操作都相同,问题在于如何在struts2中使用ajax。
3.实现方法之二:使用ajax技术实现,
3.1 加入jQuery,引入加入的script
<script type="text/javascript" src="scripts/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(function() {
})
</script>
3.2 给超链接添加点击事件,并且取消原来超链接的默认请求,按照我们需要的方式发送请求。还用post方式。
关于如何使用post方式发送请求,参看其他文章。
<script type="text/javascript">
$(function() {
//1.点击delete时,弹出消息框
$(".delete").click(function() {
var name = $("#hidName").val();
var flag = confirm("确认要删除" + name + "信息吗?");
if (flag) {
var url = this.href;
var para = {
"time" : new Date()
};
//struts2是如何实现ajax的返回值的呢?
$.post(url, para, function(data) {
if (data == "1") {
alert("删除");
} else {
alert("没删除");
}
});
}
return false; //取消默认行为
});
})
</script>
3.3 如上发送请求后,会在回调函数中得到执行结构的返回值(data)。可以根据返回值来动态删除页面的某一部分内容。
如何在struts2中使用ajax,得到返回值。参看 \struts-2.3.15.3\docs\WW\docs\ajax.html struts2自带的文档查看。
如何得到post的回调函数的返回值呢?此处使用inputStream流的方式,因为需要返回值的值只是一个数字,
如果返回别的会有其他方式。正确执行返回“1”,出现错误返回“0”
public class EmployeeAction extends ActionSupport implements RequestAware {
private EmployeeService employeeService;
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
private Integer id;
public void setId(Integer id) {
this.id = id;
}
private InputStream inputStream;
public InputStream getInputStream() {
return inputStream;
}
public String delete() throws UnsupportedEncodingException{
try {
employeeService.delete(id);
inputStream = new ByteArrayInputStream("1".getBytes("UTF-8"));
} catch (Exception e) {
inputStream = new ByteArrayInputStream("0".getBytes("UTF-8"));
e.printStackTrace();
}
return "delete";
}
}
public class EmployeeService {
private EmployeeDao employeeDao;
public void setEmployeeDao(EmployeeDao employeeDao) {
this.employeeDao = employeeDao;
}
public void delete(Integer id){
employeeDao.delete(id);
}
}
public class EmployeeDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getSession(){
return this.sessionFactory.getCurrentSession();
}
public void delete(Integer id){
String hql = "delete from Employee e where e.id= ?";
getSession().createQuery(hql).setInteger(0, id).executeUpdate();
}
}
sturts.xml文件如下配置,取消原来的重定向。根据回调函数的返回值来决定删除画面的那个部分,实现部分刷新。
<package name="default" namespace="/" extends="struts-default">
<action name="emp-*" class="employeeAction" method="{1}">
<result name="list">/WEB-INF/views/emp-list.jsp</result>
<result name="delete" type="stream" >
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
</package>