用户模块 与 部门模块 是一对多关系
一个用户属于 一个部门,一个部门可以有多个用户。
用户模块的字段
private String id;
private String email; //邮箱
private String userName; //姓名
private String password; //密码
private Long state; //状态
private String gender; //性别
private String telephone; //电话
private Date birthday; //出生年月
private Date joinDate; //入职时间
private String deptId; //部门id
private Dept dept; // 用来关联部门模块的 部门对象
用户模块 与 部门模块的 dao层和service层基本方法一样。
但实现的接口要是自己模块中的
不一样的是 mybatis映射配置文件
<mapper namespace="com.itheima.dao.system.UserDao">
<resultMap id="BaseResultMap" type="com.itheima.domain.system.User">
<id column="user_id" jdbcType="VARCHAR" property="id"/>
<result column="email" jdbcType="VARCHAR" property="email"/>
<result column="user_name" jdbcType="VARCHAR" property="userName"/>
<result column="password" jdbcType="VARCHAR" property="password"/>
<result column="state" jdbcType="DECIMAL" property="state"/>
<result column="gender" jdbcType="CHAR" property="gender"/>
<result column="telephone" jdbcType="VARCHAR" property="telephone"/>
<result column="birthday" jdbcType="VARCHAR" property="birthday"/>
<result column="join_date" jdbcType="VARCHAR" property="joinDate"/>
<result column="dept_id" jdbcType="VARCHAR" property="deptId"/>
<association
property="dept"
column="dept_id"
javaType="com.itheima.domain.system.Dept"
select="com.itheima.dao.system.DeptDao.findById"
/>
</resultMap>
result column=“dept_id” jdbcType=“VARCHAR” property=“deptId”
column=“dept_id” 用户模块数据表的字段 关联着 部门表的id
property=“deptId” 用户模块对象里的成员变量
配置 deptId 用来关联部门模块的id
<association
property="dept"
column="dept_id"
javaType="com.itheima.domain.system.Dept"
select="com.itheima.dao.system.DeptDao.findById"
/>
column=“dept_id” 用户模块数据表的字段 关联着 部门表的id
用这个 dept_id 作为
select=“com.itheima.dao.system.DeptDao.findById”
这个根据 id 查询 获取单个部门表信息的 查询条件
将 获得到 的这个部门表信息封装成
javaType=“com.itheima.domain.system.Dept”
里 javaType写出全类名的 这个部门对象
property=“dept” 是用户模块的 成员变量dept 就部门对象
用来接受 根据 id 查询单个部门表信息的
<!--配置查询所有,带条件-->
<select id="findAll" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from ss_user
</select>
在配置 查询的SQL语句select标签中用resultMap=“BaseResultMap”
找到 resultMap标签中 名称是 BaseResultMap 的id 就能实现将数据表查询操作的结果 赋值给代码用户对象里对应的成员变量
对于controller层的UserServlet类
要现在 BaseServlet类里 将 UserService = new UserServiceImpl();声明出来,并提升它的作用域protected UserService userService;
先导入User的页面文件后再写UserServlet,将User的页面文件导入在wab/WEB-INF路径下
list是User的页面文件 显示数据信息的页面 就是用户模块主页面
add是User的页面文件 添加数据信息的页面
update是User的页面文件 编辑数据信息的页面
role是User的页面文件 角色管理的页面
UserService 里 对页面过来的密码加密
private void toAdd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//查询部门信息
List<Dept> all = deptService.findAll();
//放入指定位置
req.setAttribute("deptList",all);
//跳转页面
req.getRequestDispatcher("/WEB-INF/pages/system/user/add.jsp").forward(req,resp);
}
用户添加页面中的,获取部门模块数据
这个对应用户模块添加页面这段代码
<div class="col-md-2 title">所在部门</div>
<div class="col-md-4 data">
<select class="form-control" onchange="document.getElementById('deptName').value=this.options[this.selectedIndex].text" name="deptId">
<option value="">请选择</option>
<c:forEach items="${deptList}" var="item">
<option ${requestScope.user.deptId == item.id ?'selected':''} value="${item.id}">${item.deptName}</option>
</c:forEach> </select></div>
req.setAttribute(“deptList”,all); 是添加进这里的 forEach items="${deptList}"
这样数据就能加载进来了
接下来要对密码进行加密
再UserServiceImpl的save方法中对用户密码进行加密
具体做法
1.编写密码加密工具类
public class MD5Util {
/*
* 密码加密工具类
* @param password
* @return
* @throws Exception
* */
public static String md5(String password){
try{
//创建加密对象
MessageDigest md5 = MessageDigest.getInstance("md5");
//加密密码
byte[] by = md5.digest(password.getBytes());
//创建编码对象
BASE64Encoder encoder = new BASE64Encoder();
//对结果编码
return encoder.encode(by);
}catch(Exception e){
throw new RuntimeException(e);
} }}
将获取到的用户密码作为参数传入到这个工具类的方法里
//id使用UUID的生成策略来获取
String id = UUID.randomUUID().toString();
user.setId(id);
//用户名密码加密
user.setPassword(MD5Util.md5(user.getPassword()));
//3.调用Dao层操作
userDao.save(user);
再UserServiceImpl的save方法中的加密操作
user.setPassword(MD5Util.md5(user.getPassword()));
就是将用户对象中的password成员变量取出后作为参数传入到MD5Util的方法中,进行加密之后,再重新用user.setPassword添加到user对象中。这样只会改变user对象中的一个成员的值
UserServlet 修改功能,先要明白有些内容是不能进行修改的
如 邮箱名用来做登录用的,密码 等
private void toEdit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//查询要修改的数据findById
String id = req.getParameter("id");
//UserService userService = new UserServiceImpl();
User user = userService.findById(id);
//将数据加载到指定区域,供页面获取
req.setAttribute("user",user);
//查询部门信息
List<Dept> all = deptService.findAll();
//放入指定位置
req.setAttribute("deptList",all);
//跳转页面
req.getRequestDispatcher("/WEB-INF/pages/system/user/update.jsp").forward(req,resp); }
查询部门信息 只会 通过toEdit找到对应页面的代码块,再该作用域中起作用
<!--配置全字段更新,当提供的数据为null时,数据库数据会被更新为null-->
<update id="update" parameterType="com.itheima.domain.system.User">
update ss_user
set user_name = #{userName,jdbcType=VARCHAR},
state = #{state,jdbcType=DECIMAL},
gender = #{gender,jdbcType=CHAR},
telephone = #{telephone,jdbcType=VARCHAR},
dept_id = #{deptId,jdbcType=VARCHAR}
where user_id = #{id,jdbcType=VARCHAR}
</update>
在配置相关的SQL语句时只需要将需要修改的字段写出来,不用修改的字段就不用写了。先将修改的全部字段配置上,在后面,发现了可以不用修改的字段再去SQL语句里将不用修改的字段删掉
/* 下面这两句话 先通过查询全部到的所有部门信息,
* 将所有部门的数据发送到 编辑页面 有页面的 items="${deptList}"获取所有数据
* <option ${user.deptId == item.id ?'selected':''} value="${item.id}">${item.deptName}</option>
* 在 页面 option标签 ${item.deptName} 将部门数据中的name */
//查询部门信息
List<Dept> all = deptService.findAll();
//放入指定位置
req.setAttribute("deptList",all);
<div class="col-md-2 title">所在部门</div>
<div class="col-md-4 data">
<select class="form-control" onchange="document.getElementById('deptName').value=this.options[this.selectedIndex].text" name="deptId">
<option value="">请选择</option>
<c:forEach items="${deptList}" var="item">
<option ${user.deptId == item.id ?'selected':''} value="${item.id}">${item.deptName}</option>
</c:forEach>
</select>
</div>
<!--这里只写需要修改的字段,修改功能要根据业务需要修改对应的字段-->
<update id="update" parameterType="com.itheima.domain.system.User">
update ss_user
set user_name = #{userName,jdbcType=VARCHAR},
state = #{state,jdbcType=DECIMAL},
gender = #{gender,jdbcType=CHAR},
telephone = #{telephone,jdbcType=VARCHAR},
dept_id = #{deptId,jdbcType=VARCHAR}
where user_id = #{id,jdbcType=VARCHAR}
</update>
用户模块快速开发
•注意:
一对多关系中的多在进行开发时,通常在添加与修改页均要加载一方的数据列表,
是多的一方 就找对应数据表中 一的一方相关字段
遇到与用户账号相关模块开发时,加密是必不可少的操作,
业务数据在制作修改功能时要关注对应字段是否参与修改操作
,对于不参与修改操作的字段可以在页面上不收集相关字段,避免误导性提示
对 页面代码 补充说明
<div class="col-md-2 title">所在部门</div>
<div class="col-md-4 data">
<select class="form-control" onchange="document.getElementById('deptName').value=this.options[this.selectedIndex].text" name="deptId">
<option value="">请选择</option>
<c:forEach items="${deptList}" var="item">
<%--这里var="item" 是接受经本次遍历后得到的数据,并将得到的数据发送回共享域中--%>
<%--这里var="item" 是接受经本次遍历后得到的数据 可以将它看作封装数据的对象--%>
<%--因此 通过对象获取对象成员变量的方法就能找到对应的数据--%>
<option ${user.deptId == item.id ?'selected':''} value="${item.id}">${item.deptName}</option>
</c:forEach>
</select>
</div>