SMBMS
前端资源
链接:百度云连接
提取码:8080
项目搭建准备工作
登录功能实现
登陆功能优化
注销功能:
思路:移除Session,返回页面
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//移除用户的Constant.USER_SESSION
req.getSession().removeAttribute(Constants.USER_SESSION);
resp.sendRedirect("/login.jsp"); //返回登陆页面
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注册xml
servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>com.chanv.servlet.user.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/jsp/logout.do</url-pattern>
</servlet-mapping>
登陆拦截优化
编写一个过滤器并注册
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 request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//过滤器,从Session中获取用户
User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);
if (user == null){ //已经被移除或注销了,或者未登录
response.sendRedirect("smbms/error.jsp");
}else {
chain.doFilter(req, resp);
}
}
@Override
public void destroy() {
}
}
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.chanv.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
测试,登陆,注销,权限,都要保证OK!
密码修改
1、导入前端素材
<li><a href="../jsp/pwdmodify.jsp">密码修改</a></li>
2、写项目,建议从底层往上写
3、UserDao接口
//修改当前用户密码
public int updatePwd(Connection connection, int id, String password) throws SQLException;
4、接口实现类
//修改当前用户密码
@Override
public int updatePwd(Connection connection, int id, String password) throws SQLException {
PreparedStatement pstm = null;
int execute = 0;
if (connection != null){
String sql = "update smbms_user set userPassword = ? where id = ?";
Object params[] = {password, id};
execute = BaseDao.execute(connection, pstm, sql, params);
BaseDao.closeResource(null, pstm, null);
}
return execute;
}
5、UserService层
//根据用户id修改密码
public boolean updatePwd(int id, String password);
6、UserService实现类
@Override
public boolean updatePwd(int id, String password) {
Connection connection = null;
boolean flag = false;
//修改密码
try {
connection = BaseDao.getConnection();
if (userDao.updatePwd(connection, id, password) > 0){
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeResource(connection, null, null);
}
return flag;
}
7、Servlet记得实现复用,需要提取出方法!
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getParameter("method");
if (method.equals("savepwd") && method != null){
this.updatePwd(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
//从Session里面拿ID;
User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
String newpassword = req.getParameter("newpassword");
System.out.println("UserServlet"+newpassword);
boolean flag = false;
if (user != null && !StringUtils.isNullOrEmpty(newpassword)){
UserService userService = new UserServiceImpl();
flag = userService.updatePwd(user.getId(), newpassword);
if (flag){
req.setAttribute("message", "修改密码成功,请退出,使用新密码登陆");
//密码修改成功,移除当前Session
req.getSession().removeAttribute(Constants.USER_SESSION);
}else {
System.out.println("密码修改失败");
req.setAttribute("message", "密码修改失败");
//密码修改成功,移除当前Session
}
}else {
System.out.println("新密码有问题");
req.setAttribute("message", "新密码有问题");
}
try {
resp.sendRedirect("pwdmodify.jsp");
} catch (IOException e) {
e.printStackTrace();
}
//req.getRequestDispatcher("pwdmodify.jsp").forward(req, resp);
}
}
8、测试
优化密码修改使用Ajax
1、阿里巴巴的fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
2、后台代码修改
//修改密码
public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
//从Session里面拿ID;
User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
String newpassword = req.getParameter("newpassword");
System.out.println("UserServlet"+newpassword);
boolean flag = false;
if (user != null && !StringUtils.isNullOrEmpty(newpassword)){
UserService userService = new UserServiceImpl();
flag = userService.updatePwd(user.getId(), newpassword);
if (flag){
req.setAttribute("message", "修改密码成功,请退出,使用新密码登陆");
//密码修改成功,移除当前Session
req.getSession().removeAttribute(Constants.USER_SESSION);
}else {
System.out.println("密码修改失败");
req.setAttribute("message", "密码修改失败");
//密码修改成功,移除当前Session
}
}else {
System.out.println("新密码有问题");
req.setAttribute("message", "新密码有问题");
}
try {
resp.sendRedirect("pwdmodify.jsp");
//req.getRequestDispatcher("pwdmodify.jsp").forward(req, resp);
} catch (IOException e) {
e.printStackTrace();
}
}
//验证旧密码,session中有用户的密码
public void pwdModify(HttpServletRequest req, HttpServletResponse resp){
//从Session里面拿ID;
User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
String oldpassword = req.getParameter("oldpassword");
//万能的Map:结果集
HashMap<String, String> resultMap = new HashMap<String, String>();
if (user == null){ //Session失效了,session过期
resultMap.put("result", "sessionerror");
}else if (StringUtils.isNullOrEmpty(oldpassword)){ //输入的密码为空
resultMap.put("result", "error");
}else {
String userPassword = user.getUserPassword(); //session中用户的密码
if (oldpassword.equals(userPassword)){
resultMap.put("result", "true");
}else {
resultMap.put("result", "false");
}
}
try {
resp.setContentType("application/json");
PrintWriter writer = resp.getWriter();
//JsonArray 阿里巴巴的JSON工具类,转换格式
/*
resultMap = ["result", "sessionerror", "result", "error"]
Json格式 = {key: value}
* */
writer.write(JSONArray.toJSONString(resultMap));
} catch (IOException e) {
e.printStackTrace();
}
}
3、测试
用户管理实现
思路
-
导入分页的工具类
-
用户列表页面导入
userlist
1、获取用户数量
①、UserDao
//根据用户名或角色查询用户总数
public int getUserCount(Connection connection, String username, int userRole) throws SQLException;
②、UserDaoImpl
//根据用户名或角色查询用户总数【最难理解的SQL】
@Override
public int getUserCount(Connection connection, String username, int userRole) throws SQLException {
PreparedStatement pstm = null;
ResultSet rs = null;
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 ");
ArrayList<Object> list = new ArrayList<>();//存放我们的参数
if (!StringUtils.isNullOrEmpty(username)){
sql.append("and u.userName like ?");
list.add("%" + username + "%"); //index:0
}
if (userRole > 0){
sql.append("and u.userRole = ?");
list.add(userRole);
}
//怎么把List转换为数组
Object[] params = list.toArray();
System.out.println("UserDaoImpl->getUserCount:" + sql.toString()); //输出最后完整的SQL语句
rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
if (rs.next()){
count = rs.getInt("count"); //从结果集从获取最终的数量
}
BaseDao.closeResource(null, pstm, rs);
}
return count;
}
③、UserService
//查询记录数
public int getUserCount(String username, int userRole);
④、UserServiceImpl
//查询记录数
@Override
public int getUserCount(String username, int userRole) {
Connection connection = null;
int count = 0;
try {
connection = BaseDao.getConnection();
count = userDao.getUserCount(connection, username, userRole);
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeResource(connection, null, null);
}
return count;
}
2、获取用户列表
①、UserDao
//通过条件查询-userList
public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize) throws Exception;
②、UserDaoImpl
//通过条件查询-userList
@Override
public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize)
throws Exception {
PreparedStatement pstm = null;
ResultSet rs = null;
List<User> userList = new ArrayList<>();
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 ");
List<Object> list = new ArrayList<>();
if (!StringUtils.isNullOrEmpty(userName)){
sql.append("and u.userName like ?");
list.add("%" + userName + "%");
}
if (userRole > 0){
sql.append("and u.userRole = ?");
list.add(userRole);
}
//在数据库中,分页使用 limit startIndex, pageSize;
//当前页 (当前页-1)* 页面大小
//0,5 1 0 01234
//5,5 2 5 56789
//10,5 3,10
sql.append("order by creationDate DESC limit ?, ?");
currentPageNo = (currentPageNo - 1) * pageSize;
list.add(currentPageNo);
list.add(pageSize);
Object[] params = list.toArray();
System.out.println("sql----> " + sql.toString());
rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);
while (rs.next()){
User _user = new User();
_user.setId(rs.getInt("id"));
_user.setUserCode(rs.getString("userCode"));
_user.setUserName(rs.getString("userName"));
_user.setGender(rs.getInt("gender"));
_user.setBirthday(rs.getDate("birthday"));
_user.setPhone(rs.getString("phone"));
_user.setUserRole(rs.getInt("userRole"));
_user.setPhone(rs.getString("userRoleName"));
userList.add(_user);
}
BaseDao.closeResource(null, pstm, rs);
}
return userList;
}
③、UserService
//根据条件查询用户列表
public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize);
④、UserServiceImpl
//根据条件查询用户列表
@Override
public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize) {
Connection connection = null;
List<User> userList = null;
System.out.println("queryUserName ----> " + queryUserName);
System.out.println("queryUserRole ----> " + queryUserRole);
System.out.println("currentPageNo ----> " + currentPageNo);
System.out.println("pageSize ----> " + pageSize);
try {
connection = BaseDao.getConnection();
userList = userDao.getUserList(connection, queryUserName, queryUserRole, currentPageNo, pageSize);
} catch (Exception e) {
e.printStackTrace();
}finally {
BaseDao.closeResource(connection, null, null);
}
return userList;
}