本文主要是介绍家居网购项目(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.会员登录
- 1.需求分析
- 2.程序框架图
- 3.修改MemberDao
- 添加方法
- 4.修改MemberDaoImpl
- 添加方法
- MemberDaoTest单元测试
- 5.修改MemberService
- 添加方法
- 6.修改MemberServiceImpl
- 添加方法
- MemberServiceTest单元测试
- 7.编写LoginServlet
- 1.修改login.html表单
- 2.引入login_ok.html,修改base路径
- 3.LoginServlet.java
- 8.调试阶段
- 1.没有报错,登录之后是空白页面
- 原因
- 9.结果展示
- 2.登录错误提示,表单回显
- 1.需求分析
- 2.程序框架图
- 3.修改LoginServlet
- 将username和信息放到request中
- 4.修改login.html为login.jsp
- 5.修改login.jsp
- 1.提示错误信息
- 2.登录失败之后显示用户名
- 6.结果展示
- 3.Web层Servlet合并
- 1.需求分析
- 2.方案一
- 1.方案
- 2.login.jsp增加两个隐藏域
- 3.编写MemberServlet
- MemberServlet.java
- 4.缺点
- if-else过多,影响可读性
- 3.方案二
- 1.方案
- 2.修改MemberServlet
- **MemberServlet.java**
- 3.编写BasicServlet
- BasicServlet.java
- 4.家居后台管理—显示家居
- 1.需求分析
- 2.管理员表的两种方式
- 1.继续使用member表,增加字段
- 2.开一个新的admin表
- 3.程序框架图
- 4.管理员登录
- 1.创建管理员表
- 2.编写javabean与表的映射
- Admin.java
- 3.编写AdminDao
- AdminDao.java
- 4.编写AdminDaoImpl
- AdminDaoImpl.java
- 5.单元测试
- AdminDaoTest.java
- 6.编写AdminService
- AdminService.java
- 7.编写AdminServiceImpl
- AdminServiceImpl.java
- 8.单元测试
- AdminServiceTest.java
- 9.修改manage_login.jsp
- 10.编写AdminServlet
- AdminServlet.java
- 11.结果展示
- 1.管理员登录
- 2.登录成功
- 5.家居表设计
- 6.编写javabean与家居表的映射
- Furn.java
- 7.编写FurnDao
- FurnDao.java
- 8.编写FurnDaoImpl
- FurnDaoImpl.java
- 9.单元测试
- FurnDaoTest.java
- 10.编写FurnService
- FurnService.java
- 11.FurnServiceImpl
- FurnServiceImpl.java
- 12.单元测试
- FurnServiceTest.java
- 14.修改manage_menu.jsp
- 15.编写FurnServlet
- FurnServlet.java
- 16.修改furn_manage.jsp
- 17.结果展示
- 1.管理员登录成功
- 2.点击家居管理
1.会员登录
1.需求分析
2.程序框架图
3.修改MemberDao
添加方法
//3.根据用户名和密码查找是否有该用户public Member queryMemberByUsernameAndPassword(String useranme, String password);
4.修改MemberDaoImpl
添加方法
/*** 根据会员的用户名和密码去member表中查询是否有该用户* @param useranme* @param password* @return 有则返回member对象,没有则返回null*/@Overridepublic Member queryMemberByUsernameAndPassword(String useranme, String password) {//查询单条记录String sql = "select * from member where username = ? and password = MD5(?)";return querySingle(sql, Member.class, useranme, password);}
MemberDaoTest单元测试
@Testpublic void queryMemberByUsernameAndPassword() {Member member = memberDao.queryMemberByUsernameAndPassword("111111", "111111");if (member == null) {System.out.println("该用户不存在");} else {System.out.println("该用户存在");}}
5.修改MemberService
添加方法
//用户登录public boolean login(String username, String password);
6.修改MemberServiceImpl
添加方法
/*** 用户登录验证* @param username* @param password* @return 登录成功返回Member对象,登录失败返回null*/@Overridepublic boolean login(String username, String password) {return memberDao.queryMemberByUsernameAndPassword(username, password) == null ? false : true;}
MemberServiceTest单元测试
@Testpublic void queryMemberByUsernameAndPassword() {if (memberService.login("11111", "111111")){System.out.println("登录成功");} else {System.out.println("登录失败");}}
7.编写LoginServlet
1.修改login.html表单
2.引入login_ok.html,修改base路径
3.LoginServlet.java
package com.sxs.furns.web;import com.sxs.furns.service.MemberService;
import com.sxs.furns.service.impl.MemberServiceImpl;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 java.io.IOException;/*** 处理会员用户登录* @author 孙显圣* @version 1.0*/
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {MemberService memberService = new MemberServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取用户名和密码String username = req.getParameter("username");String password = req.getParameter("password");//进行登录验证if (memberService.login(username, password)) {//请求转发到成功页面req.getRequestDispatcher("/views/member/login_ok.html").forward(req,resp);} else {//请求转发到首页req.getRequestDispatcher("/views/member/login.html").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
8.调试阶段
1.没有报错,登录之后是空白页面
原因
后端光获取了getRequestDispatcher,并没有使用forward转发
9.结果展示
2.登录错误提示,表单回显
1.需求分析
2.程序框架图
3.修改LoginServlet
将username和信息放到request中
4.修改login.html为login.jsp
5.修改login.jsp
1.提示错误信息
2.登录失败之后显示用户名
6.结果展示
3.Web层Servlet合并
1.需求分析
2.方案一
1.方案
2.login.jsp增加两个隐藏域
3.编写MemberServlet
MemberServlet.java
package com.sxs.furns.web;import com.sxs.furns.entity.Member;
import com.sxs.furns.service.MemberService;
import com.sxs.furns.service.impl.MemberServiceImpl;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 java.io.IOException;/*** @author 孙显圣* @version 1.0*/
@WebServlet("/memberServlet")
public class MemberServlet extends HttpServlet {MemberService memberService = new MemberServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取隐藏域的信息String action = req.getParameter("action");if (action.equals("register")) {//调用register方法register(req, resp);} else if (action.equals("login")) {//调用login方法login(req, resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}public void register(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//接受用户注册信息String username = req.getParameter("username");String password = req.getParameter("password");String email = req.getParameter("email");//判断用户名是否在数据库中if (!memberService.isExistsUsername(username)) { //不在数据库中,可以注册Member member = new Member(null, username, password, email);//注册if (memberService.registerMember(member)) {//请求转发req.getRequestDispatcher("/views/member/register_ok.html").forward(req, resp);} else {//请求转发req.getRequestDispatcher("/views/member/register_fail.html").forward(req, resp);}} else {//返回注册页面req.getRequestDispatcher("/views/member/login.jsp").forward(req, resp);}}public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取用户名和密码String username = req.getParameter("username");String password = req.getParameter("password");//进行登录验证if (memberService.login(username, password)) {//请求转发到成功页面req.getRequestDispatcher("/views/member/login_ok.html").forward(req, resp);} else {//登录失败则将username请求转发到首页req.setAttribute("msg", "用户名或密码错误");req.setAttribute("username", username);req.getRequestDispatcher("/views/member/login.jsp").forward(req, resp);}}
}
4.缺点
if-else过多,影响可读性
3.方案二
1.方案
2.修改MemberServlet
MemberServlet.java
package com.sxs.furns.web;import com.sxs.furns.entity.Member;
import com.sxs.furns.service.MemberService;
import com.sxs.furns.service.impl.MemberServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 孙显圣* @version 1.0*/
@WebServlet("/memberServlet")
public class MemberServlet extends BasicServlet {MemberService memberService = new MemberServiceImpl();public void register(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//接受用户注册信息String username = req.getParameter("username");String password = req.getParameter("password");String email = req.getParameter("email");//判断用户名是否在数据库中if (!memberService.isExistsUsername(username)) { //不在数据库中,可以注册Member member = new Member(null, username, password, email);//注册if (memberService.registerMember(member)) {//请求转发req.getRequestDispatcher("/views/member/register_ok.html").forward(req, resp);} else {//请求转发req.getRequestDispatcher("/views/member/register_fail.html").forward(req, resp);}} else {//返回注册页面req.getRequestDispatcher("/views/member/login.jsp").forward(req, resp);}}public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取用户名和密码String username = req.getParameter("username");String password = req.getParameter("password");//进行登录验证if (memberService.login(username, password)) {//请求转发到成功页面req.getRequestDispatcher("/views/member/login_ok.html").forward(req, resp);} else {//登录失败则将username请求转发到首页req.setAttribute("msg", "用户名或密码错误");req.setAttribute("username", username);req.getRequestDispatcher("/views/member/login.jsp").forward(req, resp);}}
}
3.编写BasicServlet
BasicServlet.java
package com.sxs.furns.web;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;/*** servlet抽象模板** @author 孙显圣* @version 1.0*/
public abstract class BasicServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取隐藏域的信息String action = req.getParameter("action");//获取当前实例的class对象try {//获取指定参数类型的方法Method declaredMethod = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);//调用方法declaredMethod.invoke(this, req, resp);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
4.家居后台管理—显示家居
1.需求分析
2.管理员表的两种方式
1.继续使用member表,增加字段
2.开一个新的admin表
3.程序框架图
4.管理员登录
1.创建管理员表
-- 创建管理员表
CREATE TABLE `admin` (
`id` INT PRIMARY KEY auto_increment,
`username` VARCHAR(32) NOT NULL UNIQUE,
`password` VARCHAR(32) NOT NULL
);
-- 测试数据
INSERT INTO admin VALUES(NULL, 'admin', MD5('admin'));
2.编写javabean与表的映射
Admin.java
package com.sxs.furns.entity;/*** @author 孙显圣* @version 1.0*/
public class Admin {private Integer id;private String username;private String password;//无参构造public Admin() {}public Admin(Integer id, String username, String password) {this.id = id;this.username = username;this.password = password;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}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;}
}
3.编写AdminDao
AdminDao.java
package com.sxs.furns.dao;import com.sxs.furns.entity.Admin;/*** @author 孙显圣* @version 1.0*/
public interface AdminDao {//1.根据用户名和密码查询管理员public Admin queryAdminByUsernameAndPassword(String username, String password);
}
4.编写AdminDaoImpl
AdminDaoImpl.java
package com.sxs.furns.dao.impl;import com.sxs.furns.dao.AdminDao;
import com.sxs.furns.dao.BasicDao;
import com.sxs.furns.entity.Admin;/*** @author 孙显圣* @version 1.0*/
public class AdminDaoImpl extends BasicDao<Admin> implements AdminDao {/*** 根据用户名和密码查询管理员* @return 查询到则返回Admin对象,查询失败则返回null*/@Overridepublic Admin queryAdminByUsernameAndPassword(String username, String password) {String sql = "select * from admin where username = ? and password = md5(?)";//返回查到的数据或者nullreturn querySingle(sql, Admin.class, username, password);}
}
5.单元测试
AdminDaoTest.java
package com.sxs.furns.test;import com.sxs.furns.dao.AdminDao;
import com.sxs.furns.dao.impl.AdminDaoImpl;
import org.junit.Test;/*** @author 孙显圣* @version 1.0*/
public class AdminDaoTest {private AdminDao adminDao = new AdminDaoImpl();@Testpublic void queryAdminByUsernameAndPassword() {if (adminDao.queryAdminByUsernameAndPassword("admin1", "admin") != null) {System.out.println("管理员存在");} else {System.out.println("管理员不存在");}}
}
6.编写AdminService
AdminService.java
package com.sxs.furns.service;/**** @author 孙显圣* @version 1.0*/
public interface AdminService {//1.管理员登录public boolean login(String username, String password);
}
7.编写AdminServiceImpl
AdminServiceImpl.java
package com.sxs.furns.service.impl;import com.sxs.furns.dao.AdminDao;
import com.sxs.furns.dao.impl.AdminDaoImpl;
import com.sxs.furns.entity.Admin;
import com.sxs.furns.service.AdminService;/*** @author 孙显圣* @version 1.0*/
public class AdminServiceImpl implements AdminService {AdminDao adminDao = new AdminDaoImpl();/*** 根据用户名密码验证管理员登录* @param username* @param password* @return 成功返回true失败返回false*/@Overridepublic boolean login(String username, String password) {return adminDao.queryAdminByUsernameAndPassword(username, password) != null ? true : false;}
}
8.单元测试
AdminServiceTest.java
package com.sxs.furns.test;import com.sxs.furns.service.AdminService;
import com.sxs.furns.service.impl.AdminServiceImpl;
import org.junit.Test;/*** @author 孙显圣* @version 1.0*/
public class AdminServiceTest {AdminService adminService = new AdminServiceImpl();@Testpublic void login(){if (adminService.login("admin", "admin")) {System.out.println("登录成功");} else {System.out.println("登录失败");}}
}
9.修改manage_login.jsp
10.编写AdminServlet
AdminServlet.java
package com.sxs.furns.web;import com.sxs.furns.service.AdminService;
import com.sxs.furns.service.impl.AdminServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/adminServlet")
public class AdminServlet extends BasicServlet{private AdminService adminService = new AdminServiceImpl();//处理管理员登录,注意需要在表单提交的action隐藏域传递login这个方法名public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取用户名和密码String username = req.getParameter("username");String password = req.getParameter("password");//执行登录验证if (adminService.login(username, password)) {//请求转发到管理员菜单页面req.getRequestDispatcher("/views/manage/manage_menu.jsp").forward(req, resp);} else {//请求转发到登录界面req.getRequestDispatcher("/views/manage/manage_login.jsp").forward(req, resp);}}
}
11.结果展示
1.管理员登录
2.登录成功
5.家居表设计
-- 创建家居表CREATE TABLE `furn` (
`id` INT UNSIGNED PRIMARY KEY auto_increment, #id
`name` VARCHAR(64) NOT NULL, #名字
`maker` VARCHAR(64) NOT NULL, #制造商
`price` DECIMAL(11, 2) NOT NULL, #价格
`sales` INT UNSIGNED NOT NULL, #销量
`stock` INT UNSIGNED NOT NULL, #库存
`img_path` VARCHAR(256) NOT NULL #存放图片的路径
);
-- 测试数据
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '北欧风格小桌子' , '熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/6.jpg');INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '简约风格小椅子' , '熊猫家居' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg');INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '典雅风格小台灯' , '蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/14.jpg');INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '温馨风格盆景架' , '蚂蚁家居' , 180 , 666 , 7 , 'assets/images/product-image/16.jpg');
6.编写javabean与家居表的映射
Furn.java
package com.sxs.furns.entity;import java.math.BigDecimal;/*** 家居表映射* @author 孙显圣* @version 1.0*/
public class Furn {private Integer id;private String name;private String maker;private BigDecimal price;private Integer sales;private Integer stock;private String imgPath; //注意这里的字段跟表中设计的是不一样的,后面有解决方案//无参构造public Furn(){}public Furn(Integer id, String name, String maker, BigDecimal price, Integer sales, Integer stock, String imgPath) {this.id = id;this.name = name;this.maker = maker;this.price = price;this.sales = sales;this.stock = stock;this.imgPath = imgPath;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getMaker() {return maker;}public void setMaker(String maker) {this.maker = maker;}public BigDecimal getPrice() {return price;}public void setPrice(BigDecimal price) {this.price = price;}public Integer getSales() {return sales;}public void setSales(Integer sales) {this.sales = sales;}public Integer getStock() {return stock;}public void setStock(Integer stock) {this.stock = stock;}public String getImgPath() {return imgPath;}public void setImgPath(String imgPath) {this.imgPath = imgPath;}@Overridepublic String toString() {return "Furn{" +"id=" + id +", name='" + name + '\'' +", maker='" + maker + '\'' +", price=" + price +", sales=" + sales +", stock=" + stock +", imgPath='" + imgPath + '\'' +'}';}
}
7.编写FurnDao
FurnDao.java
package com.sxs.furns.dao;import com.sxs.furns.entity.Furn;import java.util.List;/*** @author 孙显圣* @version 1.0*/
public interface FurnDao {//返回所有家具集合public List<Furn> queryFurns();
}
8.编写FurnDaoImpl
FurnDaoImpl.java
package com.sxs.furns.dao.impl;import com.sxs.furns.dao.BasicDao;
import com.sxs.furns.dao.FurnDao;
import com.sxs.furns.entity.Furn;import java.util.List;/*** @author 孙显圣* @version 1.0*/
public class FurnDaoImpl extends BasicDao<Furn> implements FurnDao {@Overridepublic List<Furn> queryFurns() {//sql语句的img_path字段加一个别名为属性的名字,这样在查找到数据之后就会调用setImgPath()方法String sql = "SELECT id, name, maker, price, sales, stock, img_path as imgPath from furn";return queryMulti(sql, Furn.class);}
}
9.单元测试
FurnDaoTest.java
package com.sxs.furns.test;import com.sxs.furns.dao.FurnDao;
import com.sxs.furns.dao.impl.FurnDaoImpl;
import com.sxs.furns.entity.Furn;
import org.junit.Test;import java.util.List;/*** @author 孙显圣* @version 1.0*/
public class FurnDaoTest {FurnDao furnDao = new FurnDaoImpl();@Testpublic void queryFurns(){List<Furn> furns = furnDao.queryFurns();if (furns != null) {//遍历输出for (Furn o : furns) {System.out.println(o);}} else {System.out.println("查询失败!");}}
}
10.编写FurnService
FurnService.java
package com.sxs.furns.service;import com.sxs.furns.entity.Furn;import java.util.List;/*** @author 孙显圣* @version 1.0*/
public interface FurnService {//1.查询所有家居信息public List<Furn> queryFurns();
}
11.FurnServiceImpl
FurnServiceImpl.java
package com.sxs.furns.service.impl;import com.sxs.furns.dao.FurnDao;
import com.sxs.furns.dao.impl.FurnDaoImpl;
import com.sxs.furns.entity.Furn;
import com.sxs.furns.service.FurnService;import java.util.List;/*** @author 孙显圣* @version 1.0*/
public class FurnServiceImpl implements FurnService {FurnDao furnDao = new FurnDaoImpl();/*** 返回所有家居信息* @return 成功返回所有信息,失败返回null*/@Overridepublic List<Furn> queryFurns() {return furnDao.queryFurns();}
}
12.单元测试
FurnServiceTest.java
package com.sxs.furns.test;import com.sxs.furns.entity.Furn;
import com.sxs.furns.service.FurnService;
import com.sxs.furns.service.impl.FurnServiceImpl;
import org.junit.Test;import java.util.List;/*** @author 孙显圣* @version 1.0*/
public class FurnServiceTest {FurnService furnService = new FurnServiceImpl();@Testpublic void queryFurns() {List<Furn> furns = furnService.queryFurns();if (furns != null) {//遍历输出for (Furn furn : furns) {System.out.println(furn);}} else {System.out.println("查询失败");}}
}
14.修改manage_menu.jsp
15.编写FurnServlet
FurnServlet.java
package com.sxs.furns.web;import com.sxs.furns.entity.Furn;
import com.sxs.furns.service.FurnService;
import com.sxs.furns.service.impl.FurnServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;/*** @author 孙显圣* @version 1.0*/
@WebServlet(urlPatterns = "/manage/furnServlet")
public class FurnServlet extends BasicServlet{FurnService furnService = new FurnServiceImpl();/*** 将家居信息发送给前端* @param req* @param resp*/public void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//取出家居数据List<Furn> furns = furnService.queryFurns();//请求转发到furn_manage.jspreq.setAttribute("furns", furns);req.getRequestDispatcher("/views/manage/furn_manage.jsp").forward(req, resp);}
}
16.修改furn_manage.jsp
17.结果展示
1.管理员登录成功
2.点击家居管理
这篇关于家居网购项目(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!