SSH---整合案例----删除功能(使用ajax)(6)

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>

       

猜你喜欢

转载自blog.csdn.net/lsh15846393847/article/details/89643326