spring练习

环境搭建

web层

通过注解来注入

//controller代表web层
// 层注入了service,通过modelandview将数据展示
@RequestMapping("/role")
@Controller
	public class RoleController {

	@Autowired
	private RoleService roleService;

    @RequestMapping("/list")
    public ModelAndView list(){
        ModelAndView modelAndView = new ModelAndView();
        List<Role> roleList = roleService.list();
        //设置模型
        modelAndView.addObject("roleList",roleList);
        //设置视图
        modelAndView.setViewName("role-list");
        return modelAndView;
    }

service层

public class RoleServiceImpl implements RoleService {
//注入dao
    private RoleDao roleDao;
    public void setRoleDao(RoleDao roleDao) {
        this.roleDao = roleDao;
    }

    @Override
    public List<Role> list() {
       List<Role> roleList = roleDao.findAll();
        return roleList;
    }
}

在applicationContext中配置(这里使用的是xml注入)

<!--    配置RoleService-->
<bean id="roleService" class="com.it.service.impl.RoleServiceImpl">
    <property name="roleDao" ref="roleDao"/>
</bean>

dao层

//dao层通过jdbcTemplate对象,从数据库中取出数据

public class RoleDaoImpl implements RoleDao {
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    @Override
    public List<Role> findAll() {
        List<Role> roleList = jdbcTemplate.query("select * from sys_role", new BeanPropertyRowMapper<Role>(Role.class));
        return roleList;
    }
}

同样通过xml方式注入

<!--    配置RoleDao-->
<bean id="roleDao" class="com.it.dao.impl.RoleDaoImpl">
    <property name="jdbcTemplate" ref="jdbcTemplete"/>
</bean>

Dao层通过配置jdbcTemplate从数据库中取对象,将数据交给service层,controller层通过注入service的方式拿到对象,通过modelandview将数据展示

页面展示(角色管理页面 )

controller层通过ModelAndView来展示页面,将数据存在一个list中,通过jsp页面,将结果展示给用户
在这里插入图片描述controller层,取到数据后跳转到role-list.jsp页面
在这里插入图片描述

配置role-list页面

<tbody>
	<c:forEach items="${roleList}" var="role">
		<tr>
			<td><input name="ids" type="checkbox"></td>
			<td>${role.id}</td>
			<td>${role.roleName}</td>
			<td>${role.roleDesc}</td>
			<td class="text-center">
				<a href="#" class="btn bg-olive btn-xs">删除</a>
			</td>
		</tr>
	</c:forEach>
</tbody>

添加角色

当点击添加按钮时,进入添加页面,将数据存入数据库之后,点保存,页面回跳到角色展示页面(role-list.jsp)

① 点击列表页面新建按钮跳转到角色添加页面
② 输入角色信息,点击保存按钮,表单数据提交服务器
在role-add.jsp页面中,找到表单(添加数据的表单)

**<form action="${pageContext.request.contextPath}/role/save" method="post">**
				<!-- 正文区域 -->
	<section class="content"> <!--产品信息-->
		<div class="panel panel-default">
		<div class="panel-heading">角色信息</div>
		<div class="row data-type">

		<div class="col-md-2 title">角色名称</div>
		<div class="col-md-4 data">
		<input type="text" class="form-control" name="roleName" placeholder="角色名称" value="">
		</div>
				<div class="col-md-2 title">角色描述</div>
				<div class="col-md-4 data">
		<input type="text" class="form-control" name="roleDesc" placeholder="角色描述" value="">
	</div>
</div>
</div>

重点在第一句,通过找role路径下的save方法

③ 编写RoleController的save()方法
controller中注入service
save方法中传入role对象,最终通过重定向转发到跳转页面

 @RequestMapping("save")
 public String save(Role role){
    roleService.save(role);
    return "redirect:/role/list";
//不能直接跳转到role-list页面,这个页面是没有数据的,必须通过role然后找list来跳转
}

④ 编写RoleService的save()方法

@Override
public void save(Role role) {
    roleDao.save(role);
}

⑤ 编写RoleDao的save()方法

@Override
public void save(Role role) {
   jdbcTemplate.update("insert into sys_role values (?,?,?)",null,role.getRoleName(),role.getRoleDesc());
}

⑥ 使用JdbcTemplate保存Role数据到sys_role
⑦ 跳转回角色列表页面

用户列表展示

在这里插入图片描述具有角色这里比较难,具有角色这里,一个人可能有多个角色,对应在数据库表中,sys_user_role中的roleId要与sys_role中id相等,才能查询出来

在user-list.jsp页面

<c:forEach items="${userList} " var="user">
//需要找user这个方法
<tr>
	<td><input name="ids" type="checkbox"></td>
	<td>${user.id}</td>
	<td>${user.username}</td>
	<td>${user.email}</td>
	<td>${user.phoneNum}</td>
		<td class="text-center">
		<c:forEach items="${user.roles}" var="role">${role.roleName}
</c:forEach>
		</td>
<td class="text-center">
		<a href="javascript:void(0);" class="btn bg-olive btn-xs">删除</a>
		</td									
	</tr>
</c:forEach>

配置UserController,注入userService

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/list")
    public ModelAndView list(){
        ModelAndView modelAndView = new ModelAndView();
        List<User> roleList = userService.list();
        //设置模型
        modelAndView.addObject("userList",roleList);
        //设置视图
        modelAndView.setViewName("role-list");
        return modelAndView;
    }

}

配置UserService,注入roleDao和userDao,返回之前封装userList每个user中roles数据(具体就是user具有的角色)意思就是在service层就返回角色

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }


    private RoleDao roleDao;

    public void setRoleDao(RoleDao roleDao) {
        this.roleDao = roleDao;
    }

    @Override
    public List<User> list() {
        List<User> userList = userDao.findAll();
        //返回之前封装userList每个user中roles数据(具体就是user具有的角色)

        for (User user:
             userList) {
            Long id = user.getId();
            //将id作为参数,查询当前userId对应的Role集合的数据
            //调用
           List<Role> roles = roleDao.findRoleByUserId(id);
           user.setRoles(roles);
        }
        return userList;
    }
}

解释一下上面的方法

userDao.findAll()

在userDao(用户实现类的dao)实现类中,findAll()来对sys_user进行查询,然后封装为一个userList

@Override
public List<User> findAll() {
   List<User> query = jdbcTemplate.query("select * from sys_user", new BeanPropertyRowMapper<User>(User.class));
   return query;
    }

遍历上述userList,得到id,因为要两个表互联,调用roleDao(角色实现类的dao)中的findRoleByUserId方法

@Override
public List<Role> findRoleByUserId(Long id) {
   List<Role> roles = jdbcTemplate.query
   ("select * from sys_user_role ur,sys_role r where ur.roleId=r.id and ur.userId=?"
   		 , new BeanPropertyRowMapper<Role>(Role.class), id);
   return roles;
    }

添加用户

在这里插入图片描述
在这里插入图片描述
重点在于用户角色上,需要在UserController中注入RoleService

@RequestMapping("/saveUI")
public ModelAndView saveUI(){
    ModelAndView modelAndView = new ModelAndView();

    List<Role> roleList = roleService.list();
    modelAndView.addObject("roleList",roleList);
    modelAndView.setViewName("user-add");
    return modelAndView;
    }

跳转到user-add.jsp页面,在页面进行动态展示

<c:forEach items="${roleList}" var="role">
	<%--值为role 的id值 roleName为展示的值--%>
	<input class="" type="checkbox" name="roleIds" value="${role.id}">${role.roleName}
</c:forEach>

上面的操作只是展示界面

当真正向表单中添加数据时,应分为两步

  1. 将用户名称、邮箱、密码、联系电话封装成一个
  2. 将角色(数组)封装成一个

UserController中

@RequestMapping("/save")
public String save(User user,Long[] roleIds){
    userService.save(user,roleIds);
	return "redirect:/user/list";
}

UserService

@Override
public void save(User user, Long[] roleIds) {
//        1.第一步向sys_user中存放数据
    Long userId=userDao.save(user);
//        2.向sys_user_role关系表中存放多条数据
    userDao.saveUserRel(userId,roleIds);
}

UserDao中

@Override
public Long save(User user) {
        //创建PreparedStatementCreator
        PreparedStatementCreator creator = new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
//                原有jdbc完成PreparedStatement组件
                PreparedStatement preparedStatement = connection.prepareStatement
                        ("insert  into sys_user values (?,?,?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS);
                preparedStatement.setObject(1,null);
                preparedStatement.setObject(2,user.getUsername());
                preparedStatement.setObject(3,user.getEmail());
                preparedStatement.setObject(4,user.getPassword());
                preparedStatement.setObject(5,user.getPhoneNum());
                return preparedStatement;
            }
        };
        //创建keyHolder
        GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(creator,keyHolder);
        long userId = keyHolder.getKey().longValue();

//        jdbcTemplate.update("insert  into sys_user values (?,?,?,?,?)",
//                null, user.getUsername(),user.getEmail(),user.getPassword(),user.getPhoneNum()
//                );


         //返回当前保存用户的id,是数据库自动生成的
         return userId;
    }


    @Override
    public void saveUserRel(Long userId, Long[] roleIds) {
        for (Long roleId:roleIds){
            jdbcTemplate.update("insert into sys_user_role values (?,?)",
                    userId,roleId);
        }
    }

删除用户

sys_user_role表
sys_user表

在UserController中

@RequestMapping("/del/{userId}")
public String del(@PathVariable("userId") Long userId){
        userService.del();
        return "redirect:/user/list";
    }

在UserService中

public void del(Long userId) {
    //删除sys_user_role关系表
    userDao.delUserRoleRel(userId);
    //删除sys_user关系表
    userDao.del(userId);
    }

UserDao中

@Override
    public void delUserRoleRel(Long userId) {
        jdbcTemplate.update("delete from sys_user_role where userId=?",userId);
    }

    @Override
    public void del(Long userId) {
        jdbcTemplate.update("delete from sys_user where id=?",userId);
    }

登录

需要设置过滤器进行拦截,登陆成功放行,不成功就跳转到login界面

在spring-mvc中

<mvc:interceptors>
<!--        配置对哪些资源执行拦截操作-->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
<!--            配置哪些资源不被拦截-->
        <mvc:exclude-mapping path="user/login"/>
            <bean class="com.it.interceptor.PrivilegeInterceptor"/>
        </mvc:interceptor>
</mvc:interceptors>

UserController中

@RequestMapping("/login")
public String login(String username, String password, HttpSession session){
    User user=userService.login(username,password);
        if (user != null){
        //登陆成功, 将user存储到session中
            session.setAttribute("user",user);
            return "redirect:/index.jsp";
   }
   return "redirect:/login/list";
}

在UserService中

@Override
public User login(String username, String password) {
   try {
       User user=userDao.findByUsernameAndPassword(username,password);
   }catch (EmptyResultDataAccessException e){
       return null;
	}
        return null;
}

UserDao

@Override
public User findByUsernameAndPassword(String username, String password) throws EmptyResultDataAccessException {
   //当登录错误时,抛出异常
   User user = jdbcTemplate.queryForObject("select * from sys_user where username=? and password=?",new BeanPropertyRowMapper<User>(User.class),username,password);
    return user;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值