源代码:
此项目基于MVC设计模式,Servlet做逻辑处理,jsp进行页面展示,DAO层处理数据库
1.数据库建表:
create table jspproduct(
id int primary key auto_increment,
name varchar(30) not null,
description varchar(100) ,
price int check( price >= 0 ),
account int check( account >= 0 ),
status int default 1 check( status in (0, 1) ),
addtime date
);
create table jspuser(
id int(10) primary key auto_increment,
username varchar(15) unique,
password varchar(6) not null check( length(password)=6),
realname varchar(20) not null
);
insert into jspuser values(1,'huxz','123456','胡鑫喆');
insert into jspuser values(2,'liucy','123456','刘春阳');
insert into jspuser values(3,'luxw','123456','陆晓伟');
commit;
2.新建idea web项目
3.添加依赖包,add as a library
4.新建com.xx.util包,添加工具类BaseDAO.java,添加过滤器处理中文乱码,添加配置文件config.properties到src下
5.新建实体类Product, 新建ProductService接口以及它的实现类ProductServiceImpl, 新建ProductDAO接口以及它的实现类ProductDAOImpl(继承BaseDAO类)
展示商品信息功能
流程:QueryProductListServlet–>product_list.jsp
在index.jsp中添加商品管理标签,链接为/QueryProductListServlet,并测试链接
<a href="/QueryProductListServlet">商品管理</a>
新建QueryProductListServlet
拿到ProductService的实现类的实例化对象
private ProductService productService=new ProductServiceImpl();
逻辑处理
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用service的查询商品的列表的方法,返回商品列表
List<Product> products=productService.selectAllProduct();
//2.保存商品列表
request.setAttribute("products",products);
//3.请求转发到Product_list.jsp,在页面上显示商品列表和信息
request.getRequestDispatcher("product_list.jsp").forward(request,response);
}
逐级完成selectAllProduct()方法(最终在DAO层实现):
ProductServiceimpl中私有一个ProductDAO的实现类对象用来下一步调用
private ProductDAO productDAO= new ProductDAOIml();
ProductService中定义selectAllProduct方法,实现类中重写方法。
ProductDAO中定义selectAllProduct方法,实现类中重写方法。
//ProductServiceImpl
@Override
public List<Product> selectAllProduct() {
return productDAO.selectAllProduct();//将ProductDAO返回的商品列表返回给Servlet
}
//ProductDAOIml
@Override
public List<Product> selectAllProduct() {
//uodate
//findlist 方法为BaseDAO中的方法用来查询所有信息
return findList(Product.class,"select * from jspproduct ");
}
此方法的调用流程:
QueryProductListServlet—>ProductService—>ProductServiceImpl—>ProductDAO—>ProductDAOIml—>selectAllProduct() 查询后逐级返回给Servlet
新建product_list.jsp
QueryProductListServlet将在数据库中查询到的商品列表存到request中,请求转发到product_list.jsp,product_list.jsp遍历商品列表,展示商品信息
<a href="product_add.jsp">新增</a>
<table border="1" width="800px" height="300px" align="center">
<tr>
<th>id</th>
<th>商品名称</th>
<th>商品描述</th>
<th>商品单价</th>
<th>商品数量</th>
<th>商品状态</th>
<th>商品上架时间</th>
<th>操作</th>
</tr>
<%
//获取Product对象列表遍历
List <Product> products = (List<Product>) request.getAttribute("products");
for (Product product:products){
%>
<tr>//展示信息
<td><%=product.getId()%></td>
<td><%=product.getName()%></td>
<td><%=product.getDescription()%></td>
<td><%=product.getPrice()%></td>
<td><%=product.getAccount()%></td>
<td>
<%
if(product.getStatus()==1){
%>
上架
<%
}else {
%>
下架
<%
}
%>
</td>
//格式化时间需要引入标签库 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<td><fmt:formatDate value="<%=product.getAddtime()%>" pattern="yyyy-MM-dd"/></td>
//删除功能
<td><a href="DelectProductServlet?id=<%=product.getId()%>">删除</a>
<a href="QueryProductByIdServlet?id=<%=product.getId()%>">修改</a>
</td>
</tr>
<%
}
%>
</table>
删除功能
流程:Product_list.jsp–>DelectProductServlet–>QueryProductListServlet
在Product_list.jsp中添加页面添加超链接
<td><a href="DelectProductServlet?id=<%=product.getId()%>">删除</a>
新建 DelectProductServlet
拿到ProductService的实现类的实例化对象
private ProductService productService=new ProductServiceImpl();
逻辑实现
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取id
Integer id = Integer.parseInt(request.getParameter("id"));
//2.调用Service的删除方法
productService.deleteProductById(id);
//3.请求重定向到查询的Servlet
response.sendRedirect("QueryProductListServlet");
}
在DAO层中实现deleteProductById方法,不需要返回值,之后重定向到QueryProductListServlet
@Override
public void deleteProductById(Integer id) {
update("delete from jspproduct where id=?",id);
}
测试可以正常删除。
商品添加功能
流程:Product_list.jsp–>product_add.jsp–>AddProductServlet -->QueryProductListServlet
在Product_list.jsp页面添加超链接
<a href="product_add.jsp">新增</a>
新建product_add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="ADDProductServlet">
<table border="1" width="500px" height="300px" align="center">
<tr>
<td>商品名称</td>
<td><input type="text"name="name" size="25"/></td>
</tr>
<tr>
<td>商品单价</td>
<td><input type="text" name="price" size="25" /></td>
</tr>
<tr>
<td>商品数量</td>
<td><input type="text" name="account" size="25" /></td>
</tr>
<tr>
<td>商品状态</td>
<td>
<input type="radio" name="status" value="0" />下架
<input type="radio" name="status" value="1" checked="checked"/>上架
</td>
</tr>
<tr>
<td>商品描述</td>
<td>
<textarea rows="10" cols="30" name="description"></textarea>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="保存" />
</td>
</tr>
</table>
</form>
</body>
</html>
form表单提交到AddProductServlet
新建AddProductServlet
private ProductService productService=new ProductServiceImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取jsp的参数
String name = request.getParameter("name");
String description = request.getParameter("description");
Integer price = Integer.parseInt(request.getParameter("price"));
Integer account = Integer.parseInt(request.getParameter("account"));
Integer status = Integer.parseInt(request.getParameter("status"));
//2.新建商品类,保存商品的信息
Product product = new Product();
product.setName(name);
product.setDescription(description);
product.setAccount(account);
product.setStatus(status);
product.setPrice(price);
product.setAddtime(new Date());
//3.调用Service的addproduct方法
productService.addProduct(product);
//4.重定向到查询的servlet
response.sendRedirect("QueryProductListServlet");
}
在DAO层实现addProduct方法,无需返回对象,之后重定向到QueryProductListServlet
@Override
public void addProduct(Product product) {
update("insert into jspproduct values(null,?,?,?,?,?,?)",product.getName(),product.getDescription(),product.getPrice(),product.getAccount(),product.getStatus(),product.getAddtime());
}
测试,添加商品正常。
.商品修改功能
流程:
Product_list.jsp–>QueryProductByIdServlet–>Product_update.jsp–>UpdateProductServlet–>QueryProductListServlet
商品修改功能要先根据id展示这个商品的信息,然后修改后保存。
添加标签到Product_list.jsp
<a href="QueryProductByIdServlet?id=<%=product.getId()%>">修改</a>
新建QueryProductByIdServlet查询该商品的信息
逻辑处理
private ProductService productService=new ProductServiceImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取id
Integer id = Integer.parseInt(request.getParameter("id"));
//2.根据id查询商品信息返回商品对象
Product product= productService.selectProductById(id);
//3.保存商品对象
request.setAttribute("product",product);
//4.请求转发到Product_update.jsp
request.getRequestDispatcher("Product_update.jsp").forward(request,response);
}
ProductDAOImpl实现selectProductById方法并返回对象存入request中
@Override
public Product selectProductById(Integer id) {
return findOne(Product.class,"select * from jspproduct where id = ?",id);
}
新建Product_update.jsp显示根据id查询到的信息并修改
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% Product product= (Product)request.getAttribute("product");%>
<form action="UpdateProductServlet">
<input type="hidden" name="id" value="<%=product.getId()%>">
<table border="1" width="500px" height="300px" align="center">
<tr>
<td>商品名称</td>
<td><input type="text" name="name" size="25" value="<%=product.getName()%>" /></td>
</tr>
<tr>
<td>商品单价</td>
<td><input type="text" name="price" size="25" value="<%=product.getPrice()%>"/></td>
</tr>
<tr>
<td>商品数量</td>
<td><input type="text" name="account" size="25" value="<%=product.getAccount()%>"/></td>
</tr>
<tr>
<td>商品状态</td>
<td>
<input type="radio" name="status" value="0" />下架
<input type="radio" name="status" value="1" checked="checked" />上架
</td>
</tr>
<tr>
<td>商品描述</td>
<td>
<textarea rows="10" cols="30" name="description" ><%=product.getDescription()%></textarea>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="保存" />
</td>
</tr>
</table>
</form>
</body>
</html>
修改提交后到UpdateProductServlet中
新建UpdateProductServlet
private ProductService productService = new ProductServiceImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取jsp的参数
String name = request.getParameter("name");
String description = request.getParameter("description");
Integer price = Integer.parseInt(request.getParameter("price"));
Integer account = Integer.parseInt(request.getParameter("account"));
Integer status = Integer.parseInt(request.getParameter("status"));
Integer id = Integer.parseInt(request.getParameter("id"));
//2.新建商品类,保存商品的信息
Product product = new Product();
product.setName(name);
product.setDescription(description);
product.setAccount(account);
product.setStatus(status);
product.setPrice(price);
product.setAddtime(new Date());
product.setId(id);
//3.调用Service的addproduct方法
productService.updateProduct(product);
//4.重定向到查询的servlet
response.sendRedirect("QueryProductListServlet");
}
到DAO层实现updatproduct方法无需返回对象,之后重定向到QueryProductListServlet即可
@Override
public void updateProduct(Product product) {
update("update jspproduct set name=?,description=?,price=?,account=?,status=? where id= ?",product.getName(),product.getDescription(),product.getPrice(),product.getAccount(),product.getStatus(),product.getId());
}
}
测试,完成所有功能的实现。