MVC分层实现管理员后台商品查询
MVC层即model view controller
Model(模型):模型代表着核心的业务逻辑和数据(不要理解成Model只是实体类)
View(视图):视图应该关注与如何展示数据,而不应该包含任何业务逻辑(业务逻辑应写在Model中)
Controller(控制器):控制器控制着程序的逻辑,并充当着视图和模型之间的协调角色。控制器从视图层接收用户输入的信息,然后使用模型来执行特定的操作,并把最终的结果回传给视图
model层:存放业务逻辑处理,不直接和数据库打交道但存放关于数据库处理的操作
Dao层:对数据库进行数据持久化操作,操作直接针对数据库
index.jsp进行首页的展示,用户可以在首页进行普通用户的注册和登录,当使用管理员账号登录时候可以进入商品后台对其进行进一步管理(LoginServlet.java中实现)
项目结构
DBUtil.java模拟数据库,已存在的管理员用户和商品信息列表如下,注册时只能对普通用户进行注册,Gary和Gary2的isAdmin为True
public static MapuserMap = new HashMap (); public static List goodsList = new ArrayList (); 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 { Listlist = 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", "用户名或密码错误,请重新登录!"); 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", "注册成功,请登录!"); request.getRequestDispatcher("/login.jsp").forward(request, response); }else { request.setAttribute("msg", "用户名重复,请重新填写"); 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 ListgetAllGoods(){ 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 ListselectAllGoods(){ 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 MapuserMap = new HashMap (); public static List goodsList = new ArrayList (); 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"%>Insert title here 商品管理
添加list = (List )request.getAttribute("list");for(Goods goods : list){ %>
商品名 | 描述 | 价格 | 库存 | 操作 |
<%=goods.getName() %> | <%=goods.getDes() %> | <%=goods.getPrice() %> | <%=goods.getInventory() %> | 删除 修改 |
首页面
<%@ page import="com.Gary.model.User" %><%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>Insert title here <%Object user = session.getAttribute("user");if(user==null){ %> 登录 注册 <% }else{ out.println("当前登录用户:"+((User)user).getUsername());}%>各种商品的展示
用户登录页面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>Insert title here <%if(request.getAttribute("msg")!=null) out.println(request.getAttribute("msg")+"");%>登录
用户注册页面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>Insert title here <%if(request.getAttribute("msg")!=null) out.println(request.getAttribute("msg")+"");%>注册
实现过程
index.jsp判断有无用户登录,有用户登录时展示用户信息,若无用户登录则显示用户注册登录
<%Object user = session.getAttribute("user");if(user==null){ %> 登录 注册 <% }else{ out.println("当前登录用户:"+((User)user).getUsername());}%>
用户注册后将表单提交给register_do
创建用户数据模型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 MapuserMap = new HashMap (); public static List goodsList = new ArrayList (); 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 ListgetAllGoods(){ 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", "注册成功,请登录!"); request.getRequestDispatcher("/login.jsp").forward(request, response); }else { request.setAttribute("msg", "用户名重复,请重新填写"); 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 { Listlist = new GoodsService().selectAllGoods(); request.setAttribute("list", list); request.getRequestDispatcher("/admin/goods_list.jsp").forward(request, response); }}
goods_list.jsp展示数据库中商品信息列表
<%Listlist = (List )request.getAttribute("list");for(Goods goods : list){ %> <%=goods.getName() %><%=goods.getDes() %><%=goods.getPrice() %><%=goods.getInventory() %>删除 修改 <%}%>