JavaWeb网上图书商城完整项目--day02-17.登录功能页面实现

1、当在登陆页面点击登陆按钮的时候,会调用UserServlet的login方法,我们要在login.jsp中进行配置

2、要在login.jsp中处理Servlet在后台业务操作之后forward到login.jsp中显示的错误信息,例如用户名密码错误、该用户未激活等,这个时候就要修改login.jsp页面

我们来看看login.jsp的代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>登录</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <link rel="stylesheet" type="text/css" href="<c:url value='/jsps/css/user/login.css'/>">
    <script type="text/javascript" src="<c:url value='/jquery/jquery-1.5.1.js'/>"></script>
    <script src="<c:url value='/js/common.js'/>"></script>
    <!-- 引入login.js文件 -->
    <script type="text/javascript" src="<c:url value='/jsps/js/user/login.js'/>"></script>

  </head>
  
  <body>
    <div class="main">
      <div><img src="<c:url value='/images/logo.gif'/>" /></div>
      <div>
        <div class="imageDiv"><img class="img" src="<c:url value='/images/zj.png'/>"/></div>
        <div class="login1">
          <div class="login2">
            <div class="loginTopDiv">
              <span class="loginTop">传智会员登录</span>
              <span>
                <a href="<c:url value='/jsps/user/regist.jsp'/>" class="registBtn"></a>
              </span>
            </div>
            <div>
              <form target="_top" action="<c:url value='/UserServlet'/>" method="post" id="loginForm">
                <input type="hidden" name="method" value="login" />
                  <table>
                    <tr>
                      <td width="50"></td>
                      <td><label class="error" id="msg">${msg}</label></td>
                    </tr>
                    <tr>
                      <td width="50">用户名</td>
                      <td><input class="input" type="text" name="loginname" id="loginname" value="${user.loginname}"/></td>
                    </tr>
                    <tr>
                      <td height="20">&nbsp;</td>
                      <td><label id="loginnameError" class="error">${errors.loginname}</label></td>
                    </tr>
                    <tr>
                      <td>密 码</td>
                      <td><input class="input" type="password" name="loginpass" id="loginpass" value="${user.loginpass}"/></td>
                    </tr>
                    <tr>
                      <td height="20">&nbsp;</td>
                      <td><label id="loginpassError" class="error">${errors.loginpass }</label></td>
                    </tr>
                    <tr>
                      <td>验证码</td>
                      <td>
                        <input class="input yzm" type="text" name="verifyCode" id="verifyCode" value=""/>
                        <img id="vCode" src="<c:url value='/VerifyCodeServlet'/>"/>
                        <a id="verifyCode">换张图</a>
                      </td>
                    </tr>
                    <tr>
                      <td height="20px">&nbsp;</td>
                      <td><label id="verifyCodeError" class="error">${errors.verifyCode }</label></td>
                    </tr>
                    <tr>
                      <td>&nbsp;</td>
                      <td align="left">
                        <input type="image" id="submit" src="<c:url value='/images/login1.jpg'/>" class="loginBtn"/>
                      </td>
                    </tr>                                                                                
                 </table>
              </form>
            </div>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

2、当用户登陆之后会重定向到index.jsp,浏览器会重新访问index.jsp主页面

我们来看看index.jsp文件

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<jsp:forward page="/jsps/main.jsp"/>

index.jsp会反复问main.jsp目录

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>main</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <link rel="stylesheet" type="text/css" href="<c:url value='/jsps/css/main.css'/>">
  </head>
  
  <body>
<table class="table" align="center">
    <tr class="trTop">
        <td colspan="2" class="tdTop">
            <iframe frameborder="0" src="<c:url value='/jsps/top.jsp'/>" name="top"></iframe>
        </td>
    </tr>
    <tr>
        <td class="tdLeft" rowspan="2">
            <iframe frameborder="0" src="<c:url value='/jsps/left.jsp'/>" name="left"></iframe>
        </td>
        <td class="tdSearch" style="border-bottom-width: 0px;">
            <iframe frameborder="0" src="<c:url value='/jsps/search.jsp'/>" name="search"></iframe>
        </td>
    </tr>
    <tr>
        <td style="border-top-width: 0px;">
            <iframe frameborder="0" src="<c:url value='/jsps/body.jsp'/>" name="body"></iframe>
        </td>
    </tr>
</table>
  </body>
</html>

main.jsp又会加载body top的jsp,最终显示的效果如下:

对于top.jsp顶部的显示,我们应该依据当前用户是否登陆显示不同的内容

我们来看看代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>top</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
<style type="text/css">
    body {
        background: #15B69A;
        margin: 0px;
        color: #ffffff;
    }
    a {
        text-transform:none;
        text-decoration:none;
        color: #ffffff;
        font-weight: 900;
    } 
    a:hover {
        text-decoration:underline;
    }
</style>
  </head>
  
  <body>
<h1 style="text-align: center;">传智播客网上书城系统</h1>
<div style="font-size: 10pt; line-height: 10px;">
<%--依据用户是否登陆显示不同的连接 --%>
<c:choose>
  <c:when test="${empty  sessionScope.sessionUser}">
        <a href="<c:url value='/jsps/user/login.jsp'/>" target="_parent">传智会员登录</a> |&nbsp; 
      <a href="<c:url value='/jsps/user/regist.jsp'/>" target="_parent">注册传智会员</a>
  </c:when>
  
  <c:otherwise>
   传智会员:张三&nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="<c:url value='/jsps/cart/list.jsp'/>" target="body">我的购物车</a>&nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="<c:url value='/jsps/order/list.jsp'/>" target="body">我的传智订单</a>&nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="<c:url value='/jsps/user/pwd.jsp'/>" target="body">修改密码</a>&nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="<c:url value='/jsps/user/login.jsp'/>" target="_parent">退出</a>    
  </c:otherwise>
  
</c:choose>
 
    



</div>
  </body>
</html>

我们来看看程序的运行效果:

接下来要实现这个效果,当在浏览器中进入登陆页面的时候,要将浏览器中保存的cookie用户名显示出来:

同时需要注意的是:

 

 

上面的fdsa就是回显的用户名,用户使用fdsa登陆之后,Servlet后台判断该用户登陆密码不对,forward到login.jsp,这个时候要把刚刚输入的用户名和密码显示出来,这里显示fdsa就是刚刚输入的用户名和密码。

所谓的cookie用户指的是,一个用户登陆成功之后,这个时候后台Servlet会把当前登陆成功的用户名返回给浏览器

 request.getSession().setAttribute("sessionUser", user);
              //将用户名保存到cookie中,因为cookie不支持中文使用URL进行编码
               Cookie cookie = new Cookie("cookieLoginName", URLEncoder.encode(user.getLoginname(), "utf-8"));
               cookie.setMaxAge(60*60*24);//cookie的有效期是一天
               //添加cookie对象,把cookier对象返回给浏览器
               response.addCookie(cookie);

这个时候浏览器就会把cookie对象的值保存到浏览器中,我们可以设置浏览器保存cookie的时间长度,例如一周。

当一周之后我们重新打开浏览器的时候,这个时候进入页面应该从浏览器中获得cookie保存的用户名,在用户名中显示出来。

但是存在下面的问题:

所以进入login.jsp页面是显示上次登陆成功之后浏览器保存的cookie的用户名,还是显示Servlet回传的登陆错误的用户名和密码了,我们应该优先级显示上次错误的用户名和密码优先级更高

 

这里我们需要对代码进行处理

 <td><input class="input" type="text" name="loginname" id="loginname" value="${user.loginname}"/></td>

${user.loginname}这里就是用户回传的用户名和密码

在Servlet中设置的值

  Map errors = validateLoginParams(formUser, request);
          if(errors.size() > 0){//说明参数错误,跳转到注册界面提示用户输入的参数有误
              request.setAttribute("errors", errors);    
              request.setAttribute("user", formUser);
              return "f:/jsps/user/login.jsp";
          }

所以进入login.jsp页面是显示上次登陆成功之后浏览器保存的cookie的用户名,还是显示Servlet回传的登陆错误的用户名和密码了,优先级显示上次错误的用户名和密码优先级更高,我们要修改login.jsp的代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>登录</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <link rel="stylesheet" type="text/css" href="<c:url value='/jsps/css/user/login.css'/>">
    <script type="text/javascript" src="<c:url value='/jquery/jquery-1.5.1.js'/>"></script>
    <script src="<c:url value='/js/common.js'/>"></script>
    <!-- 引入login.js文件 -->
    <script type="text/javascript" src="<c:url value='/jsps/js/user/login.js'/>"></script>
    <%--这里判断是显示曾经登陆成功的cookie的用户名,还是显示登陆回显的用户名和密码 --%>
    <script type="text/javascript">
      $(function(){
      //获得cookie中的用户名
       var loginname = window.decodeURI("${cookie.cookieLoginName.value}");
       if("${requestScope.user.loginname}"){
        //说明存在刚刚输入的错误的用户名和密码,优先使用这个值,不使用cookie的值
        loginname = "${requestScope.user.loginname}";              
       }
       $("#loginname").val(loginname);//进行赋值
      
      });
    </script>

  </head>
  
  <body>
    <div class="main">
      <div><img src="<c:url value='/images/logo.gif'/>" /></div>
      <div>
        <div class="imageDiv"><img class="img" src="<c:url value='/images/zj.png'/>"/></div>
        <div class="login1">
          <div class="login2">
            <div class="loginTopDiv">
              <span class="loginTop">传智会员登录</span>
              <span>
                <a href="<c:url value='/jsps/user/regist.jsp'/>" class="registBtn"></a>
              </span>
            </div>
            <div>
              <form target="_top" action="<c:url value='/UserServlet'/>" method="post" id="loginForm">
                <input type="hidden" name="method" value="login" />
                  <table>
                    <tr>
                      <td width="50"></td>
                      <td><label class="error" id="msg">${msg}</label></td>
                    </tr>
                    <tr>
                      <td width="50">用户名</td>
                      <td><input class="input" type="text" name="loginname" id="loginname" value=""/></td>
                    </tr>
                    <tr>
                      <td height="20">&nbsp;</td>
                      <td><label id="loginnameError" class="error">${errors.loginname}</label></td>
                    </tr>
                    <tr>
                      <td>密 码</td>
                      <td><input class="input" type="password" name="loginpass" id="loginpass" value="${user.loginpass}"/></td>
                    </tr>
                    <tr>
                      <td height="20">&nbsp;</td>
                      <td><label id="loginpassError" class="error">${errors.loginpass }</label></td>
                    </tr>
                    <tr>
                      <td>验证码</td>
                      <td>
                        <input class="input yzm" type="text" name="verifyCode" id="verifyCode" value=""/>
                        <img id="vCode" src="<c:url value='/VerifyCodeServlet'/>"/>
                        <a id="verifyCode">换张图</a>
                      </td>
                    </tr>
                    <tr>
                      <td height="20px">&nbsp;</td>
                      <td><label id="verifyCodeError" class="error">${errors.verifyCode }</label></td>
                    </tr>
                    <tr>
                      <td>&nbsp;</td>
                      <td align="left">
                        <input type="image" id="submit" src="<c:url value='/images/login1.jpg'/>" class="loginBtn"/>
                      </td>
                    </tr>                                                                                
                 </table>
              </form>
            </div>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

 

我们来对上面的代码进行详细分析下:

第一:为啥不把业务功能封装到login.js中实现了,而这里在login.jsp中实现了

//获得cookie中的用户名
       var loginname = window.decodeURI("${cookie.cookieLoginName.value}");
       if("${requestScope.user.loginname}"){
        //说明存在刚刚输入的错误的用户名和密码,优先使用这个值,不使用cookie的值
        loginname = "${requestScope.user.loginname}";              
       }
       $("#loginname").val(loginname);//使用jquery进行赋值

因为在单独的js文件中无法使用el标签,单独js文件不能用el表达式,就只在在jsp中实现业务功能

${cookie.cookieLoginName.value}使用的el标签获得cookier的值

${cookie.name}将获得对应cookie的对象,比如我们用jsp将一段cookie发送给客户端。

Cookie cookie = new Cookie("username", "Username in cookie");
response.addCookie(cookie);

 

创建一个名称为username,值为"Username in cookie"的Cookie对象,然后发送给客户端。

然后我们就可以使用${cookie.username}获得这个cookie了,${cookie.username.name}获得cookie名称,${cookie.username.value}获得cookie值。

${requestScope.user.loginname}是获得session中保存的用户名

$("#loginname").val(loginname);//使用jquery进行对id是
loginname的input对象赋值,只有input对象才具有val属性

 window.decodeURI表示的是decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码,因为在Servlet中的cookie为了解决中文乱码使用了URLencode编码



通过上面的操作就达到了整个登陆的流程,所以整个登陆的操作流程就已经解决了。
用户登陆成功之后,需要在主页面显示当前登陆的用户名
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>top</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
<style type="text/css">
    body {
        background: #15B69A;
        margin: 0px;
        color: #ffffff;
    }
    a {
        text-transform:none;
        text-decoration:none;
        color: #ffffff;
        font-weight: 900;
    } 
    a:hover {
        text-decoration:underline;
    }
</style>
  </head>
  
  <body>
<h1 style="text-align: center;">传智播客网上书城系统</h1>
<div style="font-size: 10pt; line-height: 10px;">
<%--依据用户是否登陆显示不同的连接 --%>
<c:choose>
  <c:when test="${empty  sessionScope.sessionUser}">
        <a href="<c:url value='/jsps/user/login.jsp'/>" target="_parent">传智会员登录</a> |&nbsp; 
      <a href="<c:url value='/jsps/user/regist.jsp'/>" target="_parent">注册传智会员</a>
  </c:when>
  
  <c:otherwise>
   传智会员:${sessionScope.sessionUser.loginname}&nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="<c:url value='/jsps/cart/list.jsp'/>" target="body">我的购物车</a>&nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="<c:url value='/jsps/order/list.jsp'/>" target="body">我的传智订单</a>&nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="<c:url value='/jsps/user/pwd.jsp'/>" target="body">修改密码</a>&nbsp;&nbsp;|&nbsp;&nbsp;
  <a href="<c:url value='/jsps/user/login.jsp'/>" target="_parent">退出</a>    
  </c:otherwise>
  
</c:choose>
 
    



</div>
  </body>
</html>

 

转载于:https://www.cnblogs.com/kebibuluan/p/6856417.html

这个网上书城系统使用Eclipse开发的,代码完整,jar包齐全,sql脚本包含在里面,将下载下来的项目导入到Eclipse中即可运行,本项目做了很多校验,对可能出现的bug做了考虑,属于比较完善的系统。本系统包含九个模块,前台模块分为:用户模快,分类模块,图书模块,购物车模块,订单模块;后台模块分为:管理员模块,分类管理模快,图书管理模快,订单管理模块。书城界面简洁,易于操作,简单易懂,代码均有注释,各模块功能完善。各大模块的功能描述:前台: 1). 用户模块功能有: * 用户注册: > 表单页面是jQuery做校验(包含了ajax异步请求) # 在输入框失去焦点时进行校验; # 在提交时对所有输入框进行校验; # 在输入框得到焦点时,隐藏错误信息。 > 表单页面使用一次性图形验证码; > 在servlet中再次做了表单校验。 * 用户登录: > 表单校验与注册功能相同; > 登录成功时会把当前用户名保存到cookie中,为了在登录页面的输入框中显示! * 用户退出:销毁session 2). 分类模块 * 查询所有分类: > 有1级和2级分类 > 在页面中使用手风琴式菜单(Javascript组件)显示分类。 3). 图书模块: * 按分类查询 * 按作者查询 * 按出版社查询 * 按书名模糊查询 * 多条件组合查询 * 按id查询 除按id查询外,其他都是分页查询。 技术难点: > 组合查询:根据多个条件拼凑sql语句。 > 带条件分页查询:条件可能会丢失。使用自定义的PageBean来传递分页数据! > 页面上的分页导航:页码列表的显示不好计算! 4). 购物车模块: * 添加条目 * 修改条目数量 * 删除条目 * 批量删除条目 * 我的购物车 * 查询被勾选条目 购物车没有使用sesson或cookie,而是存储到数据库中。 技术难点: > 添加条目时,如果两次添加针对同一本书的条目,不是添加,而是合并; > 修改数量时使用ajax时请求服务器端,服务器端返回json。 > 大量js代码 5). 订单模块: * 生成订单 * 我的订单 * 查看订单详细 * 订单支付 * 订单确认收货 * 取消订单 后台 1). 管理员 * 管理员登录 2). 分类管理 * 添加1级分类 * 添加2级分类: 需要为2级分类指定所属1级分类 * 编辑1级分类 * 编辑2级分类: 可以修改所属1级分类 * 删除1级分类: 存在子分类时,不能删除 * 删除2级分类: 当前2级分类下存在图书时不能删除 * 查看所有分类 3). 图书管理 * 各种查询:与前台相同 * 添加图书: > 上传图片 > 页面中使用动态下拉列表显示2级分类,当指定1级分类后,2级分类下拉列表中动态显示该1级分类下所有2级分类名称 * 修改图书: 与添加图书相似,也使用动态下拉列表 * 删除图书: 需要删除图书对应图片,再删除图书 4). 订单管理 * 各种查询 * 订单发货 * 订单取消
JavaWeb项目搭建一个网上蛋糕商城主要包括以下几个步骤: 1. **需求分析**: - 确定商城的功能模块,如商品展示、购物车、用户注册登录、订单管理等。 - 设计数据库结构,包括商品信息表、用户表、订单表等。 2. **技术栈选择**: - 选用Java作为后端开发语言,因为Java有丰富的Web开发框架,如Spring Boot或Struts。 - 使用MVC(Model-View-Controller)架构模式组织代码,提高可维护性和复用性。 - 数据库通常选择MySQL或PostgreSQL,也可以考虑使用NoSQL数据库如MongoDB。 3. **选择Web框架**: - Spring Boot:提供了快速开发、自动配置和依赖注入等功能,适合构建企业级应用。 - Spring MVC:更传统一些,适合大型项目,具有更好的扩展性。 4. **搭建开发环境**: - 安装Java Development Kit (JDK) 和集成开发环境(IDE),如Eclipse, IntelliJ IDEA或IntelliJ IDEA的Ultimate版。 - 安装对应版本的框架SDK和数据库驱动。 5. **项目初始化**: - 创建项目结构,包括核心业务、数据访问层(DAO)、业务逻辑层(Service)、控制器层(Controller)和视图(HTML、CSS、JavaScript)文件。 - 使用Maven或Gradle进行项目管理和依赖管理。 6. **模型(Model)**: - 创建实体类(Java Bean)表示数据库中的实体,如Cake、Order等,并定义相应的getter和setter方法。 7. **视图(View)**: - 使用模板引擎如Thymeleaf或Freemarker来动态渲染HTML页面,显示商品信息、购物车、订单详情等。 8. **控制器(Controller)**: - 创建Controller,处理HTTP请求,调用Service层的方法并传递模型数据给视图。 9. **数据库设计**: - 使用SQL或其他工具创建数据库表结构,并编写数据访问层的CRUD操作。 10. **安全性考虑**: - 配置HTTPS以保护用户信息安全,添加身份验证和授权机制,防止未授权访问。 11. **测试**: - 编写单元测试和集成测试,确保功能正常,同时保证性能和稳定性。 12. **部署**: - 将项目打包成war文件,部署到Web服务器如Tomcat或Jetty上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值