Java Web 项目(后台管理系统)
1.所要用的工具 :
(1)编译工具: Myeclipse2017
(2)服务器:apache_tomcat8
(3)所有的Jdk 版本: jdk-8u221-64bit
(4)sqlserver数据库
将以上软件安装到计算机:
2.创建一个 web应用Produce
3.创建一个com.product.vo包,包下创建Produce 类
这里的类的属性名尽量与数据库表中的字段名相对应,方便后面与前端表中数据相对应不容易犯迷糊出错
package com.product.vo;
public class Produce {
private Integer id;
private String name;
private String lx; //类型的简拼
private Integer price;
private String yn; //yes or no 的简写
private String note;
//数据库中建表product 的六个字段 分别也声明为 id name lx price yn note
//其中id设置为了主键标识自增为1
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLx() {
return lx;
}
public void setLx(String lx) {
this.lx = lx;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public String getYn() {
return yn;
}
public void setYn(String yn) {
this.yn = yn;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
4.创建一个com.product.dbservice包,包下创建DBservice类
用来连接数据库
package com.product.dbservice;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//这里封装一个连接数据库的类,以后用的话直接拿去用不需要再写
public class DBservice {
private final String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
//连接数据库2018DB,当然这里数据库命名有点不规范,尽量别让数字开头,易出错
private final String url = "jdbc:sqlserver://localhost:1433;DatabaseName=2018DB";
private final String userName = "sa";
private final String password = "123456";
private static DBservice dbservice = null;
private static Connection conn = null;
private DBservice() {
}
public static DBservice getInstance() {
if (null == dbservice) {
dbservice = new DBservice();
}
return dbservice;
}
private Connection getConnection() {
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, userName, password);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return conn;
}
public int exeUpdateSql(String sqlstr) {
int result = -100;
if(null==conn){
conn = this.getConnection();
}
try {
Statement stmt = conn.createStatement();
result = stmt.executeUpdate(sqlstr);
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
public List<Map> executeSelect(String sqlstr) {
List<Map> result = new ArrayList<Map>();
if(null==conn)conn = this.getConnection();
Statement stmt;
try {
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sqlstr);
ResultSetMetaData rmd = rs.getMetaData();
while (rs.next()) {
Map<String, String> map = new HashMap<String, String>();
for (int ii = 1; ii <= rmd.getColumnCount(); ii++) {
map.put(rmd.getColumnName(ii),
rs.getString(rmd.getColumnName(ii)));
}
result.add(map);
}
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
}
5.创建一个com.product.dao包,包下创建ProduceDao 接口
package com.product.dao;
import java.util.List;
import com.product.vo.Produce;
//创建一个接口
public interface ProduceDao {
//抽象方法add
public void add(Produce p);
public void update(Produce p);
public void delete(Produce p);
public List<Produce> query(String where);
}
6.创建一个com.product.dao.impl包,包下创建IProduceDao类实现ProduceDao接口
package com.product.dao.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.product.dao.ProduceDao;
import com.product.dbservice.DBservice;
import com.product.vo.Produce;
public class IProduceDao implements ProduceDao {
public void add(Produce p) {
//拼接sql语句
String sql="insert into product (name,lx,price,yn,note) values(";
sql=sql+"'"+p.getName()+"',";
sql=sql+"'"+p.getLx()+"',";
sql=sql+"'"+p.getPrice()+"',";
sql=sql+"'"+p.getYn()+"',";
sql=sql+"'"+p.getNote()+"')";
//获取对象
DBservice dbservice=DBservice.getInstance();
//调用方法执行sql语句
dbservice.exeUpdateSql(sql);
}
public void update(Produce p) {
String sql="update product set ";
sql=sql+"name='"+p.getName()+"',";
sql=sql+"lx='"+p.getLx()+"',";
sql=sql+"price='"+p.getPrice()+"',";
sql=sql+"yn='"+p.getYn()+"',";
sql=sql+"note='"+p.getNote()+"',";
sql=sql+"where id= "+p.getId();
DBservice dbservice=DBservice.getInstance();
dbservice.exeUpdateSql(sql);
}
public void delete(Produce p) {
String sql="delete from product where id ="+p.getId();
DBservice dbservice=DBservice.getInstance();
dbservice.exeUpdateSql(sql);
}
public List<Produce> query(String where) {
List<Produce> result=new ArrayList<Produce>();
DBservice dbservice=DBservice.getInstance();
String sql="select * from product ";
if(!"".equals(where)){
sql=sql+" where "+where;
}
List<Map>list=dbservice.executeSelect(sql);
for(Map map:list){
Produce p=new Produce();
p.setId(Integer.parseInt( map.get("id").toString()));
p.setName(map.get("name").toString());
p.setLx(map.get("lx").toString());
p.setPrice(Integer.parseInt(map.get("price").toString()));
p.setYn(map.get("yn").toString());
p.setNote(map.get("note").toString());
result.add(p);
}
return result;
}
}
7.创建一个com.product.service包,包下创建ProduceService 接口
package com.product.service;
import java.util.List;
import com.product.vo.Produce;
public interface ProduceService {
public void add(Produce stu);
public void up(Produce stu);
public void delete(Integer id);
//增加了一个根据id查找产品的抽象方法
public Produce find(Integer id);
public List<Produce> getlist(String where);
}
8.创建一个com.product.service.impl包,包下创建IProduceService类实现ProduceService 接口
package com.product.service.impl;
import java.util.List;
import com.product.dao.ProduceDao;
import com.product.dao.impl.IProduceDao;
import com.product.service.ProduceService;
import com.product.vo.Produce;
public class IProduceService implements ProduceService{
ProduceDao dao=new IProduceDao();
public void add(Produce p) {
// TODO Auto-generated method stub
dao.add(p);
}
public void up(Produce p) {
// TODO Auto-generated method stub
dao.update(p);
}
public void delete(Integer id) {
// TODO Auto-generated method stub
dao.delete(this.find(id));
}
//这个方法其实可以在dao层里完成实现在这直接调用,当然在这里也是可以完成实现的
public Produce find(Integer id) {
String where= "id="+id;
List<Produce>list=dao.query(where);
if(list.size()>0){
return list.get(0);
}else{
return null;
}
}
public List<Produce> getlist(String where) {
return dao.query(where);
}
}
9.创建一个com.product.servlet 包,包下创建ProductServlet 类实继承自HttpServlet类
该类是用来获取后台数据空中的数据,并且发送到前端页面中进行展示
package com.product.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 com.product.service.ProduceService;
import com.product.service.impl.IProduceService;
import com.product.vo.Produce;
public class ProductServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//这里重写doGet方法
//创建一个ProduceService对象
ProduceService service=new IProduceService();
//调用 其中的方法进行查询全部数据
List<Produce>list= service.getlist("");
//将集合list放在produce中进行发送
request.setAttribute("produce", list);
//请求转发到produce目录下的Pro.jsp中
//pro.jsp该页面是用来展示后台数据库中的所有数据
request.getRequestDispatcher("produce/pro.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
10.创建一个com.product.servlet 包,包下创建AddProduceServlet 类实继承自HttpServlet 类
package com.product.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 com.product.service.ProduceService;
import com.product.service.impl.IProduceService;
import com.product.vo.Produce;
public class AddProduceServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//这里重写doPost方法
//先设置字符集,防止出现乱码问题
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
//获取前端控件中的数据
//由于数据库中表中的id设置为标识自增,不需要手动赋值
String name=request.getParameter("name");
String lx=request.getParameter("lx");
String price=request.getParameter("price");
String yn=request.getParameter("yn");
String note=request.getParameter("note");
//调用ProduceService中的方法
ProduceService service=new IProduceService();
Produce p=new Produce();
//将接收到的前端的值传入Produce对象中去
p.setPrice(Integer.parseInt(price));
p.setLx(lx);
p.setName(name);
p.setNote(note);
p.setYn(yn);
//调用add方法将数据放到数据库中
service.add(p);
//重定向(页面跳转)到ProduceServlet
response.sendRedirect("ProductServlet");
}
}
11.创建一个com.product.servlet 包,包下创建FindProduceServlet类实继承自HttpServlet 类
package com.product.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 com.product.service.ProduceService;
import com.product.service.impl.IProduceService;
import com.product.vo.Produce;
public class FindProduceServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取id
String id=request.getParameter("id");
ProduceService service=new IProduceService();
//调用方法传入获取的id
Produce pro=service.find(Integer.parseInt(id));
//将得到的数据放大produce中
request.setAttribute("produce", pro);
//转发到produce目录下的up.jsp进行展示
request.getRequestDispatcher("produce/up.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
12.创建一个com.product.servlet 包,包下创建UpProduceServlet 类实继承自HttpServlet 类
package com.product.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 com.product.service.ProduceService;
import com.product.service.impl.IProduceService;
import com.product.vo.Produce;
public class UpProduceServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//牵扯到操作数据库要先设置字符集问题
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
String id=request.getParameter("id");
String name=request.getParameter("name");
String lx=request.getParameter("lx");
String price=request.getParameter("price");
String yn=request.getParameter("yn");
String Note=request.getParameter("note");
ProduceService service=new IProduceService();
Produce p=new Produce();
//这里id不做修改,直接获取到后在方法后台数据库中
p.setId(Integer.parseInt(id));
p.setName(name);
p.setLx(lx);
p.setYn(yn);
p.setPrice(Integer.parseInt(price));
p.setNote(Note);
//这里调用的是up方法
service.up(p);
//重定向
response.sendRedirect("ProductServlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
13.创建一个com.product.servlet 包,包下创建DelProduceServlet类实继承自HttpServlet 类
package com.product.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 com.product.service.ProduceService;
import com.product.service.impl.IProduceService;
public class DelProduceServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id=request.getParameter("id");
ProduceService service=new IProduceService();
service.delete(Integer.parseInt(id));
//重定向
response.sendRedirect("ProductServlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
14在WebRoot目录下,创建一个produce文件夹放视图文件
在WebRoot目录下的WEB-INF下的web.xml中配置Servlet信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>ProductServlet</servlet-name>
<servlet-class>com.product.servlet.ProductServlet</servlet-class>
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>FindProduceServlet</servlet-name>
<servlet-class>com.product.servlet.FindProduceServlet</servlet-class>
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>DelProduceServlet</servlet-name>
<servlet-class>com.product.servlet.DelProduceServlet</servlet-class>
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>AddProduceServlet</servlet-name>
<servlet-class>com.product.servlet.AddProduceServlet</servlet-class>
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>UpProduceServlet</servlet-name>
<servlet-class>com.product.servlet.UpProduceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProductServlet</servlet-name>
<url-pattern>/ProductServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FindProduceServlet</servlet-name>
<url-pattern>/FindProduceServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DelProduceServlet</servlet-name>
<url-pattern>/DelProduceServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AddProduceServlet</servlet-name>
<url-pattern>/AddProduceServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>UpProduceServlet</servlet-name>
<url-pattern>/UpProduceServlet</url-pattern>
</servlet-mapping>
<!-- 当只访问工程名时,会直接跳转到ProductServlet这 -->
<welcome-file-list>
<welcome-file>ProductServlet</welcome-file>
</welcome-file-list>
</web-app>
Pro.jsp页面是用来展示所有后台数据的
Produce.jsp是增减产品信息的页面,有前端页面点击事件,进行页面跳转.
up.jsp页面是修改数据页面
Pro.jsp
<%@ page language="java" import="java.util.*,com.product.vo.Produce" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'pro.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<%List<Produce> list=(List<Produce>)request.getAttribute("produce"); %>
</head>
<body>
<!--创建表格-->
This is my JSP page. <br>
<center>
<h1>商品展示</h1>
<table width="100%" border="3px" cellpadding="1" cellspacing="1">
<tr>
<td align="center" height="57px">序号</td>
<td align="center">商品名称</td>
<td align="center">商品类型</td>
<td align="center">商品价格</td>
<td align="center">是否畅销</td>
<td align="center">说明</td>
<td align="center">
<a href="produce/produce.jsp">增加</a>
</td>
</tr>
<!-- 接着是循环输出产品信息 -->
<%
int i=0;
for(Produce pro :list){
i=i+1;
%>
<tr>
<td align="center" height="57px"><%=i %></td>
<td align="center"><%= pro.getName() %></td>
<td align="center"><%=pro.getLx() %></td>
<td align="center"><%= pro.getPrice() %></td>
<td align="center"><%=pro.getYn() %></td>
<td align="center"><%=pro.getNote() %></td>
<td align="center">
<a href="FindProduceServlet?id=<%=pro.getId()%>">修改 </a>
<a href="DelProduceServlet?id=<%=pro.getId()%>" onclick="return confirm('Are you sure to delete it ???')">删除</a>
</td>
</tr>
<%}%>
</table>
</center>
</body>
</html>
produce.jsp 用于增加产品信息的页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'produce.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<!-- 增加界面 -->
<h2>增加產品信息</h2>
<form action="AddProduceServlet" method="post">
产品名称:<input type="text" name="name"><br>
产品类型:<input type="text" name="lx"><br>
产品价钱:<input type="text"name="price"><br>
是否畅销: 是<input type="radio" name="yn" value="是">
否<input type="radio" name="yn" value="否"><br>
产品说明:<input type="text" name="note"><br>
<br><br>
<input type="submit" value="保存">
<input type="reset" value="重置">
</form>
</body>
</html>
up.jsp 修改产品信息的页面
<%@ page language="java" import="java.util.*,com.product.vo.Produce" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'up.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<% Produce p=(Produce)request.getAttribute("produce"); %>
</head>
<body>
<center>
<h2>修改产品信息</h2>
<form action="UpProduceServlet" method="post">
<input type="hidden" name="id" value="<%=p.getId()%>">
<table width="60%" border="1" cellpadding="0" cellspacing="0">
<tr>
<td style="height: 50px;text-align: center;">產品名稱</td>
<td><input type="text" name="name" value="<%=p.getName()%>"></td>
</tr>
<tr>
<td style="height: 50px;text-align: center;">產品類型</td>
<td><input type="text" name="name" value="<%=p.getLx()%>"></td>
</tr>
<tr>
<td style="height: 50px;text-align: center;">產品價格</td>
<td><input type="text" name="name" value="<%=p.getPrice()%>"></td>
</tr>
<tr>
<td style="height: 37px;text-align: center;">是否暢銷</td>
<td>
<%if("是".equals(p.getYn())){%>
是<input type="radio" name="yn" value="是" checked="checked" >
<%}else{%>
是<input type="radio" name="yn" value="是">
<%}%>
<%if("否".equals(p.getYn())){%>
否<input type="radio" name="yn" value="否" checked="checked" >
<%}else{%>
否<input type="radio" name="yn" value="否">
<%}%>
</td>
</tr>
<tr>
<td style="height: 50px;text-align: center;">商品說明</td>
<td><input type="text" name="name" value="<%=p.getNote()%>"></td>
</tr>
</table>
<br><br>
<input type="submit" value="保 存" >
</form>
</center>
</body>
</html>
15 .输入http://localhost:端口号/工程名/对应的Servlet类 or 某.jsp页面
例如: 输入http://localhost:9999/Product/ProductServlet
当然这里也可以直接访问工程名:http://localhost:9999/Product 在web.xml设置了默认跳转到ProductServlet
这里是展示所有产品数据的信息
点击添加按钮
跳转到添加产品信息的页面
添加相应的产品信息
信息添加成功
单击修改按钮
修改产品信息
修改成功
点击删除按钮
删除成功