3、UMS-查询指定用户信息【进阶】【重点】
3.1、需求说明
3.2、需求分析
分析:
关键点:
1、查询条件获取,采取toBean,创建对应的JavaBean类
2、对集合进行条件筛选,进行集合转储/ 对集合进行条件筛选,对不满足集合要求的数据进行删除
内存占用高,效率高 内存占用低,效率低
3、查询条件要进行数据回显
查看域对象中是否存在该数据,若存在该数据,进行回显:
文本框:value
单选/复选框:checked="checked"
选择框:selected="selected"
文本域:内容体
流程:
3.3、代码实现
UserQueryParam:
public class UserQueryParam implements Serializable { private String userName; //用户名(昵称) private String sex; //性别 private String education; //学历 @Override public String toString() { return "UserQueryParam{" + "userName='" + userName + '\'' + ", sex='" + sex + '\'' + ", education='" + education + '\'' + '}'; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getEducation() { return education; } public void setEducation(String education) { this.education = education; } public UserQueryParam(String userName, String sex, String education) { this.userName = userName; this.sex = sex; this.education = education; } public UserQueryParam() { } }
/user/list.jsp
<form name="Form1" method="post" action="<%=pageContext.getServletContext().getContextPath()%>/user" id="Form1"> <input type="hidden" name="method" value="findUsers"/>
UserServlet
/** * 条件查询 * @return */ public String findUsers(){ //1、接收查询条件 UserQueryParam userQueryParam = toBean(UserQueryParam.class); //2、调用service,进行条件查询 List<User> ulist = userService.findUsers(userQueryParam); //3、查询结果存入request作用域 getRequest().setAttribute("ulist",ulist); //4、跳转页面 return "forward:/user/list.jsp"; }
UserService
/** * 条件查询 * @param userQueryParam * @return */ public List<User> findUsers(UserQueryParam userQueryParam) { //1、查询所有用户信息 List<User> temp = userDao.searchAll(); //2、遍历所有用户信息,将符合要求的用户信息进行转储 //2.1、定义一个转储集合 List<User> ulist = new ArrayList<>(); //2.2、对temp进行非空判断,不为空就进行遍历 if(temp!=null){ for (User u : temp) { //2.3、每遍历一个用户,判断是否符合查询条件,不符合条件不保存,符合条件的转储到新集合 //2.3.1、如果条件中,用户名不是null,用户名不是空字符串,判断当前用户是否不满足包含条件,不满足遍历下一个User String userName = userQueryParam.getUserName(); if(userName!=null && !userName.equals("") && !u.getUserName().contains(userName)){ continue; } //2.3.2、如果条件中,性别不是null,性别不是空字符串,判断当前用户性别是否不满足等于条件,不满足遍历下一个User String sex = userQueryParam.getSex(); if(sex!=null && !sex.equals("") && !u.getSex().equals(sex)){ continue; } //2.3.3、如果条件中,学历不是null,学历不是空字符串,判断当前用户学历是否不满足等于条件,不满足遍历下一个User String education = userQueryParam.getEducation(); if(education!=null && !education.equals("") && !u.getEducation().equals(education)){ continue; } //2.3.4、同时满足 用户名包含、性别等于、学历等于 条件 ulist.add(u); } } //3、返回转储结果 return ulist; }
3.4、“并且 并且”业务逻辑优化【重点】
满足逻辑: 符合A 并且符合B 并且符合C 就执行D
if(不符合A){ continue; } if(不符合B){ continue; } if(不符合C){ continue; } 执行D
3.5、请求转发-JSP获参回显技巧【阶段重点】
/user/list.jsp
<% String sex = request.getParameter("sex"); String education = request.getParameter("education"); %> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tr> <td height="22" align="center" bgColor="#f5fafe" class="ta_01"> 用户姓名 </td> <td class="ta_01" bgColor="#ffffff"> <input name="userName" class="bg" size="15" value="${param.userName}"/> </td> <td height="22" align="center" bgColor="#f5fafe" class="ta_01"> 性别: </td> <td class="ta_01" bgColor="#ffffff"> <select name="sex" id="sex"> <option value="">--选择性别--</option> <option value="男" <% if(sex!=null && sex.equals("男")){ %> selected="selected" <% } %> >男</option> <option value="女" <% if(sex!=null && sex.equals("女")){ %> selected="selected" <% } %> >女</option> </select> </td> </tr> <tr> <td height="22" align="center" bgColor="#f5fafe" class="ta_01"> 学历: </td> <td class="ta_01" bgColor="#ffffff"> <select name="education" id="education" > <option value="">--选择学历--</option> <option value="博士" <% if(education!=null && education.equals("博士")){ %> selected="selected" <% } %> >博士</option> <option value="硕士" <% if(education!=null && education.equals("硕士")){ %> selected="selected" <% } %> >硕士</option> <option value="本科" <% if(education!=null && education.equals("本科")){ %> selected="selected" <% } %> >本科</option> <option value="专科" <% if(education!=null && education.equals("专科")){ %> selected="selected" <% } %> >专科</option> <option value="高中" <% if(education!=null && education.equals("高中")){ %> selected="selected" <% } %> >高中</option> </select> </td>
JSP:请求转发进行数据回显
- 若参数在请求体:
文本框:value="${param.参数名}"
文本域:<textarea>${param.参数名}</textarea>
单选框/复选框:
<% String 变量名 = request.getParameter("参数名"); %> <input type="radio/checkbox" <% if(变量名!=null && 变量名.equals("值")){ %> checked="checked" <% } %> > 选择框: <% String 变量名 = request.getParameter("参数名"); %> <option <% if(变量名!=null && 变量名.equals("值")){ %> selected="selected" <% } %> >
- 若参数在域对象(request/session):
文本框:value="${参数名}"
文本域:<textarea>${参数名}</textarea>
单选框/复选框:
<% String 变量名 = (String)request.getAttribute("参数名"); %> <input type="radio/checkbox" <% if(变量名!=null && 变量名.equals("值")){ %> checked="checked" <% } %> > 选择框: <% String 变量名 = (String)request.getAttribute("参数名"); %> <option <% if(变量名!=null && 变量名.equals("值")){ %> selected="selected" <% } %> >
4、UMS-删除指定用户信息
4.1、需求说明
点击删除,弹出对话框,点击确定,真正删除数据,删除完成,回到列表页面展示所有内容。
4.2、需求分析
分析:
关键点:
1、根据ID删除
2、点击事件,监听器代码
3、JS页面跳转:location.href=""
4、request.getParameter()
5、删除逻辑:①查询所有用户信息 ②迭代删除 ③覆盖保存
流程:
4.3、代码实现
/user/list.jsp
<script> function delUserById(uid) { if(confirm("是否删除该数据?")){ location.href="<%=pageContext.getServletContext().getContextPath()%>/user?method=delUserById&id="+uid; } } </script> <td align="center" style="HEIGHT: 22px"> <a href="javascript:delUserById('<%=user.getId()%>')"> <img src="<%=request.getContextPath() %>/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand"> </a> </td>
UserServlet
/** * 根据ID删除用户信息 * @return */ public String delUserById(){ //1、接收参数 String id = getRequest().getParameter("id"); //2、调用service根据ID进行删除 boolean result = userService.delUserById(id); //3、根据service处理结果,进行跳转 if(result){ //删除成功 return "redirect:/user?method=list"; }else{ getRequest().setAttribute("errorMsg","删除失败"); return "forward:/user/error.jsp"; } }
UserService
/** * 根据ID删除用户信息 * @param id * @return */ public boolean delUserById(String id) { try { //1、查询所有用户信息 List<User> ulist = userDao.searchAll(); //2、进行迭代操作 Iterator<User> it = ulist.iterator(); while (it.hasNext()){ User next = it.next(); //3、迭代中,若当前迭代用户的id 等于 待删除用户的id, 删除当前用户 if(next.getId().equals(id)){ it.remove(); break; } } //4、以覆盖方式写回 userDao.saveUlist(ulist); } catch (Exception e) { return false; } //5、没有出异常,删除成功;出现异常,删除失败 return true; }
UserDao
/** * 以覆盖方式写出list集合 * @param ulist */ public void saveUlist(List<User> ulist) { XmlUtils.write(PATH,ulist,false); }
4.4、a标签href属性问题【重点】
<a href="" οnclick="">
起冲突:
先执行onclick,再执行href.
若在onclick监听器中,编写location.href=""跳转A页面,
没有生效,执行的是a标签href属性的路径
解决方案1:(治标不治本)
删除href属性
解决方案2:【建议】
href属性执行javascript代码,让JavaScript具备控制权
<a href="javascript:方法名()">
5、UMS-查询详情
5.1、需求说明
5.2、需求分析
分析:
关键点:
1、向servlet传递id数据
2、根据id查询并返回指定User对象
3、对数据进行数据回显操作---JavaBean---EL
流程:
5.3、代码实现
/user/list.jsp
<td align="center" style="HEIGHT: 22px"> <a href="<%=pageContext.getServletContext().getContextPath()%>/user?method=view&id=<%=user.getId()%>"> <img src="<%=request.getContextPath() %>/images/button_view.gif" border="0" style="CURSOR: hand"> </a> </td>
UserServlet
/** * 根据ID查看用户信息 * @return */ public String view(){ HttpServletRequest request = getRequest(); //1、获取参数id String id = request.getParameter("id"); //2、调用service根据id查询用户信息 User user = userService.searchUserById(id); //3、存入request作用域 request.setAttribute("user",user); //4、请求转发 return "forward:/user/view.jsp"; }
UserService
/** * 根据ID查询用户信息 * @param id * @return */ public User searchUserById(String id) { //1、获取所有的用户信息 List<User> ulist = userDao.searchAll(); if(ulist!=null){ for (User user : ulist) { //2、遍历所有用户信息,根据ID查找用户,找到符合要求的用户,直接进行返回 if(user.getId().equals(id)){ return user; } } } //3、若找不到,返回空user对象。不建议为null,因为null使用时会有空指针异常风险 return new User(); }
/user/view.jsp
<tr> <td width="18%" align="center" bgColor="#f5fafe" class="ta_01"> 登录名: </td> <td class="ta_01" bgColor="#ffffff"> ${user.loginName} </td> <td align="center" bgColor="#f5fafe" class="ta_01"> 用户姓名: </td> <td class="ta_01" bgColor="#ffffff"> ${user.userName} </td> </tr> <tr> <td align="center" bgColor="#f5fafe" class="ta_01"> 性别: </td> <td class="ta_01" bgColor="#ffffff"> ${user.sex} </td> <td align="center" bgColor="#f5fafe" class="ta_01"> 学历: </td> <td class="ta_01" bgColor="#ffffff"> ${user.education} </td> </tr> <tr> <td align="center" bgColor="#f5fafe" class="ta_01"> 出生日期: </td> <td class="ta_01" bgColor="#ffffff"> ${user.birthday} </td> <td align="center" bgColor="#f5fafe" class="ta_01"> 电话: </td> <td class="ta_01" bgColor="#ffffff"> ${user.telephone} </td> </tr> <tr> <td align="center" bgColor="#f5fafe" class="ta_01"> 兴趣爱好: </td> <td class="ta_01" bgColor="#ffffff" colSpan="3"> <%-- //解决方法1: //1、获取request作用域user对象 User user = (User) request.getAttribute("user"); //2、判断:只要user不为空,并且 interest数组也不为空,对数组进行遍历 if(user!=null && user.getInterest()!=null){ //3、每遍历一个爱好,展示一个 String[] interest = user.getInterest(); for (int i = 0; i < interest.length; i++) { out.write(interest[i]); if(i!=interest.length-1) out.write(","); } } --%> <%-- 解决方法2 ${参数名.方法名} 方法名应该忽略get,将get后的第一个字母进行小写 ${user.interestString} ${参数名.方法名()} 方法按原名进行 --%> ${user.getInterestString()} </td> </tr> <TR> <TD class="ta_01" align="center" bgColor="#f5fafe"> 备注: </TD> <TD class="ta_01" bgColor="#ffffff" colSpan="3"> ${user.remark} </TD> </TR> <TR> <TD class="ta_01" align="center" bgColor="#f5fafe"> 用户权限: </TD> <TD class="ta_01" bgColor="#ffffff" colSpan="3"> ${user.utype} </TD> </TR>
原因:
因为servlet默认是单例模式,request成员变量就只是能保存一个请求对象。
一个Servlet将来是要处理非常多的请求,一个请求就是一个request对象。
不可能用同一个request对象处理所有请求。
不建议抽取为request成员变量。
建议:每个方法执行时,现场获取
5.4、数组在JSP回显的技巧【重点】
解决方案1:(新手容易接受)
书写java脚本,通过java脚本进行数组遍历,代码实现
<tr> <td align="center" bgColor="#f5fafe" class="ta_01"> 兴趣爱好: </td> <td class="ta_01" bgColor="#ffffff" colSpan="3"> <% //1、获取request作用域user对象 User user = (User) request.getAttribute("user"); //2、判断:只要user不为空,并且 interest数组也不为空,对数组进行遍历 if(user!=null && user.getInterest()!=null){ //3、每遍历一个爱好,展示一个 String[] interest = user.getInterest(); for (int i = 0; i < interest.length; i++) { out.write(interest[i]); if(i!=interest.length-1) out.write(","); } } %> </td> </tr>
解决方案2:【传统大型开发】
EL表达式,调用getXxx方法,进行操作。
在JavaBean类中,即User类中,添加一个方法:
getInterestString,方法内部对数组拼接字符串,将字符串进行返回。
EL表达式调用该方法,获取字符串,并展示在页面
itcast-tools 1.5.7
如何向xml填充数据的?
依靠的是getXxx方法。
getName() getSex()
在向xml填充数据时,分别调用两个方法,形成 字段:name字段 sex字段
getInterestString()
向xml填充数据时,多个一个interestString字段,该方法的返回值即为字段值
xml在读取数据时:
发现有getInterestString(),没有setInterestString(),工具认为无法为interestString,会报java.lang.NoSuchFieldException: interestString
注意:方法起名时,如果不想在xml存在多余字段,尽可能避免get开头或者set开头方法
User类
public class User implements Serializable { /** * 专门用来在JSP进行EL表达式回显 数组 * @return */ public String interestString(){ StringBuilder builder = new StringBuilder(); if(getInterest()!=null){ //3、每遍历一个爱好,展示一个 String[] interest = getInterest(); for (int i = 0; i < interest.length; i++) { builder.append(interest[i]); if(i!=interest.length-1) builder.append(","); } } return builder.toString(); } //其他内容暂时省略,不粘贴在笔记上
/user/view.jsp
%-- 解决方法2 ${参数名.方法名()} 方法按原名进行 --%> ${user.interestString()}