SMBMS项目练习
超市订单管理系统
项目架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAKUGIhy-1616469649708)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210308163336705.png)]
项目数据库:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubFgrrn7-1616469649710)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210308164142452.png)]
如何创建项目
项目搭建
-
搭建一个maven web项目
-
配置tomcat
-
测试项目是否能跑起来
-
导入项目中会遇到的jar包
- jsp,servlet,mysql驱动,jstl,standard
-
创建项目包结构
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYaSnDna-1616469649712)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210308165854238.png)]
-
编写实体类:
ORM映射:表——》类
-
编写基础公共类
-
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306?useUnicode=true$characterEncoding=utf-8 username=root password=123456
-
编写数据库的公共类
package com.lv.dao; 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 username; private static String password; private static String url; //静态代码块,类加载的时候就初始化了 static { Properties properties = new Properties(); //通过类加载器读取对应的资源 InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties"); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } url=properties.getProperty("url"); driver=properties.getProperty("driver"); username=properties.getProperty("username"); password=properties.getProperty("password"); } //获取数据库连接 public static Connection getConnection(){ Connection connection=null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } return connection; } //编写查询公共类 public static ResultSet execute(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet,String sql,Object[] params) throws SQLException { preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { //setObject,?占位符从1开始,数组是从0开始的 preparedStatement.setObject(i+1,params[i]); } resultSet = preparedStatement.executeQuery(); return resultSet; } //编写增删改公共方法 public static int execute(Connection connection,PreparedStatement preparedStatement,String sql,Object[] params) throws SQLException { preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { //setObject,?占位符从1开始,数组是从0开始的 preparedStatement.setObject(i+1,params[i]); } int updateRows = preparedStatement.executeUpdate(); return updateRows; } //释放资源 public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){ boolean flag=true; if (resultSet!=null){ try { resultSet.close(); //gc回收 resultSet=null; } catch (SQLException throwables) { throwables.printStackTrace(); flag=false; } } if (preparedStatement!=null){ try { resultSet.close(); //gc回收 resultSet=null; } catch (SQLException throwables) { throwables.printStackTrace(); flag=false; } } if (connection!=null){ try { resultSet.close(); //gc回收 resultSet=null; } catch (SQLException throwables) { throwables.printStackTrace(); flag=false; } } return true; } }
-
编写字符编码过滤器
-
-
导入静态资源
登录功能实现
-
编写前端代码
-
设置首页
<welcome-file-list>//设置login.jsp为打开的首页 <welcome-file>/login.jsp</welcome-file> </welcome-file-list>
-
业务层接口
package com.lv.service.user; import com.lv.pojo.User; public interface UserService { //用户登录 public User login(String userCode,String password); }
-
业务层实现
package com.lv.service.user; import com.lv.dao.BaseDao; import com.lv.dao.user.UserDao; import com.lv.dao.user.UserDaoImpl; import com.lv.pojo.User; import org.junit.Test; import java.sql.Connection; import java.sql.SQLException; public class UserServiceImpl implements UserService{ //业务都会调用Dao层,所以我们需要引入Dao层 private UserDao userDao; public UserServiceImpl(){ userDao=new UserDaoImpl(); } @Override public User login(String userCode, String password) { Connection connection=null; User user=null; connection= BaseDao.getConnection(); try { user = userDao.getLoginUser(connection, userCode); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { BaseDao.closeResource(connection,null,null); } return user; } @Test public void test(){ UserServiceImpl userService = new UserServiceImpl(); User admin = userService.login("admin", "566"); System.out.println(admin.getUserPassword()); } }
-
编写servlet
package com.lv.servlet.user; import com.lv.pojo.User; import com.lv.service.user.UserService; import com.lv.service.user.UserServiceImpl; import com.lv.util.Constants; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginServlet extends HttpServlet { //Servlet:控制层调用业务层 private UserService userService; public LoginServlet(){ userService=new UserServiceImpl(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("LoginServlet------start-----"); String userCode = req.getParameter("userCode"); String userPassword = req.getParameter("userPassword"); User user = userService.login(userCode, userPassword);//已经能查询到登录的用户 if (user != null) {//查询到有这个用户 //将用户的信息放入session; req.getSession().setAttribute(Constants.USER_SESSION, user); resp.sendRedirect("jsp/frame.jsp"); } else {//没有查询到此人,无法登录 并转发回登录页面,并提示用户名或者密码错误 req.setAttribute("error","用户名或者密码不正确"); req.getRequestDispatcher("login.jsp").forward(req, resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
注册
-
登录功能优化
注销:
package com.lv.servlet.user;
import com.lv.util.Constants;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().removeAttribute(Constants.USER_SESSION);
resp.sendRedirect("/login.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
登录拦截优化:实现在还没登录的情况下不能进入系统和其他的操作页面
package com.lv.filter;
import com.lv.util.Constants;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req1=(HttpServletRequest)req;
HttpServletResponse resp1=(HttpServletResponse)resp;
Object attribute = req1.getSession().getAttribute(Constants.USER_SESSION);
if (attribute==null){
resp1.sendRedirect("/error.jsp");
}
chain.doFilter(req,resp);
}
@Override
public void destroy() {
}
}
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.lv.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
密码修改
写项目从底层向上写
-
UserDao接口
//修改当前用户密码 public int updateUserPassword(Connection connection,int id,String password)throws SQLException;
-
UserDaoImpl接口实现类
//修改当前用户的密码 @Override public int updateUserPassword(Connection connection, int id, String password) throws SQLException { PreparedStatement preparedStatement=null; String sql="update smbms_user set userPassword=?where id=?"; Object[] params={password,id}; int execute = 0; if (connection!=null){ execute = BaseDao.execute(connection, preparedStatement, sql, params); BaseDao.closeResource(null,preparedStatement,null); } return execute; }
-
UserService接口层;
//修改当前用户密码 public boolean updateUserPassword(int id, String pwd);
-
UserService接口层实现类
//修改密码成功返回true,否则返回false @Override public boolean updateUserPassword(int id, String pwd) { Connection connection=null; User user=null; boolean flag=false; try { connection=BaseDao.getConnection(); //判断是否成功 if (userDao.updatePwd(connection,id,pwd)>0){ flag=true; } } catch (SQLException throwables) { throwables.printStackTrace(); }finally { BaseDao.closeResource(connection,null,null); } return flag; }
5.Servlet
\package com.lv.servlet.user; import com.lv.pojo.User; import com.lv.service.user.UserService; import com.lv.service.user.UserServiceImpl; import com.lv.util.Constants; import com.mysql.jdbc.StringUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class UserServlet extends HttpServlet { private UserService userService; public UserServlet(){ userService=new UserServiceImpl(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //从session里拿id boolean flag=false; Object attribute = req.getSession().getAttribute(Constants.USER_SESSION); String newpassword = req.getParameter("newpassword"); User user=(User)attribute; System.out.println(user.getUserCode()); System.out.println(user.getUserPassword()); Integer id = user.getId(); System.out.println("id为"+id); System.out.println("这是"+attribute); System.out.println(newpassword); System.out.println(!StringUtils.isNullOrEmpty(newpassword)+"!StringUtils.isNullOrEmpty(newpassword) 不为空"); System.out.println("id不等于空"+id!=null); if (id!=null&&!(StringUtils.isNullOrEmpty(newpassword))){ flag = userService.updateUserPassword(id,newpassword); System.out.println("进入了"); System.out.println("flag="+flag); if (flag){ req.setAttribute("message","密码修改成功,请退出使用新密码登录"); //当密码修改成功后需要移除session req.getSession().removeAttribute(Constants.USER_SESSION); }else { req.setAttribute("message","密码修改失败,请重新修改"); } }else { req.setAttribute("message","您的新密码设置不符合规范"); } req.getRequestDispatcher("/jsp/pwdmodify.jsp").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
servlet复用
需要提取doget的内容成一个方法,然后丢入req,resp,的参数然后在doget里调用方法,为了程序的安全性,还需要添加一些判断
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getParameter("method");
if (method!=null&&method.equals("savepwd")){
this.updateUserPassword(req,resp);
}
}
优化密码修改使用Ajax
public void pwdModify(HttpServletRequest req, HttpServletResponse resp){
Object o = req.getSession().getAttribute(Constants.USER_SESSION);
String oldpassword=req.getParameter("oldpassword");
//使用Map存放错误信息 一切的东西都可以用Map
Map<String, String> resultHashMap = new HashMap<String, String>();
if (o==null){//网站session过期了 真实业务有的需求
resultHashMap.put("result","sessionerror");
}else if (StringUtils.isNullOrEmpty(oldpassword)){//输入密码为空
resultHashMap.put("result","error");
}else {
boolean equals = ((User) o).getUserPassword().equals(oldpassword);//session中的密码和填入的旧密码验证是否相同
if (equals){
resultHashMap.put("result","true");
}else {
resultHashMap.put("result","false");
}
}
try {
resp.setContentType("application/json");
PrintWriter writer = resp.getWriter();
//JSONArray阿里巴巴的json工具类,转换格式
writer.write(JSONArray.toJSONString(resultHashMap));
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
用户管理实现
导入分页的工具类
用户列表页面的导入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vv39TzCe-1616469649714)(SMBMS项目练习.assets/image-20210311170918310.png)]
分成三条线路来解决
1、获取用户数量
-
UserDao
//查询用户总数 public int getUserCount(Connection connection,String userCode,int userRole)throws SQLException;
-
UserDaoImpl
//根据用户用或者角色查询总数 @Override public int getUserCount(Connection connection, String userCode, int userRole) throws SQLException { PreparedStatement preparedStatement=null; ResultSet resultSet=null; ArrayList<Object> list = new ArrayList<Object>(); int count=0; if (connection!=null){ StringBuffer sql = new StringBuffer(); sql.append("select count(1) as count from smbms_user u,smbms_role r where u.userRole = r.id"); if (!StringUtils.isNullOrEmpty(userCode)){ sql.append(" and u.userCode like?"); list.add("%"+userCode+"%"); } if (userRole>0){ sql.append(" and u.userRole = ?"); list.add(userRole); } Object[] params = list.toArray(); resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql.toString(), params); if (resultSet.next()){ count = resultSet.getInt("count");//从结果集中获取最终的数量 } System.out.println("完整的"+sql); BaseDao.closeResource(null,preparedStatement,resultSet); } return count; }
-
UserService
//查询出用户的计数 public int getUserCount(String userName,int userRole);
-
UserServiceImpl
//查询记录的数量 @Override public int getUserCount(String userName, int userRole) { Connection connection=null; connection = BaseDao.getConnection(); int userCount=0; try { userCount = userDao.getUserCount(connection, userName, userRole); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { BaseDao.closeResource(connection,null,null); } return userCount; }
2.获取用户列表
-
UserDao
//通过条件查询获取用户列表得到userList public List<User> getUserList(Connection connection,String userName,int userRole,int currentPageNo,int PageSize) throws SQLException;
-
UserDaoImpl
/获取用户列表 @Override public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize) throws SQLException { PreparedStatement preparedStatement=null; List<User> userList=null; ResultSet resultSet=null; List<Object> objects = new ArrayList<Object>(); if (connection!=null){ StringBuffer sql = new StringBuffer(); sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole =r.id"); if (userName!=null){ sql.append(" and userCode like ?"); objects.add("%"+userName+"%"); } if (userRole>0){ sql.append(" and userRole = ?"); objects.add(userRole); } // order by排序 DESC降序 limit ?,? 展示从?开始的?个数据之后开始分页 sql.append(" order by creationDate DESC limit ?,?"); currentPageNo=(currentPageNo-1)*pageSize; objects.add(currentPageNo); objects.add(pageSize); Object[] params = objects.toArray(); ResultSet execute = BaseDao.execute(connection, preparedStatement, resultSet, sql.toString(), params); while (execute.next()){ User _user = new User(); _user.setId(resultSet.getInt("id")); _user.setUserCode(resultSet.getString("userCode")); _user.setUserName(resultSet.getString("userName")); _user.setUserPassword(resultSet.getString("userPassword")); _user.setGender(resultSet.getInt("gender")); _user.setBirthday(resultSet.getDate("birthday")); _user.setPhone(resultSet.getString("phone")); _user.setAddress(resultSet.getString("address")); _user.setUserRole(resultSet.getInt("userRole")); _user.setCreatedBy(resultSet.getInt("createdBy")); _user.setCreationDate(resultSet.getTimestamp("creationDate")); _user.setModifyBy(resultSet.getInt("modifyBy")); _user.setModifyDate(resultSet.getTimestamp("modifyDate")); userList.add(_user); } BaseDao.closeResource(null,preparedStatement,resultSet); System.out.println(sql.toString()); } return userList; }
-
UserService
//更具条件查询用户列表 public List<User> getUserList(String userName,int userRole,int currentPageNo,int PageSize);
-
UserServiceImpl
//查询用户列表 @Override public List<User> getUserList(String userName, int userRole, int currentPageNo, int PageSize) { Connection connection =null; List<User> userList=null; try { connection=BaseDao.getConnection(); userList = userDao.getUserList(connection, userName, userRole, currentPageNo, PageSize); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { BaseDao.closeResource(connection,null,null); } return userList; }
3、获取校色操作
为了职责统一,把角色放在单独的包下,和POJO类对应,记得 service在调用Dao层的时候 静态的引入、
1.
//获取角色列表
public List<Role> getRoleList(Connection connection)throws SQLException;
2.
@Override
public List<Role> getRoleList(Connection connection) throws SQLException {
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
Object[] params=null;
ArrayList<Role> roleList = new ArrayList<Role>();
if (connection!=null){
String sql="select * from smbms_role";
resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql, params);
while (resultSet.next()){
Role role = new Role();
role.setId(resultSet.getInt("id"));
role.setId(resultSet.getInt("roleCode"));
role.setId(resultSet.getInt("roleName"));
roleList.add(role);
}
BaseDao.closeResource(null,preparedStatement,resultSet);
}
return roleList;
}
3.
//查询角色列表
public List<Role> getRoleList();
4.
public class RoleServiceImpl implements RoleService {
private RoleDao roleDao;
public RoleServiceImpl(){
roleDao=new RoleDaoImpl();
}
//获取角色列表
@Override
public List<Role> getRoleList() {
Connection connection=null;
connection= BaseDao.getConnection();
List<Role> roleList=null;
try {
roleList = roleDao.getRoleList(connection);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
BaseDao.closeResource(connection,null,null);
}
return roleList;
}
}