1.之前的前端素材导入jsp(之前导jsp时早已导入)
2.写项目,建议从底层往上写
3.UserDao接口
//修改当前用户密码
public int updatePwd(Connection connection,int id,int password) throws SQLException;
4.UserDao接口实现类
修改当前用户密码
public int updatePwd(Connection connection, int id, int 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, sql, params, pstm);
BaseDao.closeResource(null, null, pstm);
}
return execute;
}
5.UserService层接口
package com.Li.service;
import com.Li.pojo.User;
import java.sql.Connection;
import java.sql.SQLException;
//业务层
//对dao层进行操作。dao层已经将数据库的内容拿到。
//功能:用户登录
//真正的登录不能像dao层,靠一个用户名登录。你得要用户名密码同时正确才可以登录!!!
public interface UserService {
//用户登录
public User login(String userCode,String password);
//根据用户ID修改密码
public boolean updatePwd(int id, int pwd);
}
6.UserService层实现类
package com.Li.service;
import com.Li.dao.BaseDao;
import com.Li.dao.user.UserDao;
import com.Li.dao.user.UserDaoImp1;
import com.Li.pojo.User;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
public class UserServiceImp1 implements UserService{
//业务层都会调用dao层,所以我们要引入dao层
private UserDao userDao;
public UserServiceImp1(){
userDao = new UserDaoImp1();
}
public User login(String userCode, String password) {
Connection connection = null;
User user = null;
try {
connection = BaseDao.getConnection();
//通过业务层调用对应的具体数据库操作
user = userDao.getLoginUser(connection, userCode);//注意,要把这个返回给user。否则会报空指针异常
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
BaseDao.closeResource(connection, null, null);
}
return user;
}
public boolean updatePwd(int id, int pwd) {
Connection connection = null;
boolean flag = false;//标志位判断密码是否修改成功
//修改密码
try {
connection = BaseDao.getConnection();
if (userDao.updatePwd(connection, id, pwd)>0) {//sql执行成功
flag = true;//修改密码成功。返回一个true
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
BaseDao.closeResource(connection, null, null);
}
return flag;
}
@Test
public void test(){
UserServiceImp1 userService = new UserServiceImp1();
User admin = userService.login("admin", "1234567858578");//password是个假的。是从admin用户数据库里面提出的密码
System.out.println(admin.getUserPassword());
}
}
7.UserServlet(初版)
package com.Li.servlet.user;
import com.Li.pojo.User;
import com.Li.service.UserServiceImp1;
import com.Li.util.Constants;
import com.mysql.cj.util.StringUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//实现servlet复用
//实现把前端的内容返回给后端。
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//从session中拿ID
Object o = req.getSession().getAttribute(Constants.USER_SESSION);
String newpassword = req.getParameter("newpassword");
boolean flag = false;
if (o!=null && !StringUtils.isNullOrEmpty(newpassword)){
UserServiceImp1 userService = new UserServiceImp1();
flag = userService.updatePwd(((User) o).getId(), newpassword);//将o转为User并且获取代码
//如果27句成功。
if (flag){
req.setAttribute("message", "修改密码成功,请退出,使用新密码登录");
//密码修改成功。移除当前Session.之后由于过滤器,没有session之后就会跳转到错误页面
req.getSession().removeAttribute(Constants.USER_SESSION);
}else {
req.setAttribute("message", "密码修改失败。");
//密码修改失败。
}
}else {
req.setAttribute("message", "新密码有问题。");
}
req.getRequestDispatcher("pwdmodify.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.Li.servlet.user.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/jsp/user.do</url-pattern>
</servlet-mapping>
8.实现复用记得提取出方法(修改后的UserServlet)
package com.Li.servlet.user;
import com.Li.pojo.User;
import com.Li.service.UserServiceImp1;
import com.Li.util.Constants;
import com.mysql.cj.util.StringUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//实现servlet复用
//实现把前端的内容返回给后端。
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getParameter("method");
if (method!=null && method.equals("savepwd")){
this.updatePwd(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
//封装updatePwd
public void updatePwd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//从session中拿ID
Object o = req.getSession().getAttribute(Constants.USER_SESSION);
String newpassword = req.getParameter("newpassword");
boolean flag = false;
if (o!=null && newpassword!=null){
UserServiceImp1 userService = new UserServiceImp1();
flag = userService.updatePwd(((User) o).getId(), newpassword);//将o转为User并且获取代码
//如果27句成功。
if (flag){
req.setAttribute("message", "修改密码成功,请退出,使用新密码登录");
//密码修改成功。移除当前Session.之后由于过滤器,没有session之后就会跳转到错误页面
req.getSession().removeAttribute(Constants.USER_SESSION);
}else {
req.setAttribute("message", "密码修改失败。");
//密码修改失败。
}
}else {
req.setAttribute("message", "新密码有问题。");
}
req.getRequestDispatcher("pwdmodify.jsp").forward(req, resp);
}
}
分析问题(排错思路):狂神整了很长时间,不得不佩服排错速度很快,以下是我个人浅薄的看法:
每一层都有每一层的职责,当出现问题的时候,可以在每一层都sout一下,看是否输出正确(能否输出)。
如果有断层的情况,那就是断层的上一层有问题。直接找上一层的问题。
上一层是在if语句成功才进入下一层,所以可能if语句有问题。