文章目录
一、Servlet小例:
1.整个web运行流程图:
创建实体项目:
2.在数据库中创建表:Hero
并加入数据
3. Hero.java
package bean;
public class Hero {
public int id;
public String name;
public float hp;
public int damage;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getHp() {
return hp;
}
public void setHp(float hp) {
this.hp = hp;
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
4.HeroDAO.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import bean.Hero;
public class HeroDAO {
public HeroDAO() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root",
"admin");
}
public int getTotal() {//统计产品数量
int total = 0;
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "select count(*) from hero";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
total = rs.getInt(1);
}
System.out.println("total:" + total);
} catch (SQLException e) {
e.printStackTrace();
}
return total;
}
public void add(Hero hero) {//新增产品
String sql = "insert into hero values(null,?,?,?)";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, hero.name);
ps.setFloat(2, hero.hp);
ps.setInt(3, hero.damage);
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
int id = rs.getInt(1);
hero.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public void update(Hero hero) {
String sql = "update hero set name= ?, hp = ? , damage = ? where id = ?";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, hero.name);
ps.setFloat(2, hero.hp);
ps.setInt(3, hero.damage);
ps.setInt(4, hero.id);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void delete(int id) {
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "delete from hero where id = " + id;
s.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public Hero get(int id) {//根据id 获取整个产品的信息
Hero hero = null;
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "select * from hero where id = " + id;
ResultSet rs = s.executeQuery(sql);
if (rs.next()) {
hero = new Hero();
String name = rs.getString(2);
float hp = rs.getFloat("hp");
int damage = rs.getInt(4);
hero.name = name;
hero.hp = hp;
hero.damage = damage;
hero.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
return hero;
}
public List<Hero> list() {//获取所有商品的信息
return list(0, Short.MAX_VALUE);
}
public List<Hero> list(int start, int count) {
List<Hero> heros = new ArrayList<Hero>();
String sql = "select * from hero order by id desc limit ?,? ";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setInt(1, start);
ps.setInt(2, count);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Hero hero = new Hero();
int id = rs.getInt(1);
String name = rs.getString(2);
float hp = rs.getFloat("hp");
int damage = rs.getInt(4);
hero.id = id;
hero.name = name;
hero.hp = hp;
hero.damage = damage;
heros.add(hero);
}
} catch (SQLException e) {
e.printStackTrace();
}
return heros;
}
}
5.HeroListServlet.java
package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Hero;
import dao.HeroDAO;
public class HeroListServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
List<Hero> heros = new HeroDAO().list();
StringBuffer sb = new StringBuffer();
sb.append("<table align='center' border='1' cellspacing='0'>\r\n");
sb.append("<tr><td>id</td><td>name</td><td>hp</td><td>damage</td></tr>\r\n");
String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td></tr>\r\n";
for (Hero hero : heros) {
String tr = String.format(trFormat, hero.getId(), hero.getName(), hero.getHp(), hero.getDamage());
sb.append(tr);
}
sb.append("</table>");
response.getWriter().write(sb.toString());
}
}
6.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>HeroListServlet</servlet-name>
<servlet-class>servlet.HeroListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HeroListServlet</servlet-name>
<url-pattern>/listHero</url-pattern>
</servlet-mapping>
</web-app>
接下来就是在eclipse中配置Tomcat并启动,这个需要好几个步骤完成。
首先右键项目 -> Run As -> Run on Server
按finish
接下就可以 访问了
二、模仿购物网站小例:
一、过程图:
二、表与表关系
首先各个类的意义:
Product: 产品表
User :用户表
Order :订单表
OrderItem: 订单项表
1. 产品和订单项的关系是 一对多
一种产品,对应多条订单项。
一条订单项,对应一种产品
2. 订单项和订单的关系 多对一
一个订单里有多条订单项
一个订单项,只会出现在一个订单里
3. 订单和用户的关系: 多对一
一个订单,只能属于一个用户
一个用户,可以下多个订单
三、数据库和数据库表创建
创建数据库:cart
create database cart;
按理来说,一般创建表都要设置外键约束等,但这里没有,只是逻辑联系而已
数据库表没建约束的坏处就是,数据更改没有联系
1.创建product表
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`price` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据
use cart
insert into product values(1,'黑色钢笔',500);
insert into product values(2,'苹果手机',2500);
insert into product values(3,'帆布鞋',180);
insert into product values(4,'蜡烛',0.20);
2.创建用户表:user
create table user(
id int,
name varchar(50),
password varchar(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据
user cart;
insert into user values(1,'tom','123');
3.创建订单表:order_
create table order_(
id int AUTO_INCREMENT,
uid int,
primary key(id)
);
4.创建订单项表:orderitem
create table orderitem(
id int AUTO_INCREMENT,
pid int,
num int,
oid int,
primary key(id)
);
四、产品模块
1.Product.java
package bean;
public class Product {
private int id;
private String name;
private float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
2.ProductDAO.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import bean.Product;
public class ProductDAO {
public static void main(String[] args) {
System.out.println(new ProductDAO().getProduct(1).getName());
}
public Product getProduct(int id) {//获取单个产品的信息
Product result = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8",
"root", "admin");
String sql = "select * from product where id = ?";
PreparedStatement ps = c.prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
result = new Product();
result.setId(id);
String name = rs.getString(2);
float price = rs.getFloat(3);
result.setName(name);
result.setPrice(price);
}
ps.close();
c.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public List<Product> ListProduct() {//获取所有产品的信息
List<Product> products = new ArrayList<Product>();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8",
"root", "admin");
String sql = "select * from product order by id desc";
PreparedStatement ps = c.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Product product = new Product();
int id = rs.getInt(1);
String name = rs.getString(2);
float price = rs.getFloat(3);
product.setId(id);
product.setName(name);
product.setPrice(price);
products.add(product);
}
ps.close();
c.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return products;
}
}
3.PrductServlet.java
package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Product;
import dao.ProductDAO;
public class ProductListServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Product> products = new ProductDAO().ListProduct();
request.setAttribute("products", products);
request.getRequestDispatcher("listProduct.jsp").forward(request, response);
}
}
4.listProduct.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:if test="${!empty user}">
<div align="center">
当前用户: ${user.name}
</div>
</c:if>
<table align='center' border='1' cellspacing='0'>
<tr>
<td>id</td>
<td>名称</td>
<td>价格</td>
<td>购买</td>
</tr>
<c:forEach items="${products}" var="product" varStatus="st">
<tr>
<td>${product.id}</td>
<td>${product.name}</td>
<td>${product.price}</td>
<td>
<form action="addOrderItem" method="post">
数量<input type="text" value="1" name="num">
<input type="hidden" name="pid" value="${product.id}">
<input type="submit" value="购买">
</form>
</tr>
</c:forEach>
</table>
5. 最终版web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<!-- 显示所有产品信息页面的servlet处理-->
<servlet>
<servlet-name>ProductListServlet</servlet-name>
<servlet-class>servlet.ProductListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProductListServlet</servlet-name>
<url-pattern>/listProduct</url-pattern>
</servlet-mapping>
<!-- 登录页面的servlet处理-->
<servlet>
<servlet-name>UserLoginServlet</servlet-name>
<servlet-class>servlet.UserLoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserLoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- 点击“购买”按钮的servlet处理-->
<servlet>
<servlet-name>OrderItemAddServlet</servlet-name>
<servlet-class>servlet.OrderItemAddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OrderItemAddServlet</servlet-name>
<url-pattern>/addOrderItem</url-pattern>
</servlet-mapping>
<!-- 购物车页面的servlet处理-->
<servlet>
<servlet-name>OrderItemListServlet</servlet-name>
<servlet-class>servlet.OrderItemListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OrderItemListServlet</servlet-name>
<url-pattern>/listOrderItem</url-pattern>
</servlet-mapping>
<!-- 点击“生成订单”按钮的servlet处理-->
<servlet>
<servlet-name>OrderCreateServlet</servlet-name>
<servlet-class>servlet.OrderCreateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OrderCreateServlet</servlet-name>
<url-pattern>/createOrder</url-pattern>
</servlet-mapping>
</web-app>
五、用户模块
1. User.java
package bean;
public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.UseDAO.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import bean.User;
public class UserDAO {
public static void main(String[] args) {
System.out.println(new UserDAO().getUser("tom", "123").getId());
}
public User getUser(String name, String password) {
User result = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8",
"root", "admin");
String sql = "select * from user where name = ? and password = ?";
PreparedStatement ps = c.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
if (rs.next()){
result = new User();
result.setId(rs.getInt(1));
result.setPassword(password);
result.setName(name);
}
ps.close();
c.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
3.login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<form action="login" method="post"> <!-- 点击登录 访问 /login 资源 -->
账号: <input type="text" name="name"> <br>
密码: <input type="password" name="password"> <br>
<input type="submit" value="登录">
</form>
4.UserServlet.java
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.User;
import dao.UserDAO;
public class UserLoginServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String password = request.getParameter("password");
User user = new UserDAO().getUser(name, password);
if (null != user) {
request.getSession().setAttribute("user", user);
response.sendRedirect("/listProduct");
} else
response.sendRedirect("/login.jsp");
}
}
六、购物车模块(订单项)
OrderItem.java
package bean;
public class OrderItem {
private int id;
private Product product;
private int num;
private Order order;//订单对象
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
购买商品:OrderItemAddServlet.class
package servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.OrderItem;
import bean.Product;
import dao.ProductDAO;
public class OrderItemAddServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int num = Integer.parseInt(request.getParameter("num"));
int pid = Integer.parseInt(request.getParameter("pid"));
Product p = new ProductDAO().getProduct(pid);
OrderItem oi = new OrderItem();
oi.setNum(num);
oi.setProduct(p);
List<OrderItem> ois = (List<OrderItem>) request.getSession().getAttribute("ois");
if (null == ois) {
ois = new ArrayList<OrderItem>();
request.getSession().setAttribute("ois", ois);
}
boolean found = false;
for (OrderItem orderItem : ois) {
// 解决购买相同商品的操作
if (orderItem.getProduct().getId() == oi.getProduct().getId()) {
orderItem.setNum(orderItem.getNum() + oi.getNum());
found = true;
break;
}
}
if (!found)
ois.add(oi);
response.sendRedirect("/listOrderItem");
}
}
显示购物车内容:OrderItemListServlet.java
package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Product;
import dao.ProductDAO;
public class OrderItemListServlet extends HttpServlet
{
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("listOrderItem.jsp").forward(request, response);
}
}
4.ListOrderItem.jsp 查看购物车
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<h1 align="center" >购物车</h1>
<table align='center' border='1' cellspacing='0'>
<tr>
<td>商品名称</td>
<td>单价</td>
<td>数量</td>
<td>小计</td>
</tr>
<c:forEach items="${ois}" var="oi" varStatus="st">
<tr>
<td>${oi.product.name}</td>
<td>${oi.product.price}</td>
<td>${oi.num}</td>
<td>${oi.product.price*oi.num}</td>
</tr>
</c:forEach>
<c:if test="${!empty ois}">
<tr>
<td colspan="4" align="right">
<a href="createOrder">生成订单</a>
</td>
</tr>
</c:if>
</table>
七、订单模块
1.Order .class
package bean;
public class Order {
int id;
User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2.OrderDAO.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import bean.Order;
public class OrderDAO {
public void insert(Order o) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8",
"root", "admin");
String sql = "insert into order_ values(null,?)";
PreparedStatement ps = c.prepareStatement(sql);
ps.setInt(1, o.getUser().getId());
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
int id = rs.getInt(1);
o.setId(id);
}
ps.close();
c.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.OrderItemDAO .java 保存订单项进数据库,持久化
(也就是点击:生成订单)
将订单+用户的信息写进数据可的订单项表
结果如下图:
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import bean.OrderItem;
import bean.Product;
public class OrderItemDAO {
public static void main(String[] args) {
}
public void insert(OrderItem oi) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8",
"root", "admin");
String sql = "insert into orderitem values(null,?,?,?)";
PreparedStatement ps = c.prepareStatement(sql);
ps.setInt(1,oi.getProduct().getId());
ps.setInt(2,oi.getNum());
ps.setInt(3,oi.getOrder().getId());
ps.execute();
ps.close();
c.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.OrderCreateServlet .java 生成订单的Servlet
也就是在这个页面点击生成订单的超链接,则会根据web中的配置,让OrderCreateServlet类处理这个访问
package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Order;
import bean.OrderItem;
import bean.User;
import dao.OrderDAO;
import dao.OrderItemDAO;
public class OrderCreateServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User u = (User) request.getSession().getAttribute("user");
if(null==u){
response.sendRedirect("/login.jsp");
return;
}
Order o = new Order();
o.setUser(u);
new OrderDAO().insert(o);
List<OrderItem> ois = (List<OrderItem>) request.getSession().getAttribute("ois");
for (OrderItem oi : ois) {
oi.setOrder(o);
new OrderItemDAO().insert(oi);
}
ois.clear();
response.setContentType("text/html; charset=UTF-8");
response.getWriter().println("订单创建成功");
}
}