书城练习
我学习Java基础的练习书城有所借鉴Javaweb是借鉴的。
对于书城的编写我采用的
系统环境是Eclipse neno+jdk1.8+tomcat8.5+mysal
1.包的划分
2.jar包
导入mysql驱动
导入c3p0
导入dbutils
导入beanutils
导入fileupload
导入javamail mail.jar
导入jstl jstl.jar standard.jar
3.页面采用的别人的(有一定改变)
4.后台模块
4.1用户模块
4.1.1用户注册
4.1.2代码
public class User {
private int id; // 用户编号
private String username; // 用户姓名
private String password; // 用户密码
private String gender; // 用户性别
private String email; // 用户邮箱
private String telephone; // 用户联系电话
private String introduce; // 用户介绍
private String activeCode; // 激活码
private String role; // 用户角色
private int state; // 用户状态
private Date registTime;// 注册时间
}
4.2激活邮件的发送
smtp与pop3
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议
SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本
POP3服务器则是遵循POP3协议的接收邮件服务器
SMTP是发送邮件协议
POP3是接收邮件协议
java如何发送邮件
java中需要使用 这个包来发送邮件
帐号准备【注册一个163邮箱,以后公司会有自己的邮件服务器,到时改公司公司的即可】
帐号:15989566325@163.com
密码: gyfitedu
发送邮件代码
package com.gyf.bookstore.utils;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendJMail {
public static boolean sendMail(String email, String emailMsg) {
String from = “15989566325@163.com”; // 邮件发送人的邮件地址
String to = email; // 邮件接收人的邮件地址
final String username = “15989566325@163.com”; //发件人的邮件帐户
final String password = “gyfitedu”; //发件人的邮件密码
//定义Properties对象,设置环境信息
Properties props = System.getProperties();
//设置邮件服务器的地址
props.setProperty("mail.smtp.host", "smtp.163.com"); // 指定的smtp服务器
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");//设置发送邮件使用的协议
//创建Session对象,session对象表示整个邮件的环境信息
Session session = Session.getInstance(props);
//设置输出调试信息
session.setDebug(true);
try {
//Message的实例对象表示一封电子邮件
MimeMessage message = new MimeMessage(session);
//设置发件人的地址
message.setFrom(new InternetAddress(from));
//设置主题
message.setSubject("用户激活");
//设置邮件的文本内容
//message.setText("Welcome to JavaMail World!");
message.setContent((emailMsg),"text/html;charset=utf-8");
//设置附件
//message.setDataHandler(dh);
//从session的环境中获取发送邮件的对象
Transport transport=session.getTransport();
//连接邮件服务器
transport.connect("smtp.163.com",25, username, password);
//设置收件人地址,并发送消息
transport.sendMessage(message,new Address[]{new InternetAddress(to)});
transport.close();
return true;
} catch (MessagingException e) {
e.printStackTrace();
return false;
}
}
}
在注册的service中,添加发送邮件功能
4.3 激活用户
ActiveServlet:激活的Servlet
UserService:添加激活用户方法
UserDao:添加2个方法
4.4 用户登录
UserDao.java
UserService.java
LoginServlet.java
4.5 权限管理
添加一个权限功能,登录成功后,如果是管理员,进行后台,如果是普通用户进入商品首页
LoginServlet.java
5.6 我的帐号
4.7 修改用户信息
显示用户信息
FindUserByIdServlet
UserService
UserDao
modifyuserinfo.jsp
<input type=“radio” name=“gender” value=“男” ${u.gender == “男” ? “checked=‘checked’” : ‘’} />男
<input type=“radio” name=“gender” value=“女” ${u.gender == “女” ? “checked=‘checked’” : ‘’}/> 女
修改用户信息
ModifyUserInfoServlet.java
UserService
UserDao
4.8用户退出
5.商品的数据建设
5.1数据库表创建(在开始就该创建的刚刚忘记了因为在用户代码时会对数据库的调用)
create database bookStore;
use bookStore;
#用户表
CREATE TABLE user
(
id
INT(11) AUTO_INCREMENT,
username
VARCHAR(20) ,
PASSWORD
VARCHAR(20) ,
gender
VARCHAR(10) ,
email
VARCHAR(50) ,
telephone
VARCHAR(20) ,
introduce
VARCHAR(100),
activeCode
VARCHAR(50) ,
state
INT(11) ,
role
VARCHAR(10) DEFAULT ‘普通用户’,
registTime
TIMESTAMP ,
PRIMARY KEY (id
)
);
#商品表
CREATE TABLE products
(
id
VARCHAR(100) ,
name
VARCHAR(40) ,
price
DOUBLE ,
category
VARCHAR(40) ,
pnum
INT(11) ,
imgurl
VARCHAR(100) ,
description
VARCHAR(255) ,
PRIMARY KEY (id
)
);
#订单表
CREATE TABLE orders
(
id
VARCHAR(100) ,
money
DOUBLE ,
receiverAddress
VARCHAR(255) ,
receiverName
VARCHAR(20) ,
receiverPhone
VARCHAR(20) ,
paystate
INT(11) ,
ordertime
TIMESTAMP ,
user_id
INT(11) ,
PRIMARY KEY (id
),
FOREIGN KEY (user_id
) REFERENCES user
(id
)
);
#订单详情表
CREATE TABLE orderitem
(
order_id
VARCHAR(100) ,
product_id
VARCHAR(100),
buynum
INT(11) ,
PRIMARY KEY (order_id
,product_id
),
FOREIGN KEY (order_id
) REFERENCES orders
(id
),
FOREIGN KEY (product_id
) REFERENCES products
(id
)
);
5.2初始化产品数据
INSERT INTO products (id,name,price,category,pnum,imgurl,description)
VALUES (1,‘JavaF’,168.88,‘计算机’,3,null,‘good book’);
INSERT INTO products (id,name,price,category,pnum,imgurl,description)
VALUES (2,‘HTML’,168.88,‘计算机’,3,null,‘good book’);
。。。。。。。。。
(添加数据库数据)
5.2.1添加产品模型
public class Product {
private int id;
private String name;//书名
private double price;//价格
private String category;//分类
private int pnum;//数量
private String imgurl;//图片
private String description;//描述
}
页面查询和分页代码Javaweb知识点
ProductDao
public class ProductDao{
//查询类别的总记录数
public long count(String category) throws SQLException{
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = “select count(*) from products where 1=1”;
long count = 0;
if(category != null && !"".equals(category)){
sql+= " and category = ?";
count = (long) qr.query(sql, new ScalarHandler(1), category);
}else{
count = (long) qr.query(sql, new ScalarHandler(1));
}
return count;
}
//分页查找数据
public List<Product> findBooks(int currentPage,int pageCount,String category) throws SQLException{
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
//定义参数
List<Object> prmts = new ArrayList<>();
//查询的sql语句
String sql = "select * from products where 1=1";
//条件
if(category!=null && !"".equals(category)){
sql += " and category = ?";
prmts.add(category);
}
//分页
sql += " limit ?,?";
int start = (currentPage - 1) * pageCount;
prmts.add(start);
prmts.add(pageCount);
return qr.query(sql, new BeanListHandler<Product>(Product.class), prmts.toArray());
}
}
ProductService
public class ProductService {
ProductDao productDao = new ProductDao();
public PageResult findPageBooks(int currentPage,int pageCount,String category){
try {
//1.创建PageResult
PageResult pr = new PageResult();
//2.获取总记录数
long totalCount = productDao.count(category);
//3.计算总页数
int totalPage = (int) Math.ceil(totalCount * 1.0 / pageCount) ;
//4.查询数据库
List<Product> list = productDao.findBooks(currentPage, pageCount, category);
//5.设置PageResult
pr.setCurrentPage(currentPage);//当前页
pr.setPageCount(pageCount);//每页显示记录数
pr.setTotalCount(totalCount);//总记录数
pr.setTotalPage(totalPage);//总页数
pr.setList(list);
return pr;
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
return null;
}
}
ShowProductByPageServlet
@WebServlet("/showProductByPage")
public class ShowProductByPageServlet extends HttpServlet{
ProductService productService = new ProductService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//获取参数
String category = request.getParameter("category");//分类
String page = request.getParameter("page");//显示页数
//2.判断
int currentPage = 1;
int pageCount = 4;//每页显示5条数据,这个内部定义,不让外面传参数
if(page != null){
currentPage = Integer.parseInt(page);
}
//3.调用service
PageResult<Product> pr = productService.findPageBooks(currentPage, pageCount, category);
//4.跳转
request.setAttribute("pr", pr);
request.setAttribute("category", category);
request.getRequestDispatcher("/product_list.jsp").forward(request, response);
}
}
PageResult
提供get/set方法
public class PageResult {
private List list;//集合
private long totalCount;//总记录数
private int totalPage;//总页数
private int currentPage;//当前页
private int pageCount = 5;//每页显示的条数