批量删除,其解决方案就是从前台获得每个checkbox的id值,然后通过url传给后台处理,其实大家看我的
Ajax前后台传值小demo可知,其实那篇文章就是一个雏形,这篇文章只不过将模拟付诸于实践,而这篇文章采用的技术为spring mvc+mybatis+jquery+display标签
关于spring mvc及mybatis的配置(含mybatisutil工具类)请分别参考spring mvc 小demo验证javabean 和mybatis操作oracle数据库主键自增(触发器)两篇文章,此处不再赘述
至此所有的controller,service,到层和entity类都已完成,只差表现层的jsp
首先看底层数据库在mysql中设计一张Admin表,由于是一个demo,所以就设计了三个字段,大家对应Admin实体类能够看出的
package com.bean;
public class Admin {
private int id;
private String name;
private String pwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
当然还有对应的xml文件
<mapper namespace="com.bean.Admin">
<select id="deleteById" parameterType="int" resultType="int">
delete from admin where id=#{id}
</select>
<select id="list" resultType="Admin">
select * from admin
</select>
</mapper>
然后是controller层
package com.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.bean.Admin;
import com.service.AdminService;
@Controller
@RequestMapping({"/jsp/"})
public class AdminController {
private AdminService adminService;
@RequestMapping({"list"})
public ModelAndView list(HttpServletRequest request, HttpServletResponse response){
adminService = new AdminService();
List<Admin>list = adminService.list();
ModelAndView mv = new ModelAndView();
mv.setViewName("adminList");
mv.addObject("adminList", list);
return mv;
}
@RequestMapping({"delete"})
public void deleteAll(HttpServletRequest request,HttpServletResponse response) throws IOException{
adminService = new AdminService();
String strId = request.getParameter("id");
if (strId==null||strId.length()==0) {
return ;
}
String strIds[] = strId.split(",");
int ids[] = new int[strIds.length];
for (int i = 0; i < ids.length; i++) {
ids[i] = Integer.parseInt(strIds[i]);
}
adminService.deleteAll(ids);
response.sendRedirect("list") ;
}
}
接着是service层
package com.service;
import java.util.List;
import com.bean.Admin;
import com.dao.AdminDao;
public class AdminService {
private AdminDao adminDao;
public List<Admin> list() {
adminDao = new AdminDao();
return adminDao.list();
}
public void deleteAll(int ids[]){
adminDao = new AdminDao();
for (int id : ids) {
adminDao.deleteById(id);
}
}
}
再接着是dao层
package com.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.bean.Admin;
import com.util.MybatisUtil;
public class AdminDao {
private SqlSession session;
public List<Admin> list() {
session = MybatisUtil.getSession();
List<Admin> list = session.selectList(Admin.class.getName()+".list");
session.close();
return list;
}
public int deleteById(int id) {
session = MybatisUtil.getSession();
System.out.println(id);
int count = session.delete(Admin.class.getName()+".deleteById", id);
session.commit();
session.close();
return count;
}
}
前台的jquery代码
$(document).ready(function(){
postData();
});
function postData(){
$("a").click(function() {
var ck = $("input[type='checkbox']:checked");
var len = ck.length;
if(len==0){
return false;
}
ck.each(function(pointer) {
var current = $(this);
if (pointer < len - 1) {
val += current.val() + ",";
} else {
name = current.attr("name");
val += current.val();
}
});
var url = "jsp/delete?id=" + val;
window.location.href=url;
对于jsp,只需要在页面中获得,引入display标签需要引入<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>
<display:table name="adminList" id="adminItem" requestURI="list">
<display:column title="${checkAll}">
<input type="checkbox" name="id" value="${adminItem.id}" />
</display:column>
<display:column property="name" title="姓名"></display:column>
<display:column property="pwd" title="密码"></display:column>
</display:table>
总结和遇到的问题
1.原来我采用和ajax那个小demo中一样使用的跳转方式使用ajax跳转到后台,但是会出现ajax中探讨过得第一个问题,那样也行,只不过是在success回调中跳转,但是发现完全没有必要,直接跳转,然后在delete方法中再发一次请求,跳转到list方法中
2.对于spring mvc中引用js,css和图片文件需要指明对于如下资源文件不采用spring的过滤器,在web.xml中的代码配置如下
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
3.对于遍历取checkbox中checked的值的那些checkbox,应该只遍历一遍,而不是像这样
var str = "";
var ck = $("input[type='checkbox']:checked");
for(var i=0;i<ck.length;i++){
if(ck[i].checked)
{
str+=ck[i].value+",";
}
}
str = str.substring(0, str.length-1);
这样相当于遍历了两遍。
如果文章有什么错误或者有什么建议,欢迎提出,大家共同交流,一起进步
文章转载请注明出处,请尊重知识产权