Java开发学习.Day5

ssm批量删除、拦截和用户权限

包括基于ssm实现的批量删除、拦截和用户权限功能(该项目基于Java开发学习.Day4)进行开发

批量删除

实现用户列表的批量删除
先在userDao层声明一个批量删除的接口

void deleteAll(@Param("ids")List<Integer> ids);

在usermapper中添加deleteAll的具体sql语句

<delete id="deleteAll" parameterType="list">
     delete from user_ssm where id in
     <foreach collection="ids" item="id" open="(" close=")" separator=",">
         #{id}
     </foreach>
</delete>

在Service中声明一个接口

void deleteAll(List<Integer> ids);

再在impl中实现该接口并调用dao接口

@Override
public void deleteAll(List<Integer> ids) {
    userDao.deleteAll(ids);
}

前端层将所有获取到的选择框的id先保存到userList中,通过ajax将数据传到后端进行处理

function deleteAll() {
	var checkedNum=$("input[name='ids']:checked").length;
	alert(checkedNum);
	if(checkedNum==0){
		alert("请至少选择一个进行删除!!!");
		return;
	}
	if(confirm("确认要删除这些用户吗?")){
		var userList=new Array();
		$("input[name='ids']:checked").each(
			function () {
				userList.push($(this).val())
			}
		);
		alert(userList);
		$.ajax({
			type:"post",
			url: "${pageContext.request.contextPath}/user/deleteAll.do",
			data:{userList:userList.toString()},
			success:function () {
				alert("删除成功");
				location.reload();
			},
			error:function () {
				alert("删除失败");
			}
		});
	}
}

在controller对接收到的字符串先进行分割处理成数组,再遍历添加进集合中

//批量删除
@RequestMapping("/deleteAll.do")
public String deleteAll(String userList){
    String[] str = userList.split(",");
    List<Integer> ids = new ArrayList<>();
    for(String s:str){
        ids.add(Integer.parseInt(s));
    }
    userService.deleteAll(ids);
    return "redirect:findAll.do";
}

Filter拦截器

对于非法用户访问系统,需要对其进行拦截
使用Filter可以对用户请求进行预处理和HttpServletResponse进行后处理

修改controller中的login方法,当用户登陆验证成功时,将用户信息存入session 的 ‘user’ 字段中

public ModelAndView login(User user,HttpSession session){
int id = userService.login(user.getUsername(),user.getPassword());

ModelAndView mv = new ModelAndView();
if(id != -1){
     List<Integer> roleIds = roleService.findRoleId(id);
     session.setAttribute("roleIds",roleIds);
     session.setAttribute("user",user);  //存入user
     mv.setViewName("main");
}else{
 	mv.setViewName("../failer");
}
return mv;

}

在和controller同级目录下新建一个filter 包,在filter 包下新建一个loginFilter.java文件,实现拦截功能。
在doFilter中提取到之前存入session的user值,并联合当前路由进行判断。当没有用户且不是登陆界面的情况下跳转到login,将被拦截返回至登录界面,其他情况则继续验证

public class loginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;      //请求体
        HttpServletResponse response = (HttpServletResponse) servletResponse;   //响应体
        HttpSession session = request.getSession();  //用户发送的请求
        User user = (User) session.getAttribute("user");
        String uri = request.getRequestURI();
        if(user==null && uri.indexOf("login.do")==-1){  //验证失败
            response.sendRedirect(request.getContextPath()+"../login.jsp");
        }else{
            filterChain.doFilter(request,response);     //验证成功
        }
    }

    @Override
    public void destroy() {

    }
}

在配置好controller和filter之后还需要到web.xml配置文件中配置启动过滤器

 <!--登录拦截过滤器-->
  <filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.xxxxbt.filter.loginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>

用户权限

该功能用于添加用户权限
在mysql中ssm库下新建数据表role_ssm和user_role,分别用于储存角色种类和用户角色关系映射。表结构如下
在这里插入图片描述
在这里插入图片描述

(2)新建实体类
在实体类中添加Role类和UserRole类

public class Role {
    private int id;
    private String rolename;//名称
    private String roledesc;//描述

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRolename() {
        return rolename;
    }

    public void setRolename(String rolename) {
        this.rolename = rolename;
    }

    public String getRoledesc() {
        return roledesc;
    }

    public void setRoledesc(String roledesc) {
        this.roledesc = roledesc;
    }
}
public class UserRole {

    //将用户和角色结合在一起
    private int id;
    private int userId;
    private int roleId;

    public UserRole() {
    }

    public UserRole(int id, int userId, int roleId) {
        this.id = id;
        this.userId = userId;
        this.roleId = roleId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getRoleId() {
        return roleId;
    }

    public void setRoleId(int roleId) {
        this.roleId = roleId;
    }

    @Override
    public String toString() {
        return "UserRole{" +
                "id=" + id +
                ", userId=" + userId +
                ", roleId=" + roleId +
                '}';
    }
}

在dao目录下新建一个专门用于处理Role相关数据库操作的RoleDao接口

public interface RoleDao {
	//根据userid查找roleid
    List<Integer> findRoleIdByUserId(int userId);
	//根据userid查找role
    List<Role> findRoleByUserId(int id);
	//添加role
    void addRole(UserRole userRole);
}

新建一个RoleMapper来声明sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.tengshan.dao.RoleDao" >

    <select id="findRoleIdByUserId" parameterType="int" resultType="int">
        select roleId from user_role where userId=#{userId}
    </select>

    <select id="findRoleByUserId" parameterType="int" resultType="role">
        select * from role_ssm where id not in (
            select roleId from user_role where userId=#{id}
        )
    </select>

    <insert id="addRole" parameterType="userRole">
        insert into user_role (userId,roleId) values (#{userId},#{roleId})
    </insert>
</mapper>

在service中新建一个RoleService接口

public interface RoleService {

    List<Integer> findRoleId(int userId);

    List<Role> findRoleByUserId(int id);

    void add(List<Integer> ids,String userId);
}

在RoleServiceImpl实现RoleService接口

@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Override
    public List<Integer> findRoleId(int userId) {
        System.out.println(roleDao.findRoleIdByUserId(userId).toString()+"impl中");
        return roleDao.findRoleIdByUserId(userId);
    }

    @Override
    public List<Role> findRoleByUserId(int id) {
        return roleDao.findRoleByUserId(id);
    }

    @Override
    public void add(List<Integer> ids, String userId) {
        for(int roleId:ids){
            UserRole userRole = new UserRole();
            userRole.setUserId(Integer.parseInt(userId));
            userRole.setRoleId(roleId);
            roleDao.addRole(userRole);
        }
    }
}

修改UserController中添加,赋予用户权限的方法

@RequestMapping("toAddRole.do")
public ModelAndView toAddRole(int id){
    List<Role> roleList = roleService.findRoleByUserId(id);
    ModelAndView mv = new ModelAndView();
    mv.addObject("roles",roleList);
    mv.addObject("id",id);
    mv.setViewName("user-role-add");
    return mv;
}

@RequestMapping("addRole.do")
@ResponseBody
public String add(String roleList,String userId){
    String[] strs = roleList.split(",");
    List<Integer> ids = new ArrayList<>();
    for(String s:strs){
        ids.add(Integer.parseInt(s));
    }
    roleService.add(ids,userId);
    return "";
}

在用户列表界面中添加一个button,实现跳转添加角色界面,该button仅有管理员才能查看,普通用户不能进行该操作
在user-list.jsp下添加如下代码

<td class="text-center">
<a href="/user/toUpdate.do?id=${user.id}" class="btn bg-olive btn-xs">更新</a>
	<a href="/user/deleteById.do?id=${user.id}" class="btn bg-olive btn-xs">删除</a>
	<% List<Integer> roleIds = (List<Integer>) session.getAttribute("roleIds");%>
	<% if (roleIds.contains(1)){ %>
	<a href="/user/toAddRole.do?id=${user.id}">添加角色</a>
	<% } %>
</td>

最终实现

批量删除


用户列表页数明显减少
在这里插入图片描述

Filter拦截

未登录,直接访问findAll.do将会跳转至login.jsp界面
在这里插入图片描述

添加用户权限

在这里插入图片描述
可选择两种权限进行添加
在这里插入图片描述
再次进入只有一种权限待添加
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值