Java项目:UMS 用户管理系统(三)

简介: Java项目:UMS 用户管理系统(三)

6、UMS-编辑用户【难点】【阶段重点】


6.1、需求说明


遇到这样的复杂需求,我们需要拆分成两步来做:


1、用户数据查询回显:跳转到编辑页面,在编辑页面回显该用户的数据


2、用户数据修改:编辑页面修改完毕后,点击“确定”,真正修改数据到xml中


6.2、用户数据查询回显


6.2.1、需求分析


分析:


关键点:


1、地址栏传递id


2、request作用域及请求转发


3、对User数据在JSP进行回显


如果数据在request作用域:


文本框:value="${参数名.属性名}"


文本域:<textarea>${参数名.属性名}</textarea>


单选框/复选框:


JavaBean javaBean = (JavaBean)request.getAttribute("参数名");


if(javaBean!=null && javaBean.getXxx()!=null){


if(javaBean.getXxx().equals("值")){


out.write("checked='checked'");


}


}


选择框:


JavaBean javaBean = (JavaBean)request.getAttribute("参数名");


if(javaBean!=null && javaBean.getXxx()!=null){


if(javaBean.getXxx().equals("值")){


out.write("selected='selected'");


}


}


流程:


6.2.2、代码实现

/user/list.jsp

<td align="center" style="HEIGHT: 22px">
   <a href="<%=pageContext.getServletContext().getContextPath()%>/user?method=editView&id=<%=user.getId()%>">
      <img src="<%=request.getContextPath() %>/images/i_edit.gif" border="0" style="CURSOR: hand">
   </a>
</td>


//

UserServlet

/**
 * 跳转到编辑页面
 * @return
 */
public String editView(){
    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/edit.jsp";
}

/user/edit.jsp

<%
   User u = (User) request.getAttribute("user");
%>
    <form method="post" action="">
          <input type="hidden" name="id" value="" />
      <table cellSpacing="1" cellPadding="5" width="100%" align="center" bgColor="#eeeeee" style="border: 1px solid #8ba7e3" border="0">
         <tr>
            <td class="ta_01" align="center" bgColor="#afd1f3" colSpan="4"
               height="26">
               <strong><STRONG>编辑用户</STRONG>
               </strong>
            </td>
         </tr>
         <tr>
            <td align="center" bgColor="#f5fafe" class="ta_01">
                登录名:
            </td>
            <td class="ta_01" bgColor="#ffffff">
               <input type="text" name="loginName" id="loginName" class="bg" value="${user.loginName}"/>
            </td>
            <td align="center" bgColor="#f5fafe" class="ta_01">
               用户类型:
            </td>
            <%
               String utype = null;
               if(u!=null){
                  utype = u.getUtype();
               }
            %>
            <td class="ta_01" bgColor="#ffffff">
               <input type="radio" name="utype" value="管理员"
                     <%
                        if(utype!=null && utype.equals("管理员")){
                           out.write("checked='checked'");
                        }
                     %>
               />管理员
               <input type="radio" name="utype" value="普通用户"
                     <%
                        if(utype!=null && utype.equals("普通用户")){
                           out.write("checked='checked'");
                        }
                     %>
               />普通用户
            </td>
         </tr>
         <tr>
            <td align="center" bgColor="#f5fafe" class="ta_01">
                密码:
            </td>
            <td class="ta_01" bgColor="#ffffff">
               <input type="password" name="loginPwd" id="loginPwd"  value="${user.loginPwd}"/>
            </td>
            <td align="center" bgColor="#f5fafe" class="ta_01">
               用户姓名:
            </td>
            <td class="ta_01" bgColor="#ffffff">
               <input type="text" name="userName" class="bg" value="${user.userName}" />
            </td>
         </tr>
         <tr>
            <td align="center" bgColor="#f5fafe" class="ta_01">
               性别:
            </td>
            <td class="ta_01" bgColor="#ffffff">
               <%
                  String sex = null;
                  if(u!=null){
                     sex = u.getSex();
                  }
               %>
               <input type="radio" value="男" name="sex" id="sex0"
                  <%
                     if(sex!=null && sex.equals("男")){
                        out.write("checked='checked'");
                     }
                  %>
               />男
               <input type="radio" value="女" name="sex" id="sex1"
                  <%
                     if(sex!=null && sex.equals("女")){
                        out.write("checked='checked'");
                     }
                  %>
               />女
            </td>
            <td align="center" bgColor="#f5fafe" class="ta_01">
               学历:
            </td>
            <td class="ta_01" bgColor="#ffffff">
               <%
                  String education = null;
                  if(u!=null){
                     education = u.getEducation();
                  }
               %>
               <select name="education" id="education">
                  <option value="">--选择学历--</option>
                  <option value="博士"
                        <%
                           if(education!=null && education.equals("博士")){
                              out.write("selected='selected'");
                           }
                        %>
                  >博士</option>
                  <option value="硕士"
                        <%
                           if(education!=null && education.equals("硕士")){
                              out.write("selected='selected'");
                           }
                        %>
                  >硕士</option>
                  <option value="本科"
                        <%
                           if(education!=null && education.equals("本科")){
                              out.write("selected='selected'");
                           }
                        %>
                  >本科</option>
                  <option value="专科"
                        <%
                           if(education!=null && education.equals("专科")){
                              out.write("selected='selected'");
                           }
                        %>
                  >专科</option>
                  <option value="高中"
                        <%
                           if(education!=null && education.equals("高中")){
                              out.write("selected='selected'");
                           }
                        %>
                  >高中</option>
               </select>
            </td>
         </tr>
         <tr>
            <td align="center" bgColor="#f5fafe" class="ta_01">
               出生日期:
            </td>
            <td class="ta_01" bgColor="#ffffff">
               <input type="text" name="birthday" id="birthday" size="20" readonly="true"  value="${user.birthday}" onclick="c.show(this)"  />
            </td>
            <td align="center" bgColor="#f5fafe" class="ta_01">
               电话:
            </td>
            <td class="ta_01" bgColor="#ffffff">
               <input type="text" name="telephone" id="telephone"  value="${user.telephone}"/>
            </td>
         </tr>
         <tr>
            <td align="center" bgColor="#f5fafe" class="ta_01">
               兴趣爱好:
            </td>
            <%
               String[] interest = null;
               if(u!=null){
                  interest = u.getInterest();
               }
            %>
            <td class="ta_01" bgColor="#ffffff" colSpan="3">
               <input type="checkbox" name="interest"  value="看电影"
                  <%
                     if(interest!=null){
                        for (String s : interest) {
                           if(s.equals("看电影")){
                              out.write("checked='checked'");
                              break;
                           }
                        }
                     }
                  %>
               /> 看电影
               <input type="checkbox" name="interest"  value="旅游"
                     <%
                        if(interest!=null){
                           for (String s : interest) {
                              if(s.equals("旅游")){
                                 out.write("checked='checked'");
                                 break;
                              }
                           }
                        }
                     %>
               />旅游
               <input type="checkbox" name="interest"  value="健身"
                     <%
                        if(interest!=null){
                           for (String s : interest) {
                              if(s.equals("健身")){
                                 out.write("checked='checked'");
                                 break;
                              }
                           }
                        }
                     %>
               />健身
               <input type="checkbox" name="interest"  value="购物"
                     <%
                        if(interest!=null){
                           for (String s : interest) {
                              if(s.equals("购物")){
                                 out.write("checked='checked'");
                                 break;
                              }
                           }
                        }
                     %>
               />购物
               <input type="checkbox" name="interest"  value="睡觉"
                     <%
                        if(interest!=null){
                           for (String s : interest) {
                              if(s.equals("睡觉")){
                                 out.write("checked='checked'");
                                 break;
                              }
                           }
                        }
                     %>
               />睡觉
            </td>
         </tr>
         <TR>
            <TD class="ta_01" align="center" bgColor="#f5fafe">
               备注:
            </TD>
            <TD class="ta_01" bgColor="#ffffff" colSpan="3">
               <textarea cols="30" rows="3" name="remark" style="WIDTH: 96%">${user.remark}</textarea>
            </TD>
         </TR>

6.3、用户数据修改


6.3.1、需求分析


分析:


关键点:


1、ID不需要被修改,需要被从JSP传递给servlet,因为若未传递ID,ID为null


2、修改逻辑:


①查询所有信息


②迭代删除被修改的信息,添加新信息  (新集合)


③新集合以覆盖方式保存新信息


3、路径更改问题


添加、修改、删除



流程:


6.3.2、代码实现

/user/edit.jsp

<form method="post" action="<%=pageContext.getServletContext().getContextPath()%>/user">
<input type="hidden" name="method" value="modifyUser" />
      <input type="hidden" name="id" value="${user.id}" />

UserServlet

/**
 * 修改用户信息
 * @return
 */
public String modifyUser(){
    //1、获取所有表单数据
    User param = toBean(User.class);
    //2、调用service进行保存
    boolean result = userService.modifyUser(param);
    //3、根据service保存结果,进行展示
    if(result){
        //修改成功
        return "redirect:/user?method=list";
    }else{
        //修改失败
        getRequest().setAttribute("errorMsg","修改失败");
        return "forward:/user/error.jsp";
    }
}


UserService


/**
 * 修改用户信息
 * @param param
 * @return
 */
public boolean modifyUser(User param) {
    try {
        //1、查询所有用户信息
        List<User> ulist = userDao.searchAll();
        //2、迭代删除被修改的用户
        if(ulist!=null){
            Iterator<User> it = ulist.iterator();
            while (it.hasNext()){
                User next = it.next();
                if(next.getId().equals(param.getId())){
                    it.remove();
                    break;
                }
            }
        }
        //3、向集合追加被修改用户的新信息
        ulist.add(param);
        //4、以覆盖方式写回xml
        userDao.saveUlist(ulist);
    } catch (Exception e) {
        return false;
    }
    return true;
}

6.4、令牌机制-数据更新操作中BUG说明及解决


问题描述:反复刷新页面就会导致  添加功能被重复执行,添加重复数据

问题解决方案:

解决方案1:直接解决规避法

/**
 * 添加用户
 * @return
 */
public String addUser(){
    //1、接收表单数据
    User param = toBean(User.class);
    //2、调用service进行保存
    boolean result = userService.addUser(param);
    //3、根据service处理结果,做不同的跳转
    if(result){
        //添加成功
        return "redirect:/user?method=list";
    }else{
        //添加失败
        getRequest().setAttribute("errorMsg","添加失败");
        return "forward:/user/error.jsp";
    }
}

对于恶意刷新 Servlet的用户,无法进行避免。


解决方案2:逻辑解决法-令牌机制(以添加操作为例)


令牌:随机的字符串,唯一的不重复。


令牌机制作用:通过发令牌,比对令牌,保障你的操作是唯一不重复的。


本质防止两个基础操作:


重复刷新

恶意访问

/user/list.jsp


<a class="button_add" style="padding: 2px 4px 2px 10px; border: 1px solid #8AA2CC;" href="<%=request.getContextPath() %>/user?method=toAddView" id="add">添加</a>

UserServlet


/**
 * 跳转到添加页面(起点:发令牌)
 * @return
 */
public String toAddView(){
    //1、随机生成令牌
    String tokenId = UUID.randomUUID().toString().replaceAll("-","");
    //2、将令牌备份到session中
    getRequest().getSession().setAttribute("addUserTokenId",tokenId);
    //3、跳转到添加页面
    return "redirect:/user/add.jsp";
}

/user/add.jsp


<form name="Form1" method="post"  action="<%=pageContext.getServletContext().getContextPath()%>/user" >
   <input type="hidden" name="addUserTokenId" value="${addUserTokenId}"/>

UserServlet


/**
 * 添加用户
 * @return
 */
public String addUser(){
    //一、(关卡)令牌机制校验
    //1、分别获取表单传递而来的令牌(人物自带令牌) 和 session中的令牌 (关卡备份令牌)
    String addUserTokenId = getRequest().getParameter("addUserTokenId");
    String addUserTokenIdFromSession = (String) getRequest().getSession().getAttribute("addUserTokenId");
    //2、进行令牌校验
    //如果addUserTokenIdFromSession为null或者addUserTokenId为null,说明是非法操作,展示错误信息
    //如果两个令牌不一致,说明校验失败,也存在非法操作,展示错误信息
    //令牌校验失败,跳转错误页面
    if(addUserTokenId==null ||
            addUserTokenIdFromSession==null ||
            !addUserTokenId.equals(addUserTokenIdFromSession)){
        getRequest().setAttribute("errorMsg","非法添加操作,请按正常流程进行");
        return "forward:/user/error.jsp";
    }
    //3、令牌校验成功,为了防止重复校验,将session中的令牌销毁
    getRequest().getSession().removeAttribute("addUserTokenId");
    //二、令牌校验完成的,才能进行添加用户操作
    //1、接收表单数据
    User param = toBean(User.class);
    //2、调用service进行保存
    boolean result = userService.addUser(param);
    //3、根据service处理结果,做不同的跳转
    if(result){
        //添加成功
        return "forward:/user?method=list";
    }else{
        //添加失败
        getRequest().setAttribute("errorMsg","添加失败");
        return "forward:/user/error.jsp";
    }
}

令牌机制:

起点:发令牌

人物:带令牌

关卡:校验令牌,校验成功销毁关卡令牌

7、UMS-用户登录【阶段2】


7.1、需求说明


7.2、需求分析


分析:


关键点:


1、JavaBean javaBean = toBean(JavaBean.class);


2、登录校验:


service:


若用户名正确,并且密码也正确,登录成功;否则登录失败


用户名正确:遍历用户的用户名 和 表单输入的用户名相同


3、session域对象,请求重定向


登录成功,页面跳转,路径也被改变,说明使用的是请求重定向。


重定向不能使用request作用域传递数据,使用更大的session传递数据


流程:


7.3、代码实现



//

/login/login.jsp
<form action="<%=pageContext.getServletContext().getContextPath()%>/login" method="post" target="_parent">
   <input type="hidden" name="method" value="login"/>
<tr>
   <td height="30" nowrap>
      <font color="000F60"><strong>用户名:</strong> </font>
   </td>
   <td>
      <input type="text" name="loginName" class="test" style="width: 160px;"/>
   </td>
</tr>
<tr>
   <td height="30" nowrap>
      <strong><font color="000F60">密码: </font> </strong>
   </td>
   <td>
      <input type="password" name="loginPwd" class="text" style="width: 160px;"/>
   </td>
</tr>
/**
 * 用户登录
 * @return
 */
public String login(){
    //1、接收表单参数
    User param = toBean(User.class);
    //2、调用service进行登录处理
    User result = null;
    try {
        result = userService.login(param);
    } catch (Exception e) {
        //抛出异常,登录也是失败
        getRequest().setAttribute("errorMsg",e.getMessage());
        return "forward:/login/login.jsp";
    }
    //3、根据返回结果,跳转不同的页面
    if(result!=null){
        //登录成功
        getRequest().getSession().setAttribute("loginUser",result);
        return "redirect:/index.jsp";
    }else{
        //登录失败
        getRequest().setAttribute("errorMsg","用户名或密码错误");
        return "forward:/login/login.jsp";
    }
}


UserService


/**
 * 用户登录。    用户登录成功,返回User对象。 登录失败,返回Null
 * @param param
 * @return
 */
public User login(User param) {
    //1、获取所有用户信息
    List<User> ulist = userDao.searchAll();
    //2、遍历所有用户信息
    if(ulist!=null){
        for (User u : ulist) {
            //3、每遍历一个用户信息,对比表单用户名是否正确,对比表单密码是否正确. 都正确,登录成功
            if(u.getLoginName().equals(param.getLoginName())
                && u.getLoginPwd().equals(param.getLoginPwd())){
                return u;
            }
        }
    }
    //4、经过遍历,没有一个成功,登录失败
    return null;
}
/login/top.jsp
用户名: <font color="blue">${loginUser.userName}</font></td>
/login/login.jsp
<strong style="font-size: 14px;color:red;">${errorMsg}</strong>
相关文章
|
4月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
3月前
|
移动开发 监控 小程序
java家政平台源码,家政上门清洁系统源码,数据多端互通,可直接搭建使用
一款基于Java+SpringBoot+Vue+UniApp开发的家政上门系统,支持小程序、APP、H5、公众号多端互通。涵盖用户端、技工端与管理后台,支持多城市、服务分类、在线预约、微信支付、抢单派单、技能认证、钱包提现等功能,源码开源,可直接部署使用。
283 24
|
3月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
349 8
|
3月前
|
安全 前端开发 Java
使用Java编写UDP协议的简易群聊系统
通过这个基础框架,你可以进一步增加更多的功能,例如用户认证、消息格式化、更复杂的客户端界面等,来丰富你的群聊系统。
193 11
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
Java与生成式AI:构建内容生成与创意辅助系统
生成式AI正在重塑内容创作、软件开发和创意设计的方式。本文深入探讨如何在Java生态中构建支持文本、图像、代码等多种生成任务的创意辅助系统。我们将完整展示集成大型生成模型(如GPT、Stable Diffusion)、处理生成任务队列、优化生成结果以及构建企业级生成式AI应用的全流程,为Java开发者提供构建下一代创意辅助系统的完整技术方案。
249 10
|
3月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
539 4
|
4月前
|
IDE 安全 Java
Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
215 1
|
3月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
397 0
|
4月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
Java 应用服务中间件 Windows
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
178 0