MVC分層實現管理員后台商品查詢
MVC層即model view controller
Model(模型):模型代表着核心的業務邏輯和數據(不要理解成Model只是實體類)
View(視圖):視圖應該關注與如何展示數據,而不應該包含任何業務邏輯(業務邏輯應寫在Model中)
Controller(控制器):控制器控制着程序的邏輯,並充當着視圖和模型之間的協調角色。控制器從視圖層接收用戶輸入的信息,然后使用模型來執行特定的操作,並把最終的結果回傳給視圖
model層:存放業務邏輯處理,不直接和數據庫打交道但存放關於數據庫處理的操作
Dao層:對數據庫進行數據持久化操作,操作直接針對數據庫
index.jsp進行首頁的展示,用戶可以在首頁進行普通用戶的注冊和登錄,當使用管理員賬號登錄時候可以進入商品后台對其進行進一步管理(LoginServlet.java中實現)
項目結構
DBUtil.java模擬數據庫,已存在的管理員用戶和商品信息列表如下,注冊時只能對普通用戶進行注冊,Gary和Gary2的isAdmin為True
public static Map<String , User> userMap = new HashMap<String , User>(); public static List<Goods> goodsList = new ArrayList<Goods>(); static { addUser(new User("Gary","123",10,"男",true)); addUser(new User("Gary2","456",20,"男",true)); goodsList.add(new Goods("香蕉","這個是香蕉",100,110)); goodsList.add(new Goods("蘋果","這個是蘋果",200,120)); goodsList.add(new Goods("西瓜","這個是西瓜",300,130)); goodsList.add(new Goods("桃子","這個是桃子",400,140)); }
邏輯層:處理代碼請求

package com.Gary.controller; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.Gary.model.Goods; import com.Gary.service.GoodsService; @WebServlet("/admin/goods_list") public class GoodsListServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Goods> list = new GoodsService().selectAllGoods(); request.setAttribute("list", list); request.getRequestDispatcher("/admin/goods_list.jsp").forward(request, response); } }

package com.Gary.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.Gary.model.User; import com.Gary.service.UserService; @WebServlet("/login_do") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); UserService service = new UserService(); User user =service.login(username, password); System.out.println(user); if(user!=null) { request.getSession().setAttribute("user", user); //System.out.println(user); //TODO if(user.isAdmin()) { //管理員 //response.sendRedirect(request.getContextPath()+"/admin/goods_list.jsp"); request.getRequestDispatcher("admin/goods_list").forward(request, response); //不需要傳遞數據時可以使用重定向 //response.sendRedirect(request.getContextPath()+"/admin/good_list"); }else { //普通用戶 //System.out.println("完成"); request.getRequestDispatcher("/").forward(request, response); } }else { request.setAttribute("msg", "<font color='red'>用戶名或密碼錯誤,請重新登錄!</font>"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } }

package com.Gary.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.Gary.service.UserService; /** * Servlet implementation class RegisterService */ @WebServlet("/register_do") public class RegisterService extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置中文編碼 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); int age = Integer.parseInt(request.getParameter("age")); String sex = request.getParameter("sex"); UserService userService = new UserService(); boolean isSuccess = userService.register(username,password,age,sex); if(isSuccess) { request.setAttribute("msg", "<font color='green'>注冊成功,請登錄!</font>"); request.getRequestDispatcher("/login.jsp").forward(request, response); }else { request.setAttribute("msg", "<font color='red'>用戶名重復,請重新填寫</font>"); request.getRequestDispatcher("/register.jsp").forward(request, response); } } }
DAO層:將數據存到數據庫中

package com.Gary.dao; import java.util.List; import com.Gary.model.Goods; import com.Gary.util.DBUtil; public class GoodsDao { public List<Goods> getAllGoods(){ return DBUtil.goodsList; } }

package com.Gary.dao; import com.Gary.model.User; import com.Gary.util.DBUtil; public class UserDao { public boolean isExist(String username) { return DBUtil.userMap.containsKey(username); } public boolean addUser(String username,String password,int age,String sex) { if(isExist(username)) return false; User u = new User(username,password,age,sex,false); DBUtil.userMap.put(u.getUsername(),u); return true; } public User getUserByUP(String username,String password) { if(isExist(username)==false) return null; User u = DBUtil.userMap.get(username); if(u.getPassword().equals(password))return u; else return null; } }
model層:存放我們的實體類,與數據庫中的屬性值基本保持一致

package com.Gary.model; public class Goods { private String name; private String des; private int price; private int inventory; public Goods(String name, String des, int price, int inventory) { super(); this.name = name; this.des = des; this.price = price; this.inventory = inventory; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDes() { return des; } public void setDes(String des) { this.des = des; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public int getInventory() { return inventory; } public void setInventory(int inventory) { this.inventory = inventory; } }

package com.Gary.model; public class User { private String username; private String password; private int age; private String sex; private boolean isAdmin=false; //判斷是否是管理員賬號 public User(String username, String password, int age, String sex, boolean isAdmin) { super(); this.username = username; this.password = password; this.age = age; this.sex = sex; this.isAdmin = isAdmin; } 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; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public boolean isAdmin() { return isAdmin; } public void setAdmin(boolean isAdmin) { this.isAdmin = isAdmin; } }
service層:存放業務邏輯處理

package com.Gary.service; import java.util.List; import com.Gary.dao.GoodsDao; import com.Gary.model.Goods; public class GoodsService { public List<Goods> selectAllGoods(){ return new GoodsDao().getAllGoods(); } }

package com.Gary.service; import com.Gary.dao.UserDao; import com.Gary.model.User; public class UserService { //處理注冊請求 public boolean register(String username,String password,int age ,String sex) { UserDao userDao = new UserDao(); boolean isExist =userDao.isExist(username); if(isExist) return false; else userDao.addUser(username, password, age, sex); return true; } public User login(String username,String password) { return new UserDao().getUserByUP(username, password); } }
util層:輔助作用 【我用來做數據庫的模擬】

package com.Gary.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.Gary.model.Goods; import com.Gary.model.User; //模擬數據庫 public class DBUtil { public static Map<String , User> userMap = new HashMap<String , User>(); public static List<Goods> goodsList = new ArrayList<Goods>(); static { addUser(new User("Gary","123",10,"男",true)); addUser(new User("Gary2","456",20,"男",true)); goodsList.add(new Goods("香蕉","這個是香蕉",100,110)); goodsList.add(new Goods("蘋果","這個是蘋果",200,120)); goodsList.add(new Goods("西瓜","這個是西瓜",300,130)); goodsList.add(new Goods("桃子","這個是桃子",400,140)); } private static void addUser(User user) { userMap.put(user.getUsername(), user); } }
商品列表頁面

<%@page import="com.Gary.model.Goods"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> <style type="text/css"> *{ font-size = 20px; } </style> </head> <body> <h1>商品管理</h1> </hr> <a>添加</a> <table border = "1"> <tr> <td>商品名</td><td>描述</td><td>價格</td><td>庫存</td><td>操作</td> </tr> <% List<Goods> list = (List<Goods>)request.getAttribute("list"); for(Goods goods : list){ %> <tr> <td><%=goods.getName() %></td><td><%=goods.getDes() %></td><td><%=goods.getPrice() %></td><td><%=goods.getInventory() %></td><td>刪除 修改</td> </tr> <% } %> <!-- <tr> --> <!-- <td>香蕉</td><td>這個是香蕉</td><td>78</td><td>500</td><td>刪除 修改</td> --> <!-- </tr> --> </body> </html>
首頁面

<%@ page import="com.Gary.model.User" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <% Object user = session.getAttribute("user"); if(user==null){ %> <a href="<%=request.getContextPath() %>/login.jsp">登錄</a> <a href="<%=request.getContextPath() %>/register.jsp">注冊</a> <% }else{ out.println("當前登錄用戶:"+((User)user).getUsername()); } %> <body> </br> 各種商品的展示 </body> </html>
用戶登錄頁面

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> <% if(request.getAttribute("msg")!=null) out.println(request.getAttribute("msg")+"<br/>"); %> 登錄 <hr/> <form action="<%=request.getContextPath() %>/login_do" method="post"> 用戶名:<input type="text" name="username" /><br/> 密碼:<input type="password" name="password" /><br/> <input type="submit" value="登錄" /> </form> </body> </html>
用戶注冊頁面

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> <% if(request.getAttribute("msg")!=null) out.println(request.getAttribute("msg")+"<br/>"); %> 注冊 <hr/> <form action="<%=request.getContextPath() %>/register_do" method="post"> 用戶名:<input type="text" name="username" /><br/> 密碼:<input type="password" name="password" /><br/> 年齡:<input type="text" name="age" /><br/> 性別: 男<input type="radio" name="sex" value="男" checked="checked"/>女<input type="radio" name="sex" value="女" /><br/> <input type="submit" value="注冊" /> </form> </body> </html>
實現過程
index.jsp判斷有無用戶登錄,有用戶登錄時展示用戶信息,若無用戶登錄則顯示用戶注冊登錄
<% Object user = session.getAttribute("user"); if(user==null){ %> <a href="<%=request.getContextPath() %>/login.jsp">登錄</a> <a href="<%=request.getContextPath() %>/register.jsp">注冊</a> <% }else{ out.println("當前登錄用戶:"+((User)user).getUsername()); } %>
用戶注冊后將表單提交給register_do
<form action="<%=request.getContextPath() %>/register_do" method="post"> 用戶名:<input type="text" name="username" /><br/> 密碼:<input type="password" name="password" /><br/> 年齡:<input type="text" name="age" /><br/> 性別: 男<input type="radio" name="sex" value="男" checked="checked"/>女<input type="radio" name="sex" value="女" /><br/> <input type="submit" value="注冊" /> </form>
創建用戶數據模型User,java和Goods.java
private String username; private String password; private int age; private String sex; private boolean isAdmin=false; //判斷是否是管理員賬號
private String name; private String des; //商品描述信息 private int price; private int inventory; //商品庫存
DBUtil.java模擬數據庫,將用戶與商品存放到List<>集合中
public static Map<String , User> userMap = new HashMap<String , User>(); public static List<Goods> goodsList = new ArrayList<Goods>(); static { addUser(new User("Gary","123",10,"男",true)); addUser(new User("Gary2","456",20,"男",true)); goodsList.add(new Goods("香蕉","這個是香蕉",100,110)); goodsList.add(new Goods("蘋果","這個是蘋果",200,120)); goodsList.add(new Goods("西瓜","這個是西瓜",300,130)); goodsList.add(new Goods("桃子","這個是桃子",400,140)); } private static void addUser(User user) { userMap.put(user.getUsername(), user); }
UserDao.java和GoodDao.java處理數據庫邏輯
//用戶是否退出登錄 public boolean isExist(String username) { return DBUtil.userMap.containsKey(username); } //添加用戶 public boolean addUser(String username,String password,int age,String sex) { if(isExist(username)) return false; User u = new User(username,password,age,sex,false); DBUtil.userMap.put(u.getUsername(),u); return true; } //判斷用戶是否登錄成功 public User getUserByUP(String username,String password) { if(isExist(username)==false) return null; User u = DBUtil.userMap.get(username); if(u.getPassword().equals(password))return u; else return null; }
public class GoodsDao { //列出所有的商品 public List<Goods> getAllGoods(){ return DBUtil.goodsList; } }
RegisterService.java處理用戶注冊信息,處理用戶的注冊和登錄
@WebServlet("/register_do") public class RegisterService extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置中文編碼 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); int age = Integer.parseInt(request.getParameter("age")); String sex = request.getParameter("sex"); UserService userService = new UserService(); boolean isSuccess = userService.register(username,password,age,sex); if(isSuccess) { request.setAttribute("msg", "<font color='green'>注冊成功,請登錄!</font>"); request.getRequestDispatcher("/login.jsp").forward(request, response); }else { request.setAttribute("msg", "<font color='red'>用戶名重復,請重新填寫</font>"); request.getRequestDispatcher("/register.jsp").forward(request, response); } } }
LoginServlet.java處理用戶登錄后分用戶和管理員操作,用戶跳轉到首頁,管理員則轉發到goods_list對商品后台信息進行處理
GoodsListServlet.java處理轉發的goods_list請求
@WebServlet("/admin/goods_list") public class GoodsListServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Goods> list = new GoodsService().selectAllGoods(); request.setAttribute("list", list); request.getRequestDispatcher("/admin/goods_list.jsp").forward(request, response); } }
goods_list.jsp展示數據庫中商品信息列表
<% List<Goods> list = (List<Goods>)request.getAttribute("list"); for(Goods goods : list){ %> <tr> <td><%=goods.getName() %></td><td><%=goods.getDes() %></td><td><%=goods.getPrice() %></td><td><%=goods.getInventory() %></td><td>刪除 修改</td> </tr> <% } %> <!-- <tr> --> <!-- <td>香蕉</td><td>這個是香蕉</td><td>78</td><td>500</td><td>刪除 修改</td> --> <!-- </tr> -->