模拟登录案例,设计数据库(user表),编写servlet类(LogincController)、service层、DAO层、编写JDBC,用Statement语句实现查询
时间: 2024-02-27 21:54:55 浏览: 24
好的,下面是一个完整的JavaWeb模拟登录案例,包括设计数据库、编写servlet类、service层、DAO层以及JDBC代码。
1. 设计数据库
首先,我们需要设计一个user表,用来存储用户的登录信息。该表包含以下字段:
| 字段名 | 类型 | 描述 |
| ------ | -------- | ---------- |
| id | int | 用户ID |
| username | varchar(50) | 用户名 |
| password | varchar(50) | 密码 |
可以使用以下SQL语句创建该表:
```sql
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
```
2. 编写DAO层
在DAO层,我们需要编写一个UserDAO接口和一个UserDAOImpl类,用于实现对用户信息的增删改查操作。
UserDAO.java:
```java
public interface UserDAO {
User getUserByUsernameAndPassword(String username, String password);
}
```
UserDAOImpl.java:
```java
public class UserDAOImpl implements UserDAO {
private Connection conn;
public UserDAOImpl(Connection conn) {
this.conn = conn;
}
@Override
public User getUserByUsernameAndPassword(String username, String password) {
User user = null;
try {
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'";
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
}
```
在上面的代码中,我们使用Statement语句实现了查询用户信息的功能,并将查询结果封装成了一个User对象。
需要注意的是,上面的代码中存在SQL注入的安全隐患,因为我们直接将用户输入的用户名和密码拼接到SQL语句中。在真实的项目中,我们应该使用PreparedStatement语句,通过参数化查询的方式来防止SQL注入。
3. 编写Service层
在Service层,我们需要编写一个UserService接口和一个UserServiceImpl类,用于调用DAO层的方法,并进行业务逻辑的处理。
UserService.java:
```java
public interface UserService {
User login(String username, String password);
}
```
UserServiceImpl.java:
```java
public class UserServiceImpl implements UserService {
private UserDAO userDao;
public UserServiceImpl(UserDAO userDao) {
this.userDao = userDao;
}
@Override
public User login(String username, String password) {
User user = userDao.getUserByUsernameAndPassword(username, password);
if (user != null) {
// 登录成功,将用户信息存储到Session中
// ...
}
return user;
}
}
```
在上面的代码中,我们调用了UserDAO的方法来查询用户信息,并进行了登录验证。如果登录成功,我们可以将用户信息存储到Session中,以便在后续的请求中进行身份验证。
4. 编写Servlet类
在Servlet类中,我们需要获取用户输入的用户名和密码,调用UserService的方法进行登录验证,然后将结果返回给前端页面。
LoginController.java:
```java
@WebServlet("/login")
public class LoginController extends HttpServlet {
private UserService userService;
@Override
public void init() throws ServletException {
// 在初始化方法中注入UserService的实现类
userDao = new UserDAOImpl(JDBCUtils.getConnection());
userService = new UserServiceImpl(userDao);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.login(username, password);
if (user != null) {
// 登录成功,重定向到主页
response.sendRedirect("/index.jsp");
} else {
// 登录失败,返回错误信息
request.setAttribute("errorMsg", "用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
```
在上面的代码中,我们在init()方法中注入了UserService的实现类,并在doPost()方法中获取用户输入的用户名和密码,调用UserService的方法进行登录验证,然后根据验证结果进行重定向或错误信息提示。
5. 编写JDBC代码
在JDBC代码中,我们需要获取数据库连接,并实现连接的关闭功能。
JDBCUtils.java:
```java
public class JDBCUtils {
private static String url = "jdbc:mysql://localhost:3306/test";
private static String user = "root";
private static String password = "123456";
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
```
在上面的代码中,我们使用了JDBC的标准API来获取数据库连接,并实现了连接的关闭功能。
最后,我们需要在Web.xml中配置Servlet和JDBC的相关信息。
web.xml:
```xml
<web-app>
<servlet>
<servlet-name>LoginController</servlet-name>
<servlet-class>com.example.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginController</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
```
以上就是一个完整的JavaWeb模拟登录案例,包括设计数据库、编写DAO层、Service层、Servlet类以及JDBC代码。需要注意的是,在实际开发中,我们应该对用户输入的用户名和密码进行安全性验证,以防止SQL注入等攻击。此外,我们还应该使用HTTPS协议来保护用户的登录信息。