狂神說Java【SMBMS】——SMBMS超市訂單管理系統(一) ——專案搭建準備工作
阿新 • • 發佈:2022-03-28
1.專案架構
2.資料庫設計
3.專案搭建
1、專案如何搭建?
-
是否使用maven?
- 使用maven要去網上找依賴
- 不使用maven要自己手動導jar包
為了方便,這個專案使用maven搭建
2、建立專案
- 使用maven模板建立一個maven專案
- 補全maven專案結構
- 更新WEB.XML的配置版本
<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"
metadata-complete="true">
</web-app>
-
清理pom.xml
只需要保留GAV+專案的打包方式即可
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.thhh</groupId>
<artifactId>smbms</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
</project>
3、配置Tomcat
4、測試專案是否搭建完成
測試通過!專案結構搭建完成
5、匯入依賴
用什麼匯入什麼,不一定要一次性全部匯入
<dependencies>
<!--servlet依賴-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--JSP依賴-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
</dependency>
<!--資料庫連線依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--JSTL標籤-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--JSTL標籤的依賴-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
6、建立專案包結構
- 首先建立一個總的包,命名"com.公司名"
- 在建立這個專案會使用的包
7、建立實體類/JavaBean/ORM對映
- 使用IDEA連線資料庫,按照資料庫中的表的結構來建立實體類
資料庫中有5張表,但是地址表沒有什麼用處,所以我們暫時不建立地址表對用的實體類
8、編寫資料庫操作的基礎公共類BaseDao
- 資料庫配置檔案,這是一個資原始檔,應該建立在maven專案的resources檔案中
DRIVER=com.mysql.jdbc.Driver
URL=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8
USERNAME=root
PASSWORD=123
- 使用靜態程式碼塊實現初始化引數
private static String DRIVER;
private static String URL;
private static String USERNAME;
private static String PASSWORD;
static {//靜態程式碼塊,在呼叫這個類的地方優先自動執行
//讀取配置檔案
//1、建立properties物件
Properties properties = new Properties();
//2、通過類載入器載入資原始檔為位元組輸入流
InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
try {
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
DRIVER = properties.getProperty("DRIVER");
URL = properties.getProperty("URL");
USERNAME = properties.getProperty("USERNAME");
PASSWORD = properties.getProperty("PASSWORD");
}
- 編寫資料庫操作的公共方法
package com.thhh.dao;
/**
* 注意理解這個類中的方法之所以要傳入這些資料庫操縱物件是因為為了統一的關閉資源
* 而傳入的物件中可以都是null,具體的物件獲取在方法裡面進行;也可以只有conn例項化,其他物件的例項化同樣放在具體的方法裡進行
*/
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
//操作資料庫的公共類
public class BaseDao {
private static String DRIVER;
private static String URL;
private static String USERNAME;
private static String PASSWORD;
//靜態程式碼塊用於初始化JDBC4大引數,且靜態程式碼塊只會在第一次呼叫這個類的時候執行一次
static {//靜態程式碼塊,在呼叫這個類的地方優先自動執行
//讀取配置檔案
//1、建立properties物件
Properties properties = new Properties();
//2、通過類載入器載入資原始檔為位元組輸入流
InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
try {
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
DRIVER = properties.getProperty("DRIVER");
URL = properties.getProperty("URL");
USERNAME = properties.getProperty("USERNAME");
PASSWORD = properties.getProperty("PASSWORD");
}
//1、編寫獲取資料庫的連線物件的公共方法
public static Connection getConnection(){
Connection conn= null;
try {
//1、載入驅動類
Class.forName(DRIVER);
//2、獲取連線物件
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
//2、編寫查詢公共方法 —— 注意查詢的結果返回為ResultSet結果集
/**
* 用於查詢資料的公共方法,注意:使用傳送SQL語句的物件為PreparedStatement
* @param sql:查詢的sql語句,由前端傳遞
* @param params:sql語句中佔位符的值
*
*===============這下面的3個引數之所以在呼叫的時候傳遞原因就在於這3個都是資源,我們需要關閉,如果我們直接在這個方法裡獲取資源物件的話,那麼我們就應該在這個方法中關閉資源===============
*===============但是呼叫處還在等待這個方法返回結果集,所以我們不應該在這個地方獲取這3個物件,而應該由調用出傳遞,這樣可以統一管理和關閉資源===============
*
* @param conn:調用出使用BaseDao.getConnection()獲取到資料庫連線物件傳入
* @param pstmt:調用出只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
* @param rs:返回的結果集,和pstmt只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
*
* @return:返回查詢到的結果集
*/
public static ResultSet executeQuery(String sql,Object[] params,Connection conn,PreparedStatement pstmt,ResultSet rs){
try {
pstmt = conn.prepareStatement(sql);
for (int i=1;i<= params.length;i++){//迴圈遍歷引數陣列,並將引數設入SQL中
pstmt.setObject(i,params[i-1]);//注意:陣列的index從0開始,而PreparedStatement中設定佔位符的值的index從1開始
}
rs = pstmt.executeQuery();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return rs;
}
//3、編寫修改公共方法
/**
* 用於修改資料的公共方法,注意:使用傳送SQL語句的物件為PreparedStatement
* @param sql:修改資料的sql語句模板
* @param params:模板中佔位符對應的值
*
* =====下面兩個物件需要調用出傳入也是為了統一管理和關閉資源=====
* @param conn:調用出使用BaseDao.getConnection()獲取到資料庫連線物件傳入
* @param pstmt:調用出只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
*
* @return 返回受影響的行數
*/
public static int executeUpdate(String sql,Object[] params,Connection conn,PreparedStatement pstmt){
int result = 0;
try {
pstmt = conn.prepareStatement(sql);
for (int i=1;i< params.length;i++){//迴圈遍歷引數陣列,並將引數設入SQL中
pstmt.setObject(i,params[i-1]);//注意:陣列的index從0開始,而PreparedStatement中設定佔位符的值的index從1開始
}
result = pstmt.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return result;
}
//4、編寫關閉資源公共方法
/**
* 關閉資源
* @param conn:調用出使用BaseDao.getConnection()獲取到資料庫連線物件傳入
* @param pstmt:調用出只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
* @param rs:返回的結果集,和pstmt只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
* @return:返回關閉資源的結果
*
* 注意:關閉資源的時候要倒著關
*/
public static boolean close(Connection conn,PreparedStatement pstmt,ResultSet rs){
boolean flag = true;
if (rs!=null){
try {
rs.close();
rs = null;//讓這個變數為null,gc就會自動對其進行回收
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;//關閉失敗就將flag設定false
}
}
if (pstmt!=null){
try {
pstmt.close();
pstmt = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;
}
}
if (conn!=null){
try {
conn.close();
conn = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;
}
}
return flag;//返回關閉結果
}
}
9、編寫字元編碼過濾器
//編寫過濾器
package com.thhh.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncoding implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request,response);
}
public void destroy() {
}
}
<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"
metadata-complete="true">
<!--註冊字元編碼過濾器-->
<filter>
<filter-name>CharacterEncoding</filter-name>
<filter-class>com.thhh.filter.CharacterEncoding</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
10、匯入靜態資源
包括HTML、CSS、JS等,注意:這些資源都是網站的,所以我們應該將這些資源放在webapp下面
通過以上的步驟,一個WEB專案的搭建工作就算基本完成了
1.專案架構
2.資料庫設計
3.專案搭建
1、專案如何搭建?
-
是否使用maven?
- 使用maven要去網上找依賴
- 不使用maven要自己手動導jar包
為了方便,這個專案使用maven搭建
2、建立專案
- 使用maven模板建立一個maven專案
- 補全maven專案結構
- 更新WEB.XML的配置版本
<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"
metadata-complete="true">
</web-app>
-
清理pom.xml
只需要保留GAV+專案的打包方式即可
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.thhh</groupId>
<artifactId>smbms</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
</project>
3、配置Tomcat
4、測試專案是否搭建完成
測試通過!專案結構搭建完成
5、匯入依賴
用什麼匯入什麼,不一定要一次性全部匯入
<dependencies>
<!--servlet依賴-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--JSP依賴-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
</dependency>
<!--資料庫連線依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--JSTL標籤-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--JSTL標籤的依賴-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
6、建立專案包結構
- 首先建立一個總的包,命名"com.公司名"
- 在建立這個專案會使用的包
7、建立實體類/JavaBean/ORM對映
- 使用IDEA連線資料庫,按照資料庫中的表的結構來建立實體類
資料庫中有5張表,但是地址表沒有什麼用處,所以我們暫時不建立地址表對用的實體類
8、編寫資料庫操作的基礎公共類BaseDao
- 資料庫配置檔案,這是一個資原始檔,應該建立在maven專案的resources檔案中
DRIVER=com.mysql.jdbc.Driver
URL=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8
USERNAME=root
PASSWORD=123
- 使用靜態程式碼塊實現初始化引數
private static String DRIVER;
private static String URL;
private static String USERNAME;
private static String PASSWORD;
static {//靜態程式碼塊,在呼叫這個類的地方優先自動執行
//讀取配置檔案
//1、建立properties物件
Properties properties = new Properties();
//2、通過類載入器載入資原始檔為位元組輸入流
InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
try {
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
DRIVER = properties.getProperty("DRIVER");
URL = properties.getProperty("URL");
USERNAME = properties.getProperty("USERNAME");
PASSWORD = properties.getProperty("PASSWORD");
}
- 編寫資料庫操作的公共方法
package com.thhh.dao;
/**
* 注意理解這個類中的方法之所以要傳入這些資料庫操縱物件是因為為了統一的關閉資源
* 而傳入的物件中可以都是null,具體的物件獲取在方法裡面進行;也可以只有conn例項化,其他物件的例項化同樣放在具體的方法裡進行
*/
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
//操作資料庫的公共類
public class BaseDao {
private static String DRIVER;
private static String URL;
private static String USERNAME;
private static String PASSWORD;
//靜態程式碼塊用於初始化JDBC4大引數,且靜態程式碼塊只會在第一次呼叫這個類的時候執行一次
static {//靜態程式碼塊,在呼叫這個類的地方優先自動執行
//讀取配置檔案
//1、建立properties物件
Properties properties = new Properties();
//2、通過類載入器載入資原始檔為位元組輸入流
InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
try {
properties.load(in);
} catch (IOException e) {
e.printStackTrace();
}
DRIVER = properties.getProperty("DRIVER");
URL = properties.getProperty("URL");
USERNAME = properties.getProperty("USERNAME");
PASSWORD = properties.getProperty("PASSWORD");
}
//1、編寫獲取資料庫的連線物件的公共方法
public static Connection getConnection(){
Connection conn= null;
try {
//1、載入驅動類
Class.forName(DRIVER);
//2、獲取連線物件
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
//2、編寫查詢公共方法 —— 注意查詢的結果返回為ResultSet結果集
/**
* 用於查詢資料的公共方法,注意:使用傳送SQL語句的物件為PreparedStatement
* @param sql:查詢的sql語句,由前端傳遞
* @param params:sql語句中佔位符的值
*
*===============這下面的3個引數之所以在呼叫的時候傳遞原因就在於這3個都是資源,我們需要關閉,如果我們直接在這個方法裡獲取資源物件的話,那麼我們就應該在這個方法中關閉資源===============
*===============但是呼叫處還在等待這個方法返回結果集,所以我們不應該在這個地方獲取這3個物件,而應該由調用出傳遞,這樣可以統一管理和關閉資源===============
*
* @param conn:調用出使用BaseDao.getConnection()獲取到資料庫連線物件傳入
* @param pstmt:調用出只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
* @param rs:返回的結果集,和pstmt只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
*
* @return:返回查詢到的結果集
*/
public static ResultSet executeQuery(String sql,Object[] params,Connection conn,PreparedStatement pstmt,ResultSet rs){
try {
pstmt = conn.prepareStatement(sql);
for (int i=1;i<= params.length;i++){//迴圈遍歷引數陣列,並將引數設入SQL中
pstmt.setObject(i,params[i-1]);//注意:陣列的index從0開始,而PreparedStatement中設定佔位符的值的index從1開始
}
rs = pstmt.executeQuery();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return rs;
}
//3、編寫修改公共方法
/**
* 用於修改資料的公共方法,注意:使用傳送SQL語句的物件為PreparedStatement
* @param sql:修改資料的sql語句模板
* @param params:模板中佔位符對應的值
*
* =====下面兩個物件需要調用出傳入也是為了統一管理和關閉資源=====
* @param conn:調用出使用BaseDao.getConnection()獲取到資料庫連線物件傳入
* @param pstmt:調用出只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
*
* @return 返回受影響的行數
*/
public static int executeUpdate(String sql,Object[] params,Connection conn,PreparedStatement pstmt){
int result = 0;
try {
pstmt = conn.prepareStatement(sql);
for (int i=1;i< params.length;i++){//迴圈遍歷引數陣列,並將引數設入SQL中
pstmt.setObject(i,params[i-1]);//注意:陣列的index從0開始,而PreparedStatement中設定佔位符的值的index從1開始
}
result = pstmt.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return result;
}
//4、編寫關閉資源公共方法
/**
* 關閉資源
* @param conn:調用出使用BaseDao.getConnection()獲取到資料庫連線物件傳入
* @param pstmt:調用出只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
* @param rs:返回的結果集,和pstmt只是傳入null的引用。這個物件真正的例項化放在這個方法裡面
* @return:返回關閉資源的結果
*
* 注意:關閉資源的時候要倒著關
*/
public static boolean close(Connection conn,PreparedStatement pstmt,ResultSet rs){
boolean flag = true;
if (rs!=null){
try {
rs.close();
rs = null;//讓這個變數為null,gc就會自動對其進行回收
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;//關閉失敗就將flag設定false
}
}
if (pstmt!=null){
try {
pstmt.close();
pstmt = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;
}
}
if (conn!=null){
try {
conn.close();
conn = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
flag = false;
}
}
return flag;//返回關閉結果
}
}
9、編寫字元編碼過濾器
//編寫過濾器
package com.thhh.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncoding implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request,response);
}
public void destroy() {
}
}
<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"
metadata-complete="true">
<!--註冊字元編碼過濾器-->
<filter>
<filter-name>CharacterEncoding</filter-name>
<filter-class>com.thhh.filter.CharacterEncoding</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
10、匯入靜態資源
包括HTML、CSS、JS等,注意:這些資源都是網站的,所以我們應該將這些資源放在webapp下面
通過以上的步驟,一個WEB專案的搭建工作就算基本完成了