第一阶段 表单验证

  1. 新建一个模块

  1. 把书城的静态资源拷贝到工程下

验证用户名里输入的内容

  1. 获取输入框内容

  1. 创建正则表达式对象

  1. 使用test验证

  1. 提示用户结果

第二阶段——用户注册和登录

JavaEE项目的三层架构

web层 com.tjq(我的名字缩写qwq).web/servlet/controller

service层 com.tjq.serivce service接口包类

com.tjq.service.impl service接口实现类

dao持久层 dao Dao接口包

dao.impl Dao接口实现类

实体Bean对象 com.tjq.pojo/entity/domain/bean JavaBean类

测试包 com.tjq.test.junit

工具类 com.tjq.utils

  1. 创建数据库和t_user表

CREATE TABLE t_user(

`id` int PRIMARY KEY auto_increment,

`username` VARCHAR(10) NOT NULL UNIQUE,

`password` VARCHAR(32) NOT NULL,

`email` VARCHAR(200)

);

INSERT INTO t_user (`username`,`password`,`email`) VALUES ('admin','admin','admin@tjq.com');

SELECT * FROM t_user

  1. 创建数据库对应的user类

  1. 编写Dao持久层

  1. 编写BaseDao

  1. 编写UserDao

  1. 编写UserService和测试

需求1:用户注册

需求如下:

  1. 访问注册页面

  1. 填写注册信息,提交给服务器

  1. 服务器应该保存用户

  1. 当用户已经存在-提示用户注册失败,用户已存在

  1. 当用户不存在时,注册成功

web阶段使用:base+相对

框架之后:绝对路径

需求2:用户登录

第三阶段

a)页面JSP动态化

b)抽取页面中相同内容

动态base值

在Servlet中setAttribute,然后在jsp中<%=%>

BaseServlet的抽取

在实际的项目开发中,一个模块,一般只使用一个Servlet程序

代码优化:

优化一:合并LoginServlet和RegistServlet

优化二:使用反射优化大量else if

String action = request.getParameter("action");

System.out.println(action);

try {

Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);

method.invoke(this, request, response);

} catch (Exception e) {

e.printStackTrace();

}

优化三:抽取BaseServlet程序

数据的抽取和BeanUtils的使用

BeanUtils工具类,可以一次性的把所有请求的参数注入到JavaBean中

BeanUtils不是官方类,第三方,需要导包

1、导入需要的包

commons-beanutils-1.8.0.jar

commons-logging-1.1.1.jar

2、使用BeanUtils类方法注入

底层:注入的核心是User类的写方法set,通过反射赋值,所以名称必须相同

把Map中的值注入到对应的JavaBean属性中,适用性更强使用更加灵活

第四阶段

EL表达式错误回显

第五阶段

MVC概念

MVC全称:Model 模型、View 视图、Controller 控制器

MVC最早出现在JavaEE三层中的Web层,他可以有效知道Web层的代码如何进行有效分离,单独工作

View视图:只负责数据和界面的显示

Controller控制器:只负责接受请求

Model模型

MVC是一种思想

1.图书模块

  1. 编写图书模块的数据库表

  1. 编写图书模块的JavaBean

  1. 编写图书模块的Dao和测试Dao

  1. 编写图书模块的Service和测试Service

  1. 编写图书模块的Web层和页面联调测试

图书列表功能实现

点击——访问BookServlet(地址/manager/bookServlet?action=list)

设置Attribute把queryBooks传过去,重定向页面

protected void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

List<Book> books = bookDao.queryBooks();

request.setAttribute("books", books);

request.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(request, response);

}

<c:forEach items="${requestScope.books}" var="book">

<tr>

<td>${book.name}</td>

<td>${book.price}</td>

<td>${book.author}</td>

<td>${book.sales}</td>

<td>${book.stock}</td>

<td><a href="pages/manager/book_edit.jsp">修改</a></td>

<td><a href="#">删除</a></td>

</tr>

</c:forEach>

前后台的简单介绍

添加图书功能实现

重点:request.getParameter()名字要和html里面的name一样,因为原理

bug:表单重复提交

所以不能用请求转发:getRequestDispatcher

用重定向:response.sendRedirect

删除图书功能实现
修改图书

图书分页

Page类:

pageNo 当前页码

pageTotal 总页码

pageTotalCount 总记录数

pageSize 每页显示数量

items 当前页数据

pageNo 当前页码是由客户端进行传递

pageSize 每页显示数量由两种因素决定

一、客户端进行传递

二、由页面布局决定

pageTotalCount 总记录数可以由sql语句求得

pageTotal 总页码可以由总记录数/每页数量得到

注:总记录数%每页数量>0,则 总页码+1

items 是当前页数据,也是可以由sql语句求得

sql语句是:select * form 表名 limit begin, pageSize

begin 可以由公式求得:(pageNo-1)*pageSize

结构图

显示五个连续的页码,当前页码在中间

情况一:总页码小于等于5

情况二:总页码大于5

小情况1:当前页码为前三个:1,2,3的情况,页码范围是 :1-5

小情况2:当前页码为最后三个,页码范围:总页码减4-总页码

小情况3:4,5,6,7,页码范围减2-当前页码加2

注意事项
  1. 数据有效边境检查

  1. 修改,添加图书后能直接跳到所操作的图书的当前页,这里直接用的是pageNo,并在add和update里面改跳转地址

前台分页的初步实现

准备一个pages下的client目录,复制index.jsp到client目录下

web下的index只干请求转发

分页条的抽取(优化重点)

跟common里的一样

价格区间搜索并分页

查询价格回显

判断req.getParameter min是不是null,StringBuffer添加参数,避免回显默认值

第六阶段

1.显示登录的用户信息

<c:if test="${empty sessionScope.user}">

<a href="pages/user/login.jsp">登录</a> |

<a href="pages/user/regist.jsp">注册</a>

</c:if>

<c:if test="${not empty sessionScope.user}">

<span>欢迎<span class="um_span">${sessionScope.user}</span>光临尚硅谷书城</span>

<a href="pages/order/order.jsp">我的订单</a>

<a href="index.jsp">注销</a>

</c:if>

2.登出——注销用户

  1. 销毁Session中用户登录的信息(或者销毁Session)

  1. 重定向到首页

3.表单重复提交之——验证码

表单重复提交有三种常见的情况:

一、提交完表单,服务器使用请求转发来进行页面跳转。这个时候,用户按下f5,就会发起最后一次请求,造成表单重复提交问题。解决方法:使用重定向来进行跳转

二、用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败,就会着急,然后多点了几次提交操作,也会造成表单重复提交

三、用户正常提交服务器,服务器也没有延迟,但是提交完成后,用户回退浏览器,重新提交。也会造成表单重复提交。

验证码底层原理

4.谷歌kaptcha图片验证码的使用

  1. 导入谷歌验证码的jar包

  1. 在web.xml中去配置用于验证码的Servlet程序

  1. 在表单中使用img标签显示验证码并使用它

用户名:<input type="text" name="username"><br>

密码:<input type="password" name="password"><br>

<img src="http://localhost:8080/temp/kaptcha.jpg" alt="" style="width: 100px;height: 28px"><br>

<input type="submit" value="登录">

  1. 在服务器获取谷歌生成的验证码和客户端发送来的验证码比较

5.验证码的切换

给img标签绑定一个单机事件,this.src后面加上一个时间戳来保证每次点击发送的请求不一样。(原理,浏览器缓存)

6.购物车

6.1 购物车模块的分析

6.2 添加商品到购物车

如何解决在第二页添加购物车返回的却是第一页的问题:

使用请求头中的Referer,可以把地址栏中的地址发送到服务器,进而实现跳转到原来的页面

6.3 购物车的展示

使用的jsp中的循环语句

<c:forEach items="${sessionScope.cart.items}" var="entry">

<tr>

<td>${entry.value.name}</td>

<td>${entry.value.count}</td>

<td>${entry.value.price}</td>

<td>${entry.value.totalPrice}</td>

<td><a href="#">删除</a></td>

</tr>

</c:forEach>

6.4修改购物车商品数量

使用js

$(".updateCount").change(function () {

//给输入框绑定失去焦点事件

var name = $(this).parent().parent().find("td:first").text();

var count = this.value;

var id = $(this).attr("bookId");

if (confirm("你确定要将【" + name + "】的数量修改为:" + count + "吗?")) {

location.href = "http://localhost:8080/book/cartServlet?action=updateCount&count=" + count + "&id=" + id;

} else {

this.value = this.defaultValue;

}

});

7.订单

7.1 订单模块的分析

订单功能:

  1. 生成订单

  1. 查询所有订单(管理员)

  1. 发货(管理员)

  1. 查看订单详情(管理员/用户)

  1. 查看我的订单(用户)

  1. 签收订单(用户)

7.2 订单模块

第八阶段

1.使用Filter过滤器拦截/pages/manager所有内容,实现权限检查

<filter>

<filter-name>ManagerFilter</filter-name>

<filter-class>com.tjq.filter.ManagerFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>ManagerFilter</filter-name>

<url-pattern>/pages/manager/*</url-pattern>

<url-pattern>/manager/bookServlet</url-pattern>

</filter-mapping>

2.ThreadLocald的使用

ThreadLocal的作用,可以解决多线程的数据安全问题

ThreadLocal它可以给当前线程关联一个数据(可以是普通变量,可以是对象,也可以是数组,集合)

ThreadLocal的特点:

  1. ThreadLocal可以为当前线程关联一个数据(它可以像Map一样存取数据,key为当前线程)

  1. 每一个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLocal对象实例

  1. 每个ThreadLoca对象实例定义的时候,一般都是static类型

  1. ThreadLocal中保存数据,在线程销毁后。会由JVM虚拟机自动释放。

2.使用Filter和ThreadLocal组合管理事务

3.使用Filter过滤器统一给所有的Service方法都加上try-catch。来实现统一的事务管理

第九模块

通过ajax验证用户名可用不可用

http://localhost:8080/book/userServlet?action=ajaxExistsUsername&username=tjq

http://localhost:8080/book/userSerlvet?action=ajaxExistsUsername&username=tjq

Javaweb-书城项目相关推荐

  1. JavaWeb书城项目(一)

    书城项目(一) 1.表单验证的实现 代码 2.用户注册和登陆 JavaEE 项目的三层架构 2.1.数据库层 2.1.1.创建数据库 2.1.2.定义 JavaBean 类 2.1.3.编写工具类 J ...

  2. JavaWeb书城项目

    尚硅谷书城项目:自己整理的笔记以及全部实现过程,原理. 链接: 点击获取资源 提取码: ih2c 再次感谢尚硅谷,我爱尚硅谷!!!! 目录 第一阶段:对注册页面的信息进行验证: 第二阶段:用户管理模块 ...

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

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

  4. JAVAWEB之小说书城项目

    一,项目目的 1.熟悉网站开发的基本流程. 2.将以学习的知识进行复习总结. 3,明确自身知识薄弱区. 二,项目内容 使用所学习对jsp,HTML,Mysql,css等知识制作一个小型的网页,初步实现 ...

  5. JavaWeb 尚硅谷书城项目

    书城项目第一阶段:表单验证 需求:         验证用户名:必须由字母,数字下划线组成,并且长度为 5 到 12 位         验证密码:必须由字母,数字下划线组成,并且长度为 5 到 12 ...

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

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

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

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

  8. Java项目:网上电子书城项目(java+SSM+JSP+maven+Mysql)

    源码获取:博客首页 "资源" 里下载! 项目描述: spring mvc +jsp实现的简单书城项目,可以在支付宝沙箱内实现支付 运行环境: jdk8+tomcat9+mysql+ ...

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

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

  10. JavaWeb完整项目要用到的专业技能

    完成JavaWeb项目用到哪些专业技能?在经典的JavaWeb的开发模式中,我们使用Jsp技术来作为展现层的实现,其实也就是所谓的前端.Web开发中经典的MVC模式,Model-View-Contro ...

最新文章

  1. python大神-国内某Python大神自创完整版,系统性学习Python
  2. 因xhost命令和DISPLAY环境变量操作不当导致无法启动Oracle图形化安装界面
  3. tensorflow saver_TensorFlow: Model Persistence
  4. mysql 重启io线程_MySQL IO线程及相关参数调优
  5. 温州大学《深度学习》课程课件(七、卷积神经网络基础)
  6. ACL 2019开源论文 | 句对匹配任务中的样本选择偏差与去偏方法
  7. python office库使用_看完这篇Python操作PPT总结,从此使用Python玩转Office全家桶就没有压力了!...
  8. linux内核调试器ftrace使用
  9. java 上下文缓存_记一次JAVA 线上故障排查完整套路。
  10. JAXB XML和Bean互相转换
  11. java 内部邮件_java – 来自内部存储的电子邮件
  12. 3dmax2014卸载/安装失败/如何彻底卸载清除干净3dmax2014注册表和文件的方法
  13. 【C语言】操作符详解
  14. 02-Sentinel-2 L1C级数据bat和Python脚本批量大气校正
  15. 西湖,半含春雨半垂丝
  16. 百分比收益率和对数收益率
  17. RT-Thread柿饼控件(1)-- AnimatedImage
  18. plotly绘制简单图形5--饼形图附加
  19. P2P UDP NAT 原理 穿透
  20. 思科模拟器之虚拟局域网

热门文章

  1. 10大Python库必须了解
  2. 在筛选试管受精胚胎方面_AI(人工智能)比胚胎学家更靠谱
  3. Excel实战:高级分列日期和星期,并对日期编号
  4. 星外php mysql_PHP环境自动安装|星外PHP一键安装包下载 v5.0 For IIS_最火软件站
  5. 3A认证系统 环境搭建,freeradius + mysql + daloradius 时间:2018.2.2
  6. 暗备用的运行状态_何为热备用、冷备用、明备用和暗备用
  7. 初创公司参与美军AI项目遇黑客 前员工爆料军事技术或遭泄漏
  8. mc官方认证服务器_有关MC *认证的更多信息*
  9. 信用证操作流程实务指南
  10. 我埋头吭哧吭哧写文这一年半