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項目的搭建工作就算基本完成了