狂神说Java【SMBMS】——SMBMS超市订单管理系统(一) ——项目搭建准备工作
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项目的搭建工作就算基本完成了