先说说这个题目吧,好端端的数据库不连,偏偏喜欢要整一个JavaBean和List来模拟数据库,虽然说这样的做法非常的愚蠢,但没办法,毕竟是主人的任务是吧doge。作者其实已经做了一版,但是这代码写的实在是。。。于是乎作者使用了MVC框架后整理了一个新的。(如果你学了servlet,那会发现和它的结构和思想非常的像)
实现效果图
编辑
总体思路
- 尽量做到前后端分离,前端页面有什么页面就写什么,前端页面需要什么实体对象和业务对象后端就写什么。
- 后端涉及到的有实体对象(商品、用户)和业务处理(登录、注册)
- 前端涉及到的有登录、注册、商品展示页面。以及登录与注册相关的处理、成功/失败的结果页面
项目工程文件结构
编辑
编辑
后端
pojo文件存储的是实体类,该实体类为JAVABean,特点是 属性private+属性getter()/setter()方法+无参构造方法,代码如下。
用户实体类
package week8.pojo; public class User { private String username; private String password; public User() { } public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
商品实体类
package week8.pojo; public class Good { public String tName; public int tPrince; public int tNum; public Good(String tName, int tPrince, int tNum){ this.tName=tName; this.tNum=tNum; this.tPrince=tPrince; } public Good() { } public String gettName() { return tName; } public void settName(String tName) { this.tName = tName; } public int gettPrince() { return tPrince; } public void settPrince(int tPrince) { this.tPrince = tPrince; } public int gettNum() { return tNum; } public void settNum(int tNum) { this.tNum = tNum; } @Override public String toString() { return "thing{" + "tName='" + tName + '\'' + ", tPrince=" + tPrince + ", tNum=" + tNum + '}'; } }
商品集实体类
package week8.pojo; import test.thing; import java.util.ArrayList; public class Repository { private ArrayList<Good> repo; public Repository(ArrayList<Good> repo) { this.repo = repo; } public Repository() { } public ArrayList<Good> getRepo() { return repo; } public void setRepo(ArrayList<Good> repo) { this.repo = repo; } }
service文件主要存储的是业务类,尤其要注意UserService里有一个List对象来模拟数据库,且必须加static
package week8.service; import week8.pojo.User; import java.util.ArrayList; public class UserService { //初始化定义一个list数据库 private static ArrayList<User> userArrayList=new ArrayList<>(); //登录业务 public static User loginService(User user){ String username= user.getUsername(); String passwrod= user.getPassword(); if(username==null|passwrod==null){ return null; } for(User user1:userArrayList){ System.out.println(user1.toString()); System.out.println(username); System.out.println(user1.getUsername()); System.out.println(passwrod); System.out.println(user1.getPassword()); if(username.equals(user1.getUsername())&passwrod.equals(user1.getPassword())) return user1; } return null; } //注册业务 public User registerService(User user){ //若以username为候选键,则其必定为UNIQUE String username= user.getUsername(); for(User user1:userArrayList){ if(username.equals(user1.getUsername())){ return null; } } userArrayList.add(user); return user; } }
前端
登录页面
登录展示页面-->业务处理页面-->处理结果页面
登录展示页面,主要用于用户数据的接受
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录</title> </head> <body> 登录 <form action="<%=request.getContextPath()%>/week8/login_handler.jsp" method="post"> 用户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="提交"/> </form> <a href="<%=request.getContextPath()%>/week8/register.jsp">如果您未注册,请先点击注册</a> </body> </html>
业务处理页面,使用UserService对象的中的登录注册判定方法,从而决定要跳转到哪一个结果页面。如果用户账号密码登录成功,那就跳转到商品展示页面,所以可以在此页面对商品数据进行初始化。
<%@ page import="week8.pojo.User" %> <%@ page import="week8.service.UserService" %> <%@ page import="week8.pojo.Repository" %> <%@ page import="week8.pojo.Good" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% //初始化业务对象类,方便后续使用其方法 UserService userService=new UserService(); request.setCharacterEncoding("utf8"); // 设置字符集,避免出现乱码 String username= request.getParameter("username"); String password= request.getParameter("password"); User user=new User(); user.setUsername(username); user.setPassword(password); User loginUser=UserService.loginService(user); if(loginUser!=null){ //登录成功建立Session会话 session.setAttribute("user",loginUser); //初始化商品信息 Repository repo=new Repository(); ArrayList<Good> arrayList=new ArrayList<Good>(); for (int i =0;i<20;i++) { Good t=new Good(); t.tName="旺仔牛奶"; t.tPrince=56; t.tNum=98; arrayList.add(t); } repo.setRepo(arrayList); session.setAttribute("repo",repo); response.sendRedirect("show.jsp"); } else{ request.setAttribute("msg","您输入的账号或密码有错误"); request.getRequestDispatcher("/week8/login_error.jsp").forward(request,response); } %>
登录失败页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <p style="color: red;font-size: 30px;text-align: center">登录失败:<%=request.getAttribute("msg")%></p> <a href="login.jsp">重新登录</a>
登录成功页面,显示商品信息
<%@ page import="week8.pojo.Repository" %> <%@ page import="week8.pojo.Good" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.Iterator" %> <%@ page import="week8.pojo.User" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% User u1=(User)session.getAttribute("user"); if(u1!=null){%><a href="login_quit.jsp">退出登录</a><% Repository repo=(Repository)session.getAttribute("repo"); ArrayList<Good> thingArrayList=repo.getRepo(); Iterator<Good> thingIterator=thingArrayList.iterator(); Good t=null;%> <table> <tr> <th>名字</th> <th>库存</th> <th>价格</th> </tr> <% while(thingIterator.hasNext()){ t=thingIterator.next(); %> <tr> <td><%=t.gettName()%></td> <td><%=t.gettNum()%></td> <td><%=t.gettPrince()%></td> </tr><br/> </table> <% } }else{%> <a href="login.jsp">请先登录!</a> <%}%> </body> </html>
注册页面
注册展示页面-->注册业务处理页面-->处理结果页面
注册展示页面,主要用于接受用户注册信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>注册</title> </head> <body> 注册 <form action="<%=request.getContextPath()%>/week8/register_handler.jsp" method="post"> 用户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="提交"/> </form> </body> </html>
注册业务处理页面,使用UserService来对注册的用户名和密码进行处理,因为只需要显示是否登录成功,所以在业务处理之后,在本页面直接显示结果
<%@ page import="week8.pojo.User" %> <%@ page import="week8.service.UserService" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% UserService userService=new UserService(); request.setCharacterEncoding("utf8"); String username=request.getParameter("username"); String password=request.getParameter("password"); User user=new User(); user.setPassword(password); user.setUsername(username); User loginUser=userService.registerService(user); if (loginUser!=null){ out.print("注册成功"); %> <a href="<%=request.getContextPath()%>/week8/login.jsp">去登录</a> <% }else{ out.print("注册失败!"); %> <a href="<%=request.getContextPath()%>/week8/register.jsp">重新注册</a> <% }%>
退出登录页面
注意此时session已经把所要连接的对象删除了,所以此时直接进入show.jsp商品展示页面不会显示出商品,只有返回登录的链接。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% session.invalidate(); response.sendRedirect("login.jsp"); %>