商品項目流程分析
| 流程分析
l 數據庫建立
Create table goods { id int auto_increment primary key, `name` varchar(50), price double, count int, desc varchar(1000) } |
l 源碼結構與頁面建立
源 碼 結 構
|
|--com.phome.model 封裝項目中使用的具體的數據的包 --Goods 商品屬性類 |--com.phome.dbhelper 管理數據庫連接,執行sql語句的包 --ConnectionManager.java 進行數據操作 --DbHelper.java 操作數據庫的類 |--com.phome.dao 數據訪問對象,負責增刪改查具體的包裝數據包 --DAO 數據操作的超級接口 |--com.phome.dao.impl 實現數據訪問對象超級接口的包 --DAO 數據操作的超級接口 |--com.phome.service 業務處理層,負責具體的業務功能邏輯的包 --Service 業務處理層的超級接口 |--com.phome.service.impl 實現業務處理層的包 --Service 業務處理層的超級接口 |--com.phome.filter 過濾器包 --CharacterFilter 過濾器類 |--com.phome.servlet 控制器包 --GoodsServlet 商品控制器類 |--com.phome.util 用來處理重複出現語句以及一些方法的包 --FindType |
頁 面 結 構 |
|--index 添加商品主頁 |--success 添加商品成功 |--failed 添加商品失敗 |
l 代碼設計
* 首先寫操作數據庫的類
ConnectionManager
public class ConnectionManager {
// 1.加載驅動
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.err.println("數據庫驅動加載失敗..." + e.getMessage());
}
}
// 2.獲取連接
public static Connection getConn() throws SQLException{
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/pxhome" ,"root","root");
return conn;
}
// 3.釋放連接
public static void free(Connection conn){
try {
if(conn != null && !conn.isClosed()){
conn.close();
conn = null;
}
} catch (SQLException e) {
System.err.println("數據庫連接關閉失敗..." + e.getMessage());
}
}
}
* 其次寫DBHelper
public class DBHelper {
private Connection conn;
private ResultSet rs;
private PreparedStatement pstat;
/**
* 處理增 ,刪,改語句的方法
* @param conn
* @param sql
* @param objs
* @return
* @throws SQLException
*/
public int excuteSQL(Connection conn , String sql , Object...objs) throws SQLException{
// 建立預編譯對象
pstat = conn.prepareStatement(sql);
setParameters(objs);
return pstat.executeUpdate();
}
/**
* 處理查詢語句的方法
* @param conn
* @param sql
* @param objs
* @return
* @throws SQLException
*/
public ResultSet excuteQuery(Connection conn , String sql , Object...objs) throws SQLException{
// 創建預編譯對象
pstat = conn.prepareStatement(sql);
setParameters(objs);
rs = pstat.executeQuery();
return rs;
}
// 私有的賦值方法
private void setParameters(Object...objs) throws SQLException{
if(objs != null && objs.length > 0){
for (int i = 0; i < objs.length; i++) {
pstat.setObject(i + 1, objs[i]);
}
}
}
}
*最後按照以下步驟寫類
1.model
package com.phome.model;
/**
* 商品的屬性類
* @author ChenLiYun
*
*/
public class Goods {
private int id; // 商品編號
private String name; // 商品名稱
private double price; // 商品價格
private int count; // 商品庫存
private String desc; // 商品描述
// 構造方法
public Goods() {
super();
}
public Goods(int id, String name, double price, int count, String desc) {
super();
this.id = id;
this.name = name;
this.price = price;
this.count = count;
this.desc = desc;
}
public Goods(String name, double price, int count, String desc) {
super();
this.name = name;
this.price = price;
this.count = count;
this.desc = desc;
}
// 提供外界訪問的方法
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 double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
2.dao
package com.phome.dao;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import com.phome.util.FindType;
/**
* 數據訪問對象的超級接口
* @author ChenLiYun
*
*/
public interface DAO<T> {
int add(Connection conn , T t) throws SQLException ;
int delete(Connection conn , int id) throws SQLException ;
int update(Connection conn , T t) throws SQLException ;
List<T> findAll(Connection conn) throws SQLException ;
T findById(Connection conn , int id) throws SQLException ;
List<T> findByCondition(Connection conn , FindType type , Object ... objs) throws SQLException ;
}
3.dao.impl
package com.phome.dao.impl;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import com.phome.dao.DAO;
import com.phome.dbhelper.ConnectionManager;
import com.phome.dbhelper.DBHelper;
import com.phome.model.Goods;
import com.phome.util.FindType;
/**
* 實現訪問數據的類
* @author ChenLiYun
*
*/
public class GoodsDAOImpl implements DAO<Goods>{
private String sql = "";
private ResultSet rs;
private DBHelper dh = new DBHelper();
@Override
public int add(Connection conn, Goods goods) throws SQLException {
// 定義sql語句
sql = "insert into goods(`name`,price,count,`desc`) values(?,?,?,?);";
// 獲取數據庫連接
conn = ConnectionManager.getConn();
System.out.println(goods.getName() + "/*/*/*/*/*/*/");
// 執行sql語句
int rows = dh.excuteSQL(conn, sql, goods.getName(),
goods.getPrice(),
goods.getCount(),
goods.getDesc());
if(rows > 0){
System.out.println("添加成功");
return rows;
}else{
System.out.println("添加失敗");
return 0;
}
}
@Override
public int delete(Connection conn, int id) throws SQLException {
return 0;
}
@Override
public int update(Connection conn, Goods t) throws SQLException {
return 0;
}
@Override
public List<Goods> findAll(Connection conn) throws SQLException {
return null;
}
@Override
public Goods findById(Connection conn, int id) throws SQLException {
// 定義sql語句
sql = "select * from goods where id=?";
// 獲取連接
conn = ConnectionManager.getConn();
// 執行sql語句
rs = dh.excuteQuery(conn, sql, id);
Goods goods = null;
while(rs.next()){
goods = new Goods();
goods.setId(rs.getInt("id"));
goods.setName(rs.getString("name"));
goods.setPrice(rs.getDouble("price"));
goods.setCount(rs.getInt("count"));
goods.setDesc(rs.getString("desc"));
}
return goods;
}
@Override
public List<Goods> findByCondition(Connection conn, FindType type,
Object... objs) throws SQLException {
return null;
}
}
4.service
package com.phome.service;
import com.phome.model.Goods;
/**
* 處理業務層的類
* @author ChenLiYun
*
*/
public interface GoodsService {
int addGoods(Goods goods);
Goods findById(int id);
}
5.service.impl
package com.phome.service.impl;
import java.sql.Connection;
import java.sql.SQLException;
import com.phome.dao.DAO;
import com.phome.dao.impl.GoodsDAOImpl;
import com.phome.dbhelper.ConnectionManager;
import com.phome.model.Goods;
import com.phome.service.GoodsService;
/**
* 實現處理業務層的類
* @author ChenLiYun
*
*/
public class GoodsServiceImpl implements GoodsService{
private DAO gdi = new GoodsDAOImpl();
private Connection conn;
/**
* 添加商品
*/
@Override
public int addGoods(Goods goods) {
try {
// 獲取連接
conn = ConnectionManager.getConn();
// 調用方法
return gdi.add(conn, goods);
} catch (SQLException e) {
e.printStackTrace();
}finally{
// 關閉連接
ConnectionManager.free(conn);
}
return -1;
}
/**
* 查找商品
*/
@Override
public Goods findById(int id) {
try {
conn = ConnectionManager.getConn();
return (Goods) gdi.findById(conn, id);
} catch (SQLException e) {
e.printStackTrace();
}finally{
// 關閉連接
ConnectionManager.free(conn);
}
return null;
}
}
6.servlet
package com.phome.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.phome.model.Goods;
import com.phome.service.GoodsService;
import com.phome.service.impl.GoodsServiceImpl;
/**
* 商品類型控制器
* @author ChenLiYun
*
*/
public class GoodsServlet extends HttpServlet{
private GoodsServiceImpl gsi = new GoodsServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 獲取請求中執行的不同的功能
String method = req.getParameter("method");
System.out.println(method + "-------------------");
if ("add".equals(method)) {
add(req, resp);
} else if ("delete".equals(method)) {
delete(req, resp);
}else if ("update".equals(method)) {
update(req, resp);
}else if (method.startsWith("find")) {
find(req, resp);
}
}
// 增加通道
private void add(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 獲取頁面數據
String name = req.getParameter("goodsname");
System.out.println(name + "******");
String price = req.getParameter("goodsprice");
String count = req.getParameter("goodscount");
String desc = req.getParameter("goodsdesc");
System.out.println(desc + "******");
// 創建一個商品對象
Goods goods = new Goods(name , Double.parseDouble(price) , Integer.parseInt(count) , desc);
// 調用業務處理方法,上架商品
int id = gsi.addGoods(goods);
// 根據執行結果跳轉到不同的頁面
if(id == -1) {
resp.sendRedirect("failed.jsp");
} else {
goods = gsi.findById(id);// 根據id獲取到數據庫中的商品
req.setAttribute("currentGoods", goods);// 存放到request空間中
req.getRequestDispatcher("success.jsp").forward(req, resp);
}
}
//刪除
private void delete(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 獲取請求中執行的不同的功能,進行分發
}
//修改
private void update(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 獲取請求中執行的不同的功能,進行分發
}
//查詢
private void find(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 獲取請求中執行的不同的功能,進行分發
}
}
7.filter
package com.phome.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 編碼過濾器
* @author ChenLiYun
*
*/
public class CharacterFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
req.setCharacterEncoding("Gb18030");
resp.setContentType("text/html;charset=gb18030");
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
8.util
package com.phome.util;
/**
* 查找類型的枚舉
* @author ChenLiYun
*
*/
public class FindType {
}
*運行方法
首先啓動服務器也就是tomcat後在瀏覽器頁面輸入http://localhost:8080/shopping,回車後出現以下頁面
輸入商品信息後點擊提交按鈕如果添加成功就會跳轉到success.jsp頁面並打印相關商品信息,否則跳轉到添加失敗頁面failed.jsp