环境搭建
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>
上面的操作只是展示界面
当真正向表单中添加数据时,应分为两步
- 将用户名称、邮箱、密码、联系电话封装成一个
- 将角色(数组)封装成一个
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;
}