超市管理系统smbms
首先考虑用不用maven
如果不用maven就要导入jar包
如果用maven就注入依赖
用maven搭建一个项目
- IDEA创建一个新的maven-javaweb项目
- 补全项目目录:java resources
- pom.xml文件中注入依赖:mysql,servlet…
- 配置tomcat,测试能否成功启动
- 创建项目的数据库
-
构建项目包结构
-
编写实体类:
数据库表和类映射 -
编写基础公共类
-
数据库配置文件(db.properties)
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&useSSL=true&characterEncoding=utf-8
username=root
password=l15075880525
- 编写数据库的公共类
package com.liu.dao;
import com.mysql.cj.jdbc.Driver;
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;
//静态代码块,累加载时就执行
static {
try {
//类的类加载器读取资源文件输入流
InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();//新建一个properties对象
properties.load(in);//properties加载文件输入流
driver = properties.getProperty(BaseDao.driver);//获取文件中的值
url = properties.getProperty(BaseDao.url);
username = properties.getProperty(BaseDao.username);
password = properties.getProperty(BaseDao.password);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取数据库连接
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName(driver);//加载驱动
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//编写查询公共类
public static ResultSet execute(Connection conn,String sql,Object[] params,ResultSet resultSet,PreparedStatement preparedStatement) throws SQLException {
//创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。
preparedStatement = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {//数组中存的是sql语句中的参数
preparedStatement.setObject(i+1,params[i]);
}
resultSet = preparedStatement.executeQuery();//执行sql语句
return resultSet;//返回一个字符集
}
//编写增删改公共类
public static int execute(Connection conn,String sql,Object[] params,int updateRows,PreparedStatement preparedStatement) throws SQLException {
//创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。
preparedStatement = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preparedStatement.setObject(i+1,params[i]);
}
updateRows = preparedStatement.executeUpdate();//返回的是受增删改影响的行数
return updateRows;
}
//关闭连接释放资源
public static boolean close(ResultSet resultSet,PreparedStatement preparedStatement,Connection connection) {
boolean flag=true;//给一个标志位,如果正常关闭返回true,如果任何一个抛出异常都返回false
if(resultSet!=null){
try {
resultSet.close();
//GC回收
resultSet=null;
} catch (SQLException e) {
e.printStackTrace();
flag=false;
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
//GC回收
preparedStatement=null;
} catch (SQLException e) {
e.printStackTrace();
flag=false;
}
}
if(connection!=null){
try {
connection.close();
//GC回收
connection=null;
} catch (SQLException e) {
e.printStackTrace();
flag=false;
}
}
return flag;
}
}
- 编写字符编码过滤器
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
filterChain.doFilter(servletRequest,servletResponse);
}
- 配置字符编码过滤器的映射
<!--字符编码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.liu.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
<!--访问所有路径时都要通过字符编码过滤器-->
</filter-mapping>
实现登录功能
- 导入静态资源,设置首页为登录界面
<!-- 设置服务器启动首页为登录页面-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
- 编写数据库Dao层接口
public interface UserDao {
public User getLoginUser(Connection connection, String userCode,String userPassword) throws SQLException;
//参数一个数据库连接,一个是用户编码,也就是登录的账号
}
- 编写UserDao实现类
//UserDao接口的实现类
public class UserDaoImpl implements UserDao{
@Override
//持久层只做查询数据库的内容
//传入两个参数,如果连接不为空,就去数据库中根据给的参数用户编码去查,返回一个User对象
public User getLoginUser(Connection connection, String userCode,String userPassword) throws SQLException {
//准备三个对象
PreparedStatement pstm = null;
ResultSet rs = null;
User user = null;
//判断是否连接成功
if(connection!=null ){//如果连接成功
String sql = "select * from smbms_user where userCode=? and userPassword=?";
Object[] params = {userCode,userPassword};
rs = BaseDao.execute(connection, pstm, rs, sql, params);//调用BaseDao的查询方法返回一个字符集
if(rs.next()){
user = new User();
user.setId(rs.getInt("id"));
user.setUserCode(rs.getString("userCode"));
user.setUserName(rs.getString("userName"));
user.setUserPassword(rs.getString("userPassword"));
user.setGender(rs.getInt("gender"));
user.setBirthday(rs.getDate("birthday"));
user.setPhone(rs.getString("phone"));
user.setAddress(rs.getString("address"));
user.setUserRole(rs.getInt("userRole"));
user.setCreatedBy(rs.getInt("createdBy"));
user.setCreationDate(rs.getTimestamp("creationDate"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getTimestamp("modifyDate"));
}
BaseDao.closeResource(null, pstm, rs);//connection不要关,因为有可能业务层用到
}
return user;
}
/* @Test
public void Test() throws SQLException {
User admin = getLoginUser(BaseDao.getConnection(), "admin");
System.out.println(admin.getUserPassword());
}*/
}
- 业务层接口
//业务层接口
public interface UserService {
//用户登录
public User login(String userCode, String userPassword);
}
- 业务层实现类
public class UserServiceImpl implements UserService{
//业务层都会调用dao层.所以我们要引入Dao层(重点)
//只处理对应业务
private UserDao userDao;
public UserServiceImpl(){//无参构造,当前类初始化时,UserDaoImpl同时初始化
userDao = new UserDaoImpl();
}
@Override
public User login(String userCode,String userPassword) {
// TODO Auto-generated method stub
Connection connection = null;
//通过业务层调用对应的具体数据库操作
User user = null;
try {
connection = BaseDao.getConnection();//获得数据库连接
user = userDao.getLoginUser(connection, userCode,userPassword);
//这里已经连接了数据库,并得到用户编码,去调用Dao层的方法,返回一个用户
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
BaseDao.closeResource(connection, null, null);
//Dao层已经关闭了prepareStatement,resultSet,所以这里关闭数据库连接就好
}
return user;
}
/* @Test
public void test() {
UserServiceImpl userService = new UserServiceImpl();
String userCode = "admin";
String userPassword = "12345678";
User admin = userService.login(userCode, userPassword);
System.out.println(admin.getUserPassword());
}*/
}
- servlet实现类
public class LoginServlet extends HttpServlet {
//接受用户参数、调用业务层、转发视图
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
// TODO 自动生成的方法存根
System.out.println("login ============ " );
//获取用户名和密码
String userCode = req.getParameter("userCode");
String userPassword = req.getParameter("userPassword");
//调用service方法,进行用户匹配
UserService userService = new UserServiceImpl();
User user = userService.login(userCode,userPassword);
if(null != user){//登录成功
//放入session
req.getSession().setAttribute(Constants.USER_SESSION,user);
//页面跳转(frame.jsp)
resp.sendRedirect("jsp/frame.jsp");
}else{
//页面跳转(login.jsp)带出提示信息--转发
req.setAttribute("error", "用户名或密码不正确");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
// TODO 自动生成的方法存根
doGet(req, resp);
}
}