javaweb书城项目

项目github链接

一.开发环境介绍

1.IDEA 2017
2.jdk 8 以上
3.mysql 8.0
4.tomcat 3.9

二.部署介绍

1.创建数据库

使用create.sql文件
在dos下进入文件所在文件夹
在当前文件夹下进入mysql数据库
执行

source create.sql

就是将文件中创建数据库的sql语句执行

2.插入商品数据(图片在WebContent/bookCover文件夹下)

	格式如下:
	insert into products(id,name,category,price,pnum,imgurl) values("1","算法导论","计算机","25",100,"/bookcover/101.jpg");

3.使用IDEA打开文件

4.配置配置文件

	source.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/数据库名称?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false");
  	source.setUser("用户名");
  	source.setPassword("密码");

Uitls中的C3P0Utils的数据库密码和用户设为自己电脑上的数据库用户和密码。

5.配置IDEA的tomcat

(1)添加tomcat,结果如下
javaweb书城项目_第1张图片
(2)点击Edit Configurations
在这里插入图片描述

(3)配置热部署(在debug模式下,不用重新启动"更新"代码就更新显示,添加新类必须重启)
javaweb书城项目_第2张图片

(4)配置url(默认的不好用,访问时候写的太多)
javaweb书城项目_第3张图片

(5)配置class文件的存放路径,以及外部依赖的jar包路径
打开project structure
javaweb书城项目_第4张图片

配置classes,如图
javaweb书城项目_第5张图片

配置依赖jar包,两个文件夹中就行
javaweb书城项目_第6张图片

如果仍旧不能运行,就将这个文件夹中的每一个文件都 Add as library,这个是项目的依赖,上面的可以说是容器的依赖
在这里插入图片描述

6.运行或者debug

具体功能的实现

注册功能
1.建立模型
2.写dao层
使用c3p0
1.写配置文件
2.c3p0工具类
3.写servlet
4.servlet
RegisterServlet
5.jsp页面表单

激活功能
1.dao添加两个方法
通过激活码找到用户(邮箱)
quryRunner三个参数的方法
BeanHandler使用方法
通过激活码更新用户的状态
2. Service添加激活用户的业务方法
3.写激活的servlet

登陆
1.实现dao层
User findUserBynameAndPassword(String,String);
2.实现service
login(String,String)
3.实现servlet
loginServlet

自动登陆
1.写一个filter实现自动登陆

修改用户信息
1.显示信息
连接返回servlet
信息存入request
跳转到更新页面
2.修改信息
实现dao层
更新用户信息
实现service
抛出错误
实现servlet
修改成功,跳转到成功页面
修改失败,跳转到本页面打印错误信息

计时跳转
1.写个计时器windows.setInterval(hadler,time);
2.写个函数作为参数
3.函数中获取页面信息并且修改
4.跳转并且清除定时器

商品的分页显示
1.dao层添加两个方法
2.servlet层中方法
3.ResultSet类将信息显示在jsp页面上
4.搜索的jsp

添加图片显示
1.给数据库添加图片路径
2.更新jsp图片显示连接
3.注意/的问题,如果是相对路径:数据库中加,项目中不用加

显示商品的详细信息
1.ProductInfoServlet
2.通过Id查询商品
3.把商品存入request,通过jsp页面显示

实现购物车
1.实现订单dao
2.实现AddCartservlet
3.Map数目,书籍
4.如何判断你当前要买的书在购物车已经:存在equal方法重写
5.减少一项,使用removeAttribute可以解决Session中参数问题

数量的加减
1.监听加减号的世间
2.判断加减数量是否可以执行
3.如果可以,可以对session中的cart进行更新
changeNumServlet?id=2&num=2

结算功能
1.有没有登陆
2.登陆结算

支付功能
1.order表
2.orderItems表
3.修改库存
4.通过js提交表单,而不是通过servlet
5.order中加一个items那么怎么添加到数据库?

批量处理对书籍信息修改
1.对订单详情的修改
2.对书籍的修改
3.过程
建立一个二维数组params,其中的每一维就是一个item
建立一个sql语句不变
使用qr.batch(sql,params)

//如果service中0执行多条sql,不要忘记使用事务
创建订单需要加入事务
本地线程ThreadLocal
添加ManageThreadLocal方法
直接将多条sql封在事务中
开始事务start
结束事务commit
回滚事务rowback
dao层从连接池中获取连接getconnection
而ManageThread中的连接就是C3P0中的连接

查看订单信息
1.findOrder(uid)
2.dao
3.service

jsp实现时间的标准化

查看订单详情
dao findById找到订单->有订单详情->有产品
new ResultSetHandler(){
@Overide
T handle(ResultSet rs)throws SQLException{

	}
}
学会自己封装模型

支付功能
提交订单跳转到支付页面
修改支付状态

进行优化
直接使用一个userServlet
1.jsp传一个参数 action = ?
2.post中判断
if(action.equals"/login"){}
else if(action.equals “/logout”){}
else if(action.equals “register”){}
get方法调用post方法
3.之后从servlet中写方法
public void login(requset,response)throws IOException;

优化二
通过反射调用方法(不用自己判断了)
获取Class
Class class = this.getClass
通过Class获取方法
Messod messod = class.getMethod(名字,参数)
调用方法
messod.invoke(this,参数)

问题
1.映射的用法
BeanHandler使用方法
BeanListHandler
ScarlerHandler使用方法
*****使用这些保证了模式到内模式之间的独立性:就算Model错了,仍旧可以查找到结果,只不过是对应不上而已。
2.触发器的创建以及注意事项
Delima c r e a t e t r i g g e r b e f o r e i n s e r t o n t a b l e n a m e f o r e a c h r o w b e g i n e n d create trigger before insert on tablename for each row begin end createtriggerbeforeinsertontablenameforeachrowbeginend
delima ;
3.limit i,n i是下表,n是size
4.requst中的路径不需要加上request.getDis但是response中需要加上getContextPath
5.如果出现closing inbound before receiving peer’s close_notify错误只需要 url上加上useSSL=false即可。
6.每新写一个servlet都必须重新加载,因为update不是restart
7.map.containsKey默认的是比较地址,重写equals方法
equals方法三重判断:
1.如果对象一样返回true,
2.如果对象为空或者类不一样放回false,
3.否则就比较两个对象的某一个属性是否一样,一样返回true,否则返回false;
8.map使用entry进行遍历,jsp页面中也使用entry
9.response.setcharacterset()和setheader
{

	//这句话的意思,是让浏览器用utf8来解析返回的数据  
    response.setHeader("Content-type", "text/html;charset=UTF-8");  
    String data = "中国";  
    OutputStream ps = response.getOutputStream();  
    //这句话的意思,使得放入流的数据是utf8格式  
    ps.write(data.getBytes("UTF-8")); 
	
	
	**************************************************
	
	//这句话的意思,是让浏览器用utf8来解析返回的数据  
	response.setHeader("Content-type", "text/html;charset=UTF-8");  
	//这句话的意思,是告诉servlet用UTF-8转码,而不是用默认的ISO8859  
	response.setCharacterEncoding("UTF-8");  
	String data = "中国";  
	PrintWriter pw = response.getWriter();  
	pw.write(data);  

}
10.action也需要pageContent.request.text;
11.从servlet中抛出并没有终止,但是从普通的类中抛出就已经终止了
12.servlet只管和页面进行交互,service只写逻辑代码(判断参数是否正确,以及得到数据后的处理),dao只进行更改数据库.
13.session持久化的问题,implements之后会怎么样?
14.使用removeAttribute可以解决Session中参数问题

你可能感兴趣的:(后台)