- Servlet+mysql实现的书城系统
- 实现功能截图
- 实现的功能
- 使用技术
- 代码
- 写在最后
本系统为书城系统,分为前后台,前台通过各类畅销书展示,用户可以购买图书、加入购物车结算,后台管理系统,可以进行图书录入上架、图书分类管理、订单管理等,一整套完整的图书电商系统。
实现功能截图前台:
登录
图书购买
提交订单
后台
首页
分类管理
订单管理
前台:
1、登录
2、图书分类展示
3、图书购买加入购物车
4、提交订单
5、结算
后台
1、订单管理
2、分类管理
3、图书上架
数据库:mysql
开发工具:Eclipse(Myeclispe、Idea也可以)
知识点:Servlet、Jsp
本系统采用将MVC的思想:将项目包分为pojo、dao/service/controller,代码结构清晰
代码dao
UserDao.java
package cn.itcast.goods.user.dao;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import cn.itcast.goods.user.domain.User;
import cn.itcast.jdbc.TxQueryRunner;
public class UserDao {
private QueryRunner qr = new TxQueryRunner();
public boolean findByUidAndPassword(String uid, String password) throws SQLException {
String sql = "select count(*) from t_user where uid=? and loginpass=?";
Number number = (Number)qr.query(sql, new ScalarHandler(), uid, password);
return number.intValue() > 0;
}
public void updatePassword(String uid, String password) throws SQLException {
String sql = "update t_user set loginpass=? where uid=?";
qr.update(sql, password, uid);
}
public User findByLoginnameAndLoginpass(String loginname, String loginpass) throws SQLException {
String sql = "select * from t_user where loginname=? and loginpass=?";
return qr.query(sql, new BeanHandler(User.class), loginname, loginpass);
}
public User findByCode(String code) throws SQLException {
String sql = "select * from t_user where activationCode=?";
return qr.query(sql, new BeanHandler(User.class), code);
}
public void updateStatus(String uid, boolean status) throws SQLException {
String sql = "update t_user set status=? where uid=?";
qr.update(sql, status, uid);
}
public boolean ajaxValidateLoginname(String loginname) throws SQLException {
String sql = "select count(1) from t_user where loginname=?";
Number number = (Number)qr.query(sql, new ScalarHandler(), loginname);
return number.intValue() == 0;
}
public boolean ajaxValidateEmail(String email) throws SQLException {
String sql = "select count(1) from t_user where email=?";
Number number = (Number)qr.query(sql, new ScalarHandler(), email);
return number.intValue() == 0;
}
public void add(User user) throws SQLException {
String sql = "insert into t_user values(?,?,?,?,?,?)";
Object[] params = {user.getUid(), user.getLoginname(), user.getLoginpass(),
user.getEmail(), user.isStatus(), user.getActivationCode()};
qr.update(sql, params);
}
}
AdminDao.java
package cn.itcast.goods.admin.admin.dao;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import cn.itcast.goods.admin.admin.domain.Admin;
import cn.itcast.jdbc.TxQueryRunner;
public class AdminDao {
private QueryRunner qr = new TxQueryRunner();
public Admin find(String adminname, String adminpwd) throws SQLException {
String sql = "select * from t_admin where adminname=? and adminpwd=?";
return qr.query(sql, new BeanHandler(Admin.class), adminname, adminpwd);
}
}
service
AdminService.java
package cn.itcast.goods.admin.admin.service;
import java.sql.SQLException;
import cn.itcast.goods.admin.admin.dao.AdminDao;
import cn.itcast.goods.admin.admin.domain.Admin;
public class AdminService {
private AdminDao adminDao = new AdminDao();
public Admin login(Admin admin) {
try {
return adminDao.find(admin.getAdminname(), admin.getAdminpwd());
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
UserService.java
package cn.itcast.goods.user.service;
import java.io.IOException;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import cn.itcast.commons.CommonUtils;
import cn.itcast.goods.user.dao.UserDao;
import cn.itcast.goods.user.domain.User;
import cn.itcast.goods.user.service.exception.UserException;
import cn.itcast.mail.Mail;
import cn.itcast.mail.MailUtils;
public class UserService {
private UserDao userDao = new UserDao();
public void updatePassword(String uid, String newPass, String oldPass) throws UserException {
try {
boolean bool = userDao.findByUidAndPassword(uid, oldPass);
if(!bool) {//如果老密码错误
throw new UserException("老密码错误!");
}
userDao.updatePassword(uid, newPass);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public User login(User user) {
try {
return userDao.findByLoginnameAndLoginpass(user.getLoginname(), user.getLoginpass());
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void activatioin(String code) throws UserException {
try {
User user = userDao.findByCode(code);
if(user == null) throw new UserException("无效的激活码!");
if(user.isStatus()) throw new UserException("您已经激活过了,不要二次激活!");
userDao.updateStatus(user.getUid(), true);//修改状态
} catch(SQLException e) {
throw new RuntimeException(e);
}
}
public boolean ajaxValidateLoginname(String loginname) {
try {
return userDao.ajaxValidateLoginname(loginname);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public boolean ajaxValidateEmail(String email) {
try {
return userDao.ajaxValidateEmail(email);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void regist(User user) {
user.setUid(CommonUtils.uuid());
user.setStatus(false);
user.setActivationCode(CommonUtils.uuid() + CommonUtils.uuid());
try {
userDao.add(user);
} catch (SQLException e) {
throw new RuntimeException(e);
}
Properties prop = new Properties();
try {
prop.load(this.getClass().getClassLoader().getResourceAsStream("email_template.properties"));
} catch (IOException e1) {
throw new RuntimeException(e1);
}
String host = prop.getProperty("host");//服务器主机名
String name = prop.getProperty("username");//登录名
String pass = prop.getProperty("password");//登录密码
Session session = MailUtils.createSession(host, name, pass);
String from = prop.getProperty("from");
String to = user.getEmail();
String subject = prop.getProperty("subject");
// MessageForm.format方法会把第一个参数中的{0},使用第二个参数来替换。
// 例如MessageFormat.format("你好{0}, 你{1}!", "张三", "去死吧"); 返回“你好张三,你去死吧!”
String content = MessageFormat.format(prop.getProperty("content"), user.getActivationCode());
Mail mail = new Mail(from, to, subject, content);
try {
MailUtils.send(session, mail);
} catch (MessagingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
servlet
UserServlet.java
package cn.itcast.goods.user.web.servlet;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import cn.itcast.commons.CommonUtils;
import cn.itcast.goods.user.domain.User;
import cn.itcast.goods.user.service.UserService;
import cn.itcast.goods.user.service.exception.UserException;
import cn.itcast.servlet.BaseServlet;
public class UserServlet extends BaseServlet {
private UserService userService = new UserService();
public String ajaxValidateLoginname(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String loginname = req.getParameter("loginname");
boolean b = userService.ajaxValidateLoginname(loginname);
resp.getWriter().print(b);
return null;
}
public String ajaxValidateEmail(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String email = req.getParameter("email");
boolean b = userService.ajaxValidateEmail(email);
resp.getWriter().print(b);
return null;
}
public String ajaxValidateVerifyCode(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String verifyCode = req.getParameter("verifyCode");
String vcode = (String) req.getSession().getAttribute("vCode");
boolean b = verifyCode.equalsIgnoreCase(vcode);
resp.getWriter().print(b);
return null;
}
public String regist(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
User formUser = CommonUtils.toBean(req.getParameterMap(), User.class);
Map errors = validateRegist(formUser, req.getSession());
if(errors.size() > 0) {
req.setAttribute("form", formUser);
req.setAttribute("errors", errors);
return "f:/jsps/user/regist.jsp";
}
userService.regist(formUser);
req.setAttribute("code", "success");
req.setAttribute("msg", "注册功能,请马上到邮箱激活!");
return "f:/jsps/msg.jsp";
}
private Map validateRegist(User formUser, HttpSession session) {
Map errors = new HashMap();
String loginname = formUser.getLoginname();
if(loginname == null || loginname.trim().isEmpty()) {
errors.put("loginname", "用户名不能为空!");
} else if(loginname.length() < 3 || loginname.length() > 20) {
errors.put("loginname", "用户名长度必须在3~20之间!");
} else if(!userService.ajaxValidateLoginname(loginname)) {
errors.put("loginname", "用户名已被注册!");
}
String loginpass = formUser.getLoginpass();
if(loginpass == null || loginpass.trim().isEmpty()) {
errors.put("loginpass", "密码不能为空!");
} else if(loginpass.length() < 3 || loginpass.length() > 20) {
errors.put("loginpass", "密码长度必须在3~20之间!");
}
String reloginpass = formUser.getReloginpass();
if(reloginpass == null || reloginpass.trim().isEmpty()) {
errors.put("reloginpass", "确认密码不能为空!");
} else if(!reloginpass.equals(loginpass)) {
errors.put("reloginpass", "两次输入不一致!");
}
String email = formUser.getEmail();
if(email == null || email.trim().isEmpty()) {
errors.put("email", "Email不能为空!");
} else if(!email.matches("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$")) {
errors.put("email", "Email格式错误!");
} else if(!userService.ajaxValidateEmail(email)) {
errors.put("email", "Email已被注册!");
}
String verifyCode = formUser.getVerifyCode();
String vcode = (String) session.getAttribute("vCode");
if(verifyCode == null || verifyCode.trim().isEmpty()) {
errors.put("verifyCode", "验证码不能为空!");
} else if(!verifyCode.equalsIgnoreCase(vcode)) {
errors.put("verifyCode", "验证码错误!");
}
return errors;
}
public String activation(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String code = req.getParameter("activationCode");
try {
userService.activatioin(code);
req.setAttribute("code", "success");//通知msg.jsp显示对号
req.setAttribute("msg", "恭喜,激活成功,请马上登录!");
} catch (UserException e) {
// 说明service抛出了异常
req.setAttribute("msg", e.getMessage());
req.setAttribute("code", "error");//通知msg.jsp显示X
}
return "f:/jsps/msg.jsp";
}
public String updatePassword(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
User formUser = CommonUtils.toBean(req.getParameterMap(), User.class);
User user = (User)req.getSession().getAttribute("sessionUser");
// 如果用户没有登录,返回到登录页面,显示错误信息
if(user == null) {
req.setAttribute("msg", "您还没有登录!");
return "f:/jsps/user/login.jsp";
}
try {
userService.updatePassword(user.getUid(), formUser.getNewpass(),
formUser.getLoginpass());
req.setAttribute("msg", "修改密码成功");
req.setAttribute("code", "success");
return "f:/jsps/msg.jsp";
} catch (UserException e) {
req.setAttribute("msg", e.getMessage());//保存异常信息到request
req.setAttribute("user", formUser);//为了回显
return "f:/jsps/user/pwd.jsp";
}
}
public String quit(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.getSession().invalidate();
return "r:/jsps/user/login.jsp";
}
public String login(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
User formUser = CommonUtils.toBean(req.getParameterMap(), User.class);
Map errors = validateLogin(formUser, req.getSession());
if(errors.size() > 0) {
req.setAttribute("form", formUser);
req.setAttribute("errors", errors);
return "f:/jsps/user/login.jsp";
}
User user = userService.login(formUser);
if(user == null) {
req.setAttribute("msg", "用户名或密码错误!");
req.setAttribute("user", formUser);
return "f:/jsps/user/login.jsp";
} else {
if(!user.isStatus()) {
req.setAttribute("msg", "您还没有激活!");
req.setAttribute("user", formUser);
return "f:/jsps/user/login.jsp";
} else {
// 保存用户到session
req.getSession().setAttribute("sessionUser", user);
// 获取用户名保存到cookie中
String loginname = user.getLoginname();
loginname = URLEncoder.encode(loginname, "utf-8");
Cookie cookie = new Cookie("loginname", loginname);
cookie.setMaxAge(60 * 60 * 24 * 10);//保存10天
resp.addCookie(cookie);
return "r:/index.jsp";//重定向到主页
}
}
}
private Map validateLogin(User formUser, HttpSession session) {
Map errors = new HashMap();
return errors;
}
}
CategoryServlet.java
package cn.itcast.goods.category.web.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.goods.category.domain.Category;
import cn.itcast.goods.category.service.CategoryService;
import cn.itcast.servlet.BaseServlet;
public class CategoryServlet extends BaseServlet {
private CategoryService categoryService = new CategoryService();
public String findAll(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
List parents = categoryService.findAll();
req.setAttribute("parents", parents);
return "f:/jsps/left.jsp";
}
}
写在最后
如果运行代码中遇到问题,或者需要完整源码和报告论文,可以加博主V交流:Code2Life2
觉得有用,别忘了一键三连哈!



