一、功能介绍
使用JSP+Servlet实现商品管理功能,开发工具IDEA,后台为mysql数据库,功能包括商品信息浏览、商品信息详情、商品信息删除及修改。具体要求如下:
1.1显示
打开商品信息管理首页,以列表方式显示所有商品信息
1.2商品详情
单击商品超链接,则跳转至指定商品的商品详情页面
1.3新增
设计及实现新增商品功能
1.4修改
设计及实现修改商品功能
1.5删除
单击“删除”链接可以进行商品信息删除,弹出提示框,点击“确定”进行删除。
二、数据库语句
-- 商品管理功能--
-- 主管表 --
create TABLE charge(
chargeNum int PRIMARY KEY,
chargeName VARCHAR(100)
);
INSERT into charge values (201,"赵云");
INSERT into charge values (202,"张飞");
INSERT into charge values (203,"黄忠");
SELECT * from charge
-- -- 商品信息表
CREATE TABLE goods(
goodsId int PRIMARY KEY auto_increment,
barCode int,
chargeNum int,
goodsName VARCHAR(50),
goodsPrice VARCHAR(50),
purchaseId int,
expirationDate VARCHAR(50),
FOREIGN KEY(chargeNum) references charge(chargeNum) on delete cascade on update cascade
);
-- 添加数据
insert into goods VALUES (null,902083,201,"脉动","5元",6,"一年");
insert into goods VALUES (null,902084,201,"纯牛奶","3元",4,"六个月");
insert into goods VALUES (null,902085,203,"面包","2元",3,"两个月");
insert into goods VALUES (null,902086,202,"毛巾","12元",8,"无");
SELECT * from goods WHERE goodsId=902083
DELETE from goods where goodsId=902083
update goods set chargeNum =1, goodsName="1",goodsPrice="1", purchaseId=1,expirationDate="1" WHERE goodsId=902083
三、项目结构
四、java代码
4.1Good类
package com.blb.beans;
//商品类:条形码、主管工号、商品名称、商品价格、进货单号、保质时间
public class Good {
private String goodsId;
private String barCode;
private String chargeNum;
private String goodsName;
private String goodsPrice;
private String purchaseId;
private String expirationDate;
public Good() {
}
@Override
public String toString() {
return "Good{" +
"goodsId='" + goodsId + '\'' +
", barCode='" + barCode + '\'' +
", chargeNum='" + chargeNum + '\'' +
", goodsName='" + goodsName + '\'' +
", goodsPrice='" + goodsPrice + '\'' +
", purchaseId='" + purchaseId + '\'' +
", expirationDate='" + expirationDate + '\'' +
'}';
}
public Good(String goodsId, String barCode, String chargeNum, String goodsName, String goodsPrice, String purchaseId, String expirationDate) {
this.goodsId = goodsId;
this.barCode = barCode;
this.chargeNum = chargeNum;
this.goodsName = goodsName;
this.goodsPrice = goodsPrice;
this.purchaseId = purchaseId;
this.expirationDate = expirationDate;
}
public String getBarCode() {
return barCode;
}
public void setBarCode(String barCode) {
this.barCode = barCode;
}
public String getGoodsId() {
return goodsId;
}
public void setGoodsId(String goodsId) {
this.goodsId = goodsId;
}
public String getChargeNum() {
return chargeNum;
}
public void setChargeNum(String chargeNum) {
this.chargeNum = chargeNum;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public String getGoodsPrice() {
return goodsPrice;
}
public void setGoodsPrice(String goodsPrice) {
this.goodsPrice = goodsPrice;
}
public String getPurchaseId() {
return purchaseId;
}
public void setPurchaseId(String purchaseId) {
this.purchaseId = purchaseId;
}
public String getExpirationDate() {
return expirationDate;
}
public void setExpirationDate(String expirationDate) {
this.expirationDate = expirationDate;
}
}
4.2 Charge类
package com.blb.beans;
//主管:主管工号、主管名称
public class Charge {
private String chargeNum;
private String chargeName;
@Override
public String toString() {
return "Charge{" +
"chargeNum='" + chargeNum + '\'' +
", chargeName='" + chargeName + '\'' +
'}';
}
public Charge() {
}
public Charge(String chargeNum, String chargeName) {
this.chargeNum = chargeNum;
this.chargeName = chargeName;
}
public String getChargeNum() {
return chargeNum;
}
public void setChargeNum(String chargeNum) {
this.chargeNum = chargeNum;
}
public String getChargeName() {
return chargeName;
}
public void setChargeName(String chargeName) {
this.chargeName = chargeName;
}
}
4.3GoodDao接口
package com.blb.dao;
import com.blb.beans.Charge;
import com.blb.beans.Good;
import java.util.List;
public interface GoodDao {
List<Good> list();//显示商品列表
List<Charge> chargeList();//主管工号列表
boolean del(String id);//删除:根据id删除商品
boolean update(Good good);//修改商品信息
boolean insert(Good good);//添加商品
Good findGoodById(String id);//详情根据id查找商品的信息
}
4.4GoodDaoImpl(GoodDao接口实现类)
package com.blb.dao.impl;
import com.blb.beans.Charge;
import com.blb.beans.Good;
import com.blb.dao.GoodDao;
import com.blb.util.DBUtils;
import java.util.List;
public class GoodDaoImpl implements GoodDao {
@Override
public List<Good> list() {
return DBUtils.queryAllList("SELECT * from goods ",Good.class);
}
@Override
public List<Charge> chargeList() {
return DBUtils.queryAllList("SELECT * from charge",Charge.class);
}
@Override
public boolean del(String id) {
return DBUtils.update("DELETE from goods where goodsId=?",id)>0;
}
@Override
public boolean update(Good good) {
return DBUtils.update("update goods set barCode=?, chargeNum =?, goodsName=?,goodsPrice=?, purchaseId=?,expirationDate=? WHERE goodsId=?",good.getBarCode(),good.getChargeNum(),good.getGoodsName(),good.getGoodsPrice(),good.getPurchaseId(),good.getExpirationDate(),good.getGoodsId())>0;
}
@Override
public boolean insert(Good good) {
return DBUtils.update("insert into goods VALUES (null,?,?,?,?,?,?)",good.getBarCode(),good.getChargeNum(),good.getGoodsName(),good.getGoodsPrice(),good.getPurchaseId(),good.getExpirationDate())>0;
}
@Override
public Good findGoodById(String id) {
return DBUtils.queryOneToBean("SELECT * from goods WHERE goodsId=?",Good.class,id);
}
}
4.5GoodService接口
package com.blb.service;
import com.blb.beans.Charge;
import com.blb.beans.Good;
import java.util.List;
public interface GoodService {
List<Good> list();//显示商品列表
List<Charge> chargeList();//主管工号列表
boolean del(String id);//删除:根据id删除商品
boolean update(Good good);//修改商品信息
boolean insert(Good good);//添加商品
Good findGoodById(String id);//详情根据id查找商品的信息
}
4.6GoodServiceImpl(GoodService接口实现类)
package com.blb.service.impl;
import com.blb.beans.Charge;
import com.blb.beans.Good;
import com.blb.dao.GoodDao;
import com.blb.dao.impl.GoodDaoImpl;
import com.blb.service.GoodService;
import java.util.List;
public class GoodServiceImpl implements GoodService {
private GoodDao goodDao=new GoodDaoImpl();
@Override
public List<Good> list() {
return goodDao.list();
}
@Override
public List<Charge> chargeList() {
return goodDao.chargeList();
}
@Override
public boolean del(String id) {
return goodDao.del(id);
}
@Override
public boolean update(Good good) {
return goodDao.update(good);
}
@Override
public boolean insert(Good good) {
return goodDao.insert(good);
}
@Override
public Good findGoodById(String id) {
return goodDao.findGoodById(id);
}
}
4.7BaseServlet
package com.blb.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public class BaseServlet extends HttpServlet {
@Override//service可以写公用的属性、方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//设置请求和响应,发往服务器的参数的编码格式
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//拿浏览器传入的方法参数
String m = req.getParameter("m");
//获取当前对象的class,方法。并调用方法
Class clazz = this.getClass();
System.out.println("当前进入的servlet:"+clazz+"当前调用的方法"+m);
Method method = clazz.getDeclaredMethod(m, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this,req,resp);
}catch (Exception e){
e.printStackTrace();
}
}
//请求转发
public void dispatcher(String url,HttpServletRequest req, HttpServletResponse res){
try {
req.getRequestDispatcher(url).forward(req,res);
}catch (Exception e){
e.printStackTrace();
}
}
//重定向
public void redirect(String url,HttpServletRequest req, HttpServletResponse res){
try{
res.sendRedirect(req.getContextPath()+url);
}catch (Exception e){
e.printStackTrace();
}
}
}
4.8ListServlet
package com.blb.servlet;
import com.blb.beans.Good;
import com.blb.service.GoodService;
import com.blb.service.impl.GoodServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/ListServlet")
public class ListServlet extends HttpServlet {
//创建good的服务对象
private GoodService goodService=new GoodServiceImpl();
//调用list方法,查找所有商品并存入list集合,请求转发到index.jsp页面显示商品信息
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Good> list = goodService.list();
req.setAttribute("list",list);
req.getRequestDispatcher("/index.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.9GoodServlet
package com.blb.servlet;
import com.blb.beans.Charge;
import com.blb.beans.Good;
import com.blb.service.GoodService;
import com.blb.service.impl.GoodServiceImpl;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@WebServlet("/GoodServlet")
public class GoodServlet extends BaseServlet {
//创建商品的服务对象
private GoodService goodService=new GoodServiceImpl();
//添加:调用chargeList方法,获取主管工号的数据列表并存入集合,请求转发到insert.jsp页面
public void insertPage (HttpServletRequest req, HttpServletResponse resp) {
List<Charge> charges = goodService.chargeList();
req.setAttribute("chargeList",charges);
dispatcher("/insert.jsp",req,resp);
}
//将用户输入的数据存入good对象并调用insert方法,把数据加入数据库,最后,重新获取数据库数据返回首页。
public void insert (HttpServletRequest req, HttpServletResponse resp) {
String barCode = req.getParameter("barCode");
String chargeNum = req.getParameter("chargeNum");
String goodsName = req.getParameter("goodsName");
String goodsPrice = req.getParameter("goodsPrice");
String purchaseId = req.getParameter("purchaseId");
String expirationDate = req.getParameter("expirationDate");
Good good = new Good(null,barCode, chargeNum, goodsName, goodsPrice, purchaseId, expirationDate);
boolean result = goodService.insert(good);
dispatcher("/ListServlet",req,resp);
}
//修改:调用findGoodById方法,获取当前修改商品的信息并存入集合,请求转发到update.jsp页面
public void updatePage (HttpServletRequest req, HttpServletResponse resp) {
String goodsId = req.getParameter("id");
Good good = goodService.findGoodById(goodsId);
req.setAttribute("good",good);
List<Charge> charges = goodService.chargeList();
req.setAttribute("chargeList",charges);
dispatcher("/update.jsp",req,resp);
}
//将用户输入的数据存入good对象并调用update方法,把数据库中的当前商品的数据进行修改,最后,重新获取数据库数据返回首页。
public void update (HttpServletRequest req, HttpServletResponse resp) {
String goodsId = req.getParameter("goodsId");
String barCode = req.getParameter("barCode");
String chargeNum = req.getParameter("chargeNum");
String goodsName = req.getParameter("goodsName");
String goodsPrice = req.getParameter("goodsPrice");
String purchaseId = req.getParameter("purchaseId");
String expirationDate = req.getParameter("expirationDate");
Good good = new Good(goodsId,barCode, chargeNum, goodsName, goodsPrice, purchaseId, expirationDate);
boolean result = goodService.update(good);
dispatcher("/ListServlet",req,resp);
}
//删除:根据商品的id进行删除,最后,重新获取数据库数据返回首页。
public void delete (HttpServletRequest req, HttpServletResponse resp) {
String id = req.getParameter("id");
boolean del = goodService.del(id);
dispatcher("/ListServlet",req,resp);
}
//详情:调用findGoodById方法,获取当前修改商品的信息并存入集合,请求转发到details.jsp页面
public void details (HttpServletRequest req, HttpServletResponse resp) {
String id = req.getParameter("id");
Good good = goodService.findGoodById(id);
req.setAttribute("good",good);
dispatcher("/details.jsp",req,resp);
}
}
4.10DBUtils工具类
package com.blb.util;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.GenerousBeanProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import java.io.File;
import java.io.FileInputStream;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class DBUtils {
// 要连接的驱动类型
private static String DRIVER = null;
//要连接的URL
private static String URL = null;
// 要连接的数据库的用户名
private static String USER = null;
// 要连接的数据库的密码
private static String PWD = null;
private static QueryRunner runner ;
static {
//建立连接器
File f = new File("D:\\ commercialinformationmanagementsystem\\src\\com\\blb\\file.properties");
Properties p = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(f);
p.load(fis);
DRIVER = p.getProperty("DRIVER");
URL = p.getProperty("URL");
USER = p.getProperty("USER");
PWD = p.getProperty("PWD");
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
//连接数据库
DruidDataSource ds = new DruidDataSource();
ds.setUrl(URL);
ds.setUsername(USER);
ds.setPassword(PWD);
ds.setDriverClassName(DRIVER);
runner = new QueryRunner(ds);
}
/**
* 进行新增、修改、删除操作
* @param sql 进行操作的SQL语句
* @param param 操作对应的参数,替代SQL中的占位符
* @return SQL执行后受影响的行
*/
public static int update(String sql ,Object... param ){
try {
return runner.update(sql, param);
} catch (SQLException e) {
e.printStackTrace();
}
return 0 ;
}
/**
* 查询1个对象封装成Bean对象
* @param sql 进行操作的SQL语句
* @param clazz 结果封装的Bean类型
* @param param 操作对应的参数,替代SQL中的占位符
* @return SQL操作后的Bean对象,如果异常则返回null
*/
public static<T> T queryOneToBean(String sql, Class<T> clazz,Object... param ){
try {
BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
return runner.query(sql, new BeanHandler<T>(clazz,brp),param);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 查询只有1行结果的操作,结果封装成Map
* @param sql 进行操作的SQL语句
* @param param 操作对应的参数,替代SQL中的占位符
* @return SQL操作后的1行内容封装到Map中,如果异常则返回null
*/
public static Map<String,Object> queryOneToMap(String sql, Object... param ){
try {
return runner.query(sql,new MapHandler(),param);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 有多行结果的查询操作,结果封装成List,元素为bean类型
* @param sql sql 进行操作的SQL语句
* @param clazz 结果封装的Bean类型
* @param param 操作对应的参数,替代SQL中的占位符
* @return SQL操作后的多行内容封装到List中,如果异常则返回null
*/
public static<T> List<T> queryAllList(String sql, Class<T> clazz,Object... param ){
try {
BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
return runner.query(sql, new BeanListHandler<T>(clazz,brp),param);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 查询有多行结果的操作,结果封装成List中,元素为map类型
* @param sql 进行操作的SQL语句
* @param param 操作对应的参数,替代SQL中的占位符
* @return SQL操作后的多行内容封装到List中,如果异常则返回null
*/
public static List<Map<String,Object>> queryAllMap(String sql, Object... param ){
try {
return runner.query(sql,new MapListHandler(),param );
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
4.11file.properties文件
DRIVER = com.mysql.jdbc.Driver
URL = jdbc:mysql://127.0.0.1:3306/decemberexamination?useUnicode=true&characterEncoding=UTF-8
USER = root
PWD = root
五、JSP代码
5.1common.jsp共有的配置信息
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="path" value="${pageContext.request.contextPath}"/>
<%
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
%>
5.2index.jsp商品信息管理首页
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="/common/common.jsp"%>
<html>
<head>
<title>商品信息管理首页</title>
</head>
<style>
#add{
display: block;
text-align: center;
}
</style>
<body>
<table align="center" border="1" >
<tr align="center">
<td>条形码</td>
<td>主管工号</td>
<td>商品名称</td>
<td>商品价格</td>
<td>进货单号</td>
<td>保质时间</td>
<td>编辑</td>
</tr>
<c:forEach items="${list}" var="good">
<tr align="center">
<td>${good.barCode}</td>
<td>${good.chargeNum}</td>
<td><a href="${path}/GoodServlet?m=details&id=${good.goodsId}">${good.goodsName}</a> </td>
<td>${good.goodsPrice}</td>
<td>${good.purchaseId}</td>
<td>${good.expirationDate}</td>
<td><a href="${path}/GoodServlet?m=updatePage&id=${good.goodsId}">修改</a> <a href="javascript:void(0)" onclick="confirmDel(${good.goodsId})">删除</a> </td>
</tr>
</c:forEach>
</table>
<a id="add" href="${path}/GoodServlet?m=insertPage">添加商品</a>
<script type="text/javascript">
function confirmDel(param)
{
if(window.confirm("确定删除?")){
document.location="${path}/GoodServlet?m=delete&id="+param
}
}
</script>
</body>
</html>
5.3details.jsp商品详情页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="/common/common.jsp"%>
<html>
<head>
<title>商品详情</title>
</head>
<body>
<table border="1" align="center">
<tr>
<td>条形码</td>
<td>${good.barCode}</td>
</tr>
<tr>
<td>主管工号</td>
<td>${good.chargeNum}</td>
</tr>
<tr>
<td>商品名称</td>
<td>${good.goodsName}</td>
</tr>
<tr>
<td>商品价格</td>
<td>${good.goodsPrice}</td>
</tr>
<tr>
<td>进货单号</td>
<td>${good.purchaseId}</td>
</tr>
<tr>
<td>保质时间</td>
<td>${good.expirationDate}</td>
</tr>
<tr>
<td colspan="2"><a href="${path}/ListServlet">返回</a> </td>
</tr>
</table>
</body>
</html>
5.4insert.jsp添加商品页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="/common/common.jsp"%>
<html>
<head>
<title>新增商品</title>
</head>
<body>
<form action="${path}/GoodServlet?m=insert" method="post" align="center">
<h3>添加商品</h3>
条形码 <input type="text" name="barCode"><br />
主管工号 <select name="chargeNum"><option>请选择主管工号</option>
<c:forEach items="${chargeList}" var="charge">
<option value="${charge.chargeNum}">${charge.chargeNum}</option>
</c:forEach>
</select> <br />
商品名称<input type="text" name="goodsName"><br />
商品价格 <input type="text"name="goodsPrice"> <br />
进货单号 <input type="text"name="purchaseId"> <br />
保质期 <input type="text" name="expirationDate"> <br />
<input type="submit">
</form>
</body>
</html>
5.5update.jsp修改商品页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="/common/common.jsp"%>
<html>
<head>
<title>修改商品</title>
</head>
<body>
<form action="${path}/GoodServlet?m=update" method="post" align="center">
<input type="hidden"name="goodsId" value="${good.goodsId}">
条形码 <input type="text" name="barCode" value="${good.barCode}"><br />
主管工号 <select name="chargeNum" value="${good.chargeNum}">
<option>${good.chargeNum}</option>
<c:forEach items="${chargeList}" var="charge"><option>${charge.chargeNum}</option></c:forEach>
</select> <br />
商品名称<input type="text" name="goodsName" value="${good.goodsName}"><br />
商品价格 <input type="text"name="goodsPrice" value="${good.goodsPrice}"> <br />
进货单号 <input type="text"name="purchaseId" value="${good.purchaseId}"> <br />
保质期 <input type="text" name="expirationDate" value="${good.expirationDate}"> <br />
<input type="submit">
</form>
</body>
</html>
5.6web.xml
配置welcome-file-list是为了去ListServlet拿商品信息的数据。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>ListServlet</welcome-file>
</welcome-file-list>
</web-app>
六、项目下载
JAVAWEB使用JSP+Servlet实现商品管理功能,后台为数据库,功能包括商品信息浏览、商品信息详情、商品信息删除及修改。