目录

一:概述

二:设计框架

三:实现步骤

第一阶段:表单验证

第二阶段:注册和登陆功能的实现

1、先创建书城需要的数据库和表(使用sqlyog)

2、编写数据库表中对应的javaBean对象——User类

3、编写工具类JDBCUtils并测试

4、编写 BaseDao和与负责数据库交互的Dao

5、编写Service层

6、编写web层(servlet)

第三阶段:编写jsp页面


一:概述

这是尚硅谷javaweb的开源实战项目

主界面:

登录界面:

注册界面:

购物车界面:

二:设计框架

该项目采用MVC三层架构,示意图如下:

① 视图展现层:接收用户请求,负责调用业务层。

②业务层:处理具体的事务逻辑,以及调用持久层的操作。

③持久层:负责与数据库交互,实现数据的增删改查操作。

代码布局如下:

javaweb工程的创建和tomcat服务器的部署详见我的另一篇博客

https://blog.csdn.net/m0_56522574/article/details/118719362

三:实现步骤

第一阶段:表单验证

验证用户名是否合法:5-12位,由数字,字母或下划线组成

验证密码是否合法:5-12位,由数字,字母或下划线组成

验证确认密码密码是否相同

验证电子邮件是否合法:

验证验证码是否非空:该阶段暂不用实现验证码的正确性判断

                //给注册按钮绑定单击事件$("#sub_btn").click(function (){//1.获取输入框用户名var usernameText=$("#username").val()var patt=/^\w{5,12}$/if (!patt.test(usernameText)){$("span.errorMsg").text("用户名不合法!")return false}//2.获取输入框密码var passwordText=$("#password").val()var passwordReText=$("#repwd").val()if (!patt.test(passwordText)){$("span.errorMsg").text("密码不合法!")return false}if(passwordReText!==passwordText){$("span.errorMsg").text("密码不一致!")return false}//3.确认邮箱var emailpatt=/^\w+@\w+.com$/var email=$("#email").val()if(!emailpatt.test(email)){$("span.errorMsg").text("邮箱不合法!")return false}//4.验证码var codetext=$("#code").val()if (codetext==null||codetext==""){$("span.errorMsg").text("验证码不能为空!")return false}//去除错误信息$("span.errorMsg").text()})

第二阶段:注册和登陆功能的实现

1、先创建书城需要的数据库和表(使用sqlyog)

2、编写数据库表中对应的javaBean对象——User类

package com.atguigu.pojo;public class User {private Integer id;private String username;private String password;private String email;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;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +'}';}public User() {}public User(Integer id, String username, String password, String email) {this.id = id;this.username = username;this.password = password;this.email = email;}
}

3、编写工具类JDBCUtils并测试

package com.atguigu.utils;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JdbcUtils {private static DruidDataSource dataSource;private static ThreadLocal<Connection> conns=new ThreadLocal<>();static {try {Properties properties=new Properties();//读取jdbc.properties属性配置文件InputStream resourceAsStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");//从流中加载数据properties.load(resourceAsStream);//创建数据库连接池dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}/*获取数据库连接池中的连接返回null说明获取失败*/public static Connection getConnection(){Connection conn=conns.get();if(conn==null){try {conn= dataSource.getConnection();conns.set(conn);//保存到threadLocal对象中,供后面JDBC操作使用conn.setAutoCommit(false);//手动提交} catch (SQLException throwables) {throwables.printStackTrace();}}return conn;}
//        Connection conn=null;
//        try {
//            conn=dataSource.getConnection();
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        }
//        return conn;
//    }/*关闭数据库连接,放回数据库连接池*/
//    public static void close(Connection conn){
//        if(conn!=null){
//            try {
//                conn.close();
//            } catch (SQLException throwables) {
//                throwables.printStackTrace();
//            }
//        }
//    }/*提交事务并关闭*/public static void commmitAndClose(){Connection conn=conns.get();if(conn!=null){try {conn.commit();} catch (SQLException throwables) {throwables.printStackTrace();}finally {try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}//一定要执行remove操作,否则就会出错,因为tomcat服务器底层用了线程池技术conns.remove();}/*回滚事务并关闭*/public static void rollbackAndClose(){Connection conn=conns.get();if(conn!=null){try {conn.rollback();} catch (SQLException throwables) {throwables.printStackTrace();}finally {try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}//一定要执行remove操作,否则就会出错,因为tomcat服务器底层用了线程池技术conns.remove();}
}

4、编写 BaseDao和与负责数据库交互的Dao

BaseDao类

package com.atguigu.dao.impl;import com.atguigu.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;public abstract class BaseDao {//使用DbUtils操作数据库private QueryRunner queryRunner=new QueryRunner();/*update()用来执行Insert/update/delete语句返回-1说明执行失败返回其他表示影响的行数*/public int update(String sql,Object ...args){Connection conn= JdbcUtils.getConnection();try {return queryRunner.update(conn,sql,args);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException();}}/*查询返回一个javabean的sql语句*/public <T> T queryForOne(Class<T> type,String sql,Object ...args){Connection conn=JdbcUtils.getConnection();try {return queryRunner.query(conn,sql,new BeanHandler<T>(type),args);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException();}}/*查询返回多个javabean的sql语句*/public <T>List<T> queryForList(Class<T> type,String sql,Object ...args){Connection conn=JdbcUtils.getConnection();try {//只有此处不同return queryRunner.query(conn,sql,new BeanListHandler<T>(type),args);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException();}}/*单个查询*/public Object queryForSingleValue(String sql,Object...args){Connection conn=JdbcUtils.getConnection();try {return queryRunner.query(conn,sql,new ScalarHandler(),args);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException();}}
}

UserDaoImpl类,继承了BaseDao实现了UserDao类

package com.atguigu.dao.impl;import com.atguigu.dao.UserDao;
import com.atguigu.pojo.User;public class UserDaoImpl extends BaseDao implements UserDao {@Overridepublic User queryUserByUsername(String username) {String sql="select `id`,`username`,`password`,`email` from t_user where username=?";return queryForOne(User.class,sql,username);}@Overridepublic User queryUserByUsernameAndPassword(String username, String password) {String sql="select `id`,`username`,`password`,`email` from t_user where username=? and password=?";return queryForOne(User.class,sql,username,password);}@Overridepublic int saveUser(User user) {String sql="insert into t_user(`username`,`password`,`email`) values(?,?,?)";return update(sql,user.getUsername(),user.getPassword(),user.getEmail());}
}

5、编写Service层

package com.atguigu.service;import com.atguigu.pojo.User;public interface UserService {/*注册用户*/public void registUser(User user);/*用户登陆*/public User login(User user);/*检查用户名是否可用返回false--用户名不存在说明可用true--用户名存在说明该用户名不可用*/public boolean existsUsername(String username);
}

具体实现类UserServiceImpl

package com.atguigu.dao.impl;import com.atguigu.dao.UserDao;
import com.atguigu.pojo.User;public class UserDaoImpl extends BaseDao implements UserDao {@Overridepublic User queryUserByUsername(String username) {String sql="select `id`,`username`,`password`,`email` from t_user where username=?";return queryForOne(User.class,sql,username);}@Overridepublic User queryUserByUsernameAndPassword(String username, String password) {String sql="select `id`,`username`,`password`,`email` from t_user where username=? and password=?";return queryForOne(User.class,sql,username,password);}@Overridepublic int saveUser(User user) {String sql="insert into t_user(`username`,`password`,`email`) values(?,?,?)";return update(sql,user.getUsername(),user.getPassword(),user.getEmail());}
}

6、编写web层(servlet)

package com.atguigu.web;import com.atguigu.service.UserService;
import com.atguigu.service.impl.UserServiceImpl;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.Method;public abstract class BaseServlet extends HttpServlet {private UserService userService=new UserServiceImpl();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决相应的中文问题req.setCharacterEncoding("UTF-8");resp.setContentType("text/html; charset=UTF-8");String action = req.getParameter("action");try {Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);method.invoke(this,req,resp);} catch (Exception e) {e.printStackTrace();throw new RuntimeException();//吧异常抛给Filter过滤器}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}
}

UserServet类:用于实现用户登录,用户注册等功能

package com.atguigu.web;import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import com.atguigu.service.impl.UserServiceImpl;
import com.atguigu.utils.WebUtils;
import com.google.gson.Gson;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY;public class UserServlet extends BaseServlet {private UserService userService=new UserServiceImpl();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String action = req.getParameter("action");try {Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);method.invoke(this,req,resp);} catch (Exception e) {e.printStackTrace();}}protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username=req.getParameter("username");String password=req.getParameter("password");User login = userService.login(new User(null, username, password, null));if(login!=null){//System.out.println("登陆成功!");req.getSession().setAttribute("user",login);req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);}else{//System.out.println("用户名或密码错误!");//把错误信息,和回显的表单项信息,保存到Request域中req.setAttribute("msg","用户名或密码错误!");req.setAttribute("username",username);req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);}}protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取Session中的验证码String token =(String)req.getSession().getAttribute(KAPTCHA_SESSION_KEY);//删除Session中的验证码req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);//1.获取请求的参数。比如用户名密码邮箱验证码等String username = req.getParameter("username");String password = req.getParameter("password");String email = req.getParameter("email");String code = req.getParameter("code");User user= WebUtils.copyParamToBean(req.getParameterMap(),new User());//2.检查验证码是否正确if(token!=null&&token.equalsIgnoreCase(code)){//  正确 3检查用户名是否可用if(userService.existsUsername(username)){//不可用 跳转到注册页面//System.out.println("用户名"+username+"已存在!");req.setAttribute("msg","用户名已存在");req.setAttribute("username",username);req.setAttribute("email",email);req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);}else{//可用  调用Service保存到数据库,跳转到登陆成功页面userService.registUser(user);req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req,resp);}}else{//  不正确  跳回注册页面req.setAttribute("msg","验证码错误!");req.setAttribute("username",username);req.setAttribute("email",email);//System.out.println("验证码["+code+"]错误");req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);}}/*注销用户*/protected void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.销毁Session中的用户登陆信息//2.重定向到首页req.getSession().invalidate();resp.sendRedirect(req.getContextPath());}/**/protected void ajaxExistsUsername(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求的参数usernameString username = req.getParameter("username");//调用userservice.existsUsername();boolean existsUsername = userService.existsUsername(username);//把返回的结果封装成map对象Map<String,Object> resultMap=new HashMap<>();resultMap.put("existsUsername",existsUsername);Gson gson = new Gson();String json = gson.toJson(resultMap);resp.getWriter().write(json);}
}

第三阶段:编写jsp页面

1.将网页中公共的部分,如页脚,log,css等公共部分进行提取为head.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String basepath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";pageContext.setAttribute("basepath",basepath);
%>
<!--写base标签固定跳转路径-->
<base href="<%=basepath%>">
<link type="text/css" rel="stylesheet" href="static/css/style.css" >
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>

2.将每个.jsp都静态包含head.jsp

 <%--静态包含base标签,css样式,jquery文件--%><%@include file="/pages/common/head.jsp"%>

3.将项目中所有的html改写为jsp文件

Javaweb尚硅谷网上书城项目相关推荐

  1. 尚硅谷·网上书城项目(一)

    网上书城·尚硅谷 一.项目概述 尚硅谷讲师佟刚的Servlet\Jsp实战项目. 二.功能分析 项目拥有上图所示功能: 1.界面的显示(JSP+EL+JSTL) 2.价格区间查询以及分页(原生态Aja ...

  2. 尚硅谷网上书城项目概要

    1.项目简介 书城项目采用MVC设计模式,软件三层架构. ①表现层:接受用户的请求,调用业务逻辑层处理用户请求,显示处理结果.对应着View视图(jsp)与Controller控制器(servlet实 ...

  3. 尚硅谷 网上书城 代码 Book

    首页 注册页面 登录页面 登录 登入成功 我的订单页面 主页面 购物车页面 可以跑通项目源码 链接:https://pan.baidu.com/s/1NpjK1NI0xAQo_Xqep0g5xw 提取 ...

  4. JavaWeb网上书城项目总结(初步1.0)

    JavaWeb网上书城项目总结 目录 项目背景与目标 成员组成 模块划分 数据库设计 功能分析+源码 经验总结 (逐步放上博客,先总结) 成员组成 组长:林俊豪(本人) 组员:温尧皓.麦乙迪.邓梓鹏. ...

  5. java web网上书城_javaweb网上书城项目

    [实例简介] javaweb网上书城项目,采用ssh框架,mysql数据库. [实例截图] [核心代码] bookstore └── ssh_book ├── WebContent │   ├── M ...

  6. 【Java - 项目开发】网上书城项目

    网上书城项目 创作日期:2021-12-23 第一阶段 登录注册的验证(表单验证) 技术方法: 使用 jQuery 技术对登录中的用户名.密码进行非空验证 使用 jQuery 技术和正则表达式对注册中 ...

  7. 网上书城java负责_网上书城项目总结(servlet_jsp+javaBean)

    网上书城项目总结 1 项目大纲设计: 需求分析 系统设计 详细设计 权限设计 2 技术选型: Servlet+jsp+javaBean Listener+Filter+jstl+fileupload+ ...

  8. 网上书城项目的需求分析、数据库表设计及前端界面的编写(项目进度一)

    转载请标明出处:https://blog.csdn.net/men_ma/article/details/106847165. 本文出自 不怕报错 就怕不报错的小猿猿 的博客 网上书城项目的需求分析. ...

  9. 尚硅谷大数据项目之电商数仓(4即席查询数据仓库)

    尚硅谷大数据项目之电商数仓(即席查询) (作者:尚硅谷大数据研发部) 版本:V4.0 第1章 Presto 1.1 Presto简介 1.1.1 Presto概念 1.1.2 Presto架构 1.1 ...

  10. 网上书城项目的书籍分类列表展示及新书上架和热销书籍效果展示功能(项目进度四)

    网上书城项目的书籍分类列表展示及新书上架和热销书籍效果展示功能(项目进度四) 前言 需实现的目标(效果图) 书籍分类展示 新书上架展示 热销书籍展示 1.书籍分类展示(实现动态加载数据) 1.1 加载 ...

最新文章

  1. SAP S4HANA如何取到采购订单ITEM里的'条件'选项卡里的条件类型值?
  2. Android Service使用方法--简单音乐播放实例
  3. Linux进程和计划任务管理
  4. Spring Boot JPA 中transaction的使用
  5. JDK源码(13)-Throwable
  6. OpenShift ocp packages
  7. 谷歌要构建自己的区块链技术
  8. P-Associated-URI
  9. 极客大学产品经理训练营:数据分析 第16课总结
  10. python制作密码字典_Python实现生成密码字典的方法示例
  11. ANDROID框架揭秘pdf
  12. Jquery 中 ajaxSubmit使用笔记
  13. 卷积码原理及基本概念
  14. 逐浪海棠居刻本字-第一款基于unicode13标准构建的中文字库全面发布
  15. 紧急通知!限招100人:免费培训海外抖音TikTok视频搬运赚钱技能,0基础轻松月入2万+!...
  16. 宝塔 域名指向ip 反向代理
  17. 2003系统服务器设置,服务器2003系统设置
  18. PS中的文字叠加纹理
  19. 微信小程序清除Webview缓存
  20. 如何在 MySQL / MariaDB 中导入导出数据,导入导出数据库文件、Excel、CSV

热门文章

  1. java 加密\解密工具类
  2. PLC软件申请软件著作权登记指南(新申请)
  3. 抖音去水印最新php方法代码
  4. 100套Java实战项目,附带源码+视频教程,全部免费,打包带走
  5. 验证码生成工具google authenticator
  6. 修改箱线图的横坐标顺序
  7. 4G智能模组SIM7600CE兼容移远EC20
  8. 心通达信创突破,即时通讯平台兼容多款国产芯片
  9. 优秀课件笔记——财政学1
  10. Cadence PSpice 模型2:描点法创建肖特基二极管的PSpice模型图文教程