狂神说Java【SMBMS】——SMBMS超市订单管理系统(二) ——登陆功能实现
页面实现逻辑/流程
1、编写前端页面
前端页面直接使用已有的,我们主要编写网页背后的执行代码
2、设置首页
<!--设置欢迎页/首页-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
3、编写Dao层用户登陆的接口
-
创建一个UserDao接口,然后我们按照"面向接口编程"的原则去接口UserDaoImpl中实现这个接口中的方法
-
使用面向接口编程的好处就在与我们在接口中只需要定义方法,而不需要实现方法,整个结构和思路都很清晰
-
其次就是将设计和实现分离,保证了设计专注于设计,实现专注于实现
-
package com.thhh.dao.user;
import com.thhh.pojo.User;
import java.sql.Connection;
public interface UserDao {
/**
* 得到要进行登陆的用户
* @param conn:数据库连接对象
* @param userCode:通过用户的用户名userCode查询用户数据
* @return
*/
public User getLoginUserInfo(Connection conn,String userCode);
}
4、编写Dao接口的实现类
package com.thhh.dao.user;
import com.thhh.dao.BaseDao;
import com.thhh.pojo.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDaoImpl implements UserDao{
@Override
public User getLoginUserInfo(Connection conn, String userCode) {
PreparedStatement pstmt = null;
ResultSet rs = null;
User user = null;
if (conn!=null){
String sql = "SELECT * FROM smbms_user WHERE userCode = ?";
Object[] params = {userCode};
rs = BaseDao.executeQuery(sql,params,conn,pstmt,rs);//调用项目搭建阶段准备的公共查询方法
try {
while (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"));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.close(null,pstmt,rs);//因为数据库的连接可能不只是这一个操作,所以我们不应该做完一件事就把数据库连接对象销毁,所以conn处传的null
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return user;
}
}
5、编写业务层接口
package com.thhh.service.user;
import com.thhh.pojo.User;
public interface UserService {
/**
* 用户登陆身份验证
* @param userCode:用户账号
* @param userPassword:用户密码,注意,密码判断我们在service层进行;
* 在Dao层只是简单的操作数据库,没有其他的逻辑代码;在servlet层中只是接收和转发请求以及控制视图跳转
* 而对于业务层(service)就是用来实现业务逻辑代码的
* @return
*/
public User login(String userCode,String userPassword);
}
6、业务层实现类
package com.thhh.service.user;
/**
* 业务层主要就是编写业务代码,在编写业务代码的时候经常会调用数据库
* 所以在业务层中需要使用到我们一开始编写好的DAO的代码
*/
import com.thhh.dao.BaseDao;
import com.thhh.dao.user.UserDao;
import com.thhh.pojo.User;
import org.junit.Test;
import java.sql.Connection;
public class UserServiceImpl implements UserService{
private UserDao userDao;//业务层需要使用Dao,所以直接将Dao作为一个成员变量来使用
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;//在业务层被实例化的时候就让它得到Dao对象,后面就可以直接去用
}
@Override
public User login(String userCode, String userPassword) {
Connection conn = null;
User user = null;
conn = BaseDao.getConnection();//获取数据库连接对象
//通过业务层调用Dao层
user = userDao.getLoginUserInfo(conn,userCode);//调用userDao中的获取用户信息的方法
BaseDao.close(conn,null,null);
return user;
}
}
测试是否能够成功运行
@Test
public void test(){
UserServiceImpl userService = new UserServiceImpl();
User admin = userService.login("admin","12bfasbka");
System.out.println(admin.getUserPassword());
}
7、编写servlet
首先导入我们也用到的JSP页面
其中frame.jsp是登陆成功之后跳转的页面,而common中是页面的头部和底部
注意:我们在编写servlet和注册servlet的时候一定要注意我们使用的前端页面上面写的地址,为了不出错最后时与前端页面上写的地址保持一致;其次就是注意前端使用的JSP内置对象和EL表达式,我们在后端需要使用对应的变量名,否则是取不到值的
servlet编写
package com.thhh.servlet.user;
import com.thhh.pojo.User;
import com.thhh.service.user.UserService;
import com.thhh.service.user.UserServiceImpl;
import com.thhh.utils.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{
private UserService userService = null;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取前端传过来的用户名+密码
String userCode = req.getParameter("userCode");
String userPassword = req.getParameter("userPassword");
//2、调用业务层,将数据库中查出来的密码和用户的输入进行对比
this.userService = new UserServiceImpl();
User user = userService.login(userCode,userPassword);//已经把用户查到了
//3、判断返回是否为null
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);
}
/* if ()
user.getUserPassword()*/
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
8、注册servlet
<!--注册登陆的servlet-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.thhh.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
注意:这里的映射与我们使用的前端页面表单提交的action要保持一致
9、测试功能,确保上面的代码正确
测试完成!