1.目录结构如下:
存放java bean的包
* 阿里 - domain object(领域对象) 简称 DO
* entity (实体)
存放 数据访问对象 的包
*dao - data access object 对领域对象做增删改查操作的
存放 servlet 的包
*web
2.关键代码如下:
User.java
public class User implements Serializable {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
}
UserDao.java
public class UserDao {
/**
* 根据用户名查询用户对象
* @param username 用户名
* @return 查询到了,返回用户对象,如果用户不存在返回 null
*/
public User findByUsername(String username) {
try(Connection conn = JdbcUtils.getConnection()) {
try(PreparedStatement stmt = conn.prepareStatement("select * from user where username=?")) {
stmt.setString(1, username);
ResultSet rs = stmt.executeQuery();
if(rs.next()) {
// 查询到了该用户
User user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
} else {
return null;
}
}
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}
LoginServlet.java
@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
private UserDao userDao = new UserDao();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
User user = userDao.findByUsername(username);
// 数据库没有此用户
if (user == null) {
req.setAttribute("error", "用户不存在");
req.getRequestDispatcher("login.jsp")
.forward(req, resp);
return;
}
// 如果数据库的密码 不等于 输入密码
if (!user.getPassword().equals(password)) {
req.setAttribute("error", "密码错误");
req.getRequestDispatcher("login.jsp")
.forward(req, resp);
return;
}
// 通过验证
// 将登录标记存入 session 作用域
req.getSession().setAttribute("username", username);
req.getRequestDispatcher("welcome.jsp")
.forward(req, resp);
}
}
LogoutServlet.java
@WebServlet(urlPatterns = "/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
// 让 session 失效
session.invalidate();
// 跳转至登录页面
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="login" method="post">
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="password" name="password" ></p>
<p><input type="submit" value="登录"></p>
</form>
<h4 style="color:red;">${error}</h4>
</body>
</html>
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 获取 session 中的 username 变量
Object username = session.getAttribute("username");
// 没有经过验证
if(username == null) {
/*
请求转发的方式
request.setAttribute("error", "您尚未登录");
request.getRequestDispatcher("login.jsp").forward(request, response);
*/
// 请求重定向方式
session.setAttribute("error", "您尚未登录");
response.sendRedirect("login.jsp");
return;
}
%>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- EL 可以从作用域中获取信息-->
登录成功!!! 欢迎 ${username} 来到本网站
<a href="logout">注销(安全退出)</a>
</body>
</html>