虽然说struts2框架历史悠久,“淘汰”、“过时”等都是它的标签,但仍是很多入门学习的框架,正所谓技多不压身,以下是一个struts2的一个简单登陆实现。
1.环境
- eclipse
- MySQL8.0
- JDK-14
- Tomcat 9.0
- druid 1.1.10(ps:数据库连接池可以替换成纯JDBC,使用druid只是练练手,功能很强大此处却显得很鸡肋)
2.结构
3.核心类
3.1 UserDaoImpl.java
package com.struts2.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.struts2.domain.User;
import com.struts2.util.DbUtils;
/**
* @ClassName:UserDaoImpl
* @Description:用户登陆实现类
* @author:haitao
* @date:2020年8月2日 下午5:54:42
* @version:1.0
*/
public class UserDaoImpl implements UserDao {
/**
* @Title: login
* @Description: 实现类,被LoginAciton调用实现持久层对用户表信息的查询并返回
* @param user
* @return
* @see com.struts2.dao.UserDao#login(com.struts2.domain.User)
*/
@Override
public boolean login(User user) {
/**
* 数据源对象
*/
DataSource dataSource = null;
/**
* 数据库连接对象
*/
Connection connection = null;
/**
* SQL预编译对象
*/
PreparedStatement preparedStatement = null;
String sql = "select username,password from user where username = ? and password = ?";
try {
// 创建数据源对象
dataSource = DbUtils.getDataSource();
// 调用DbUtils类的方法,通过数据源对象获取数据库连接
connection = dataSource.getConnection();
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
preparedStatement.setNString(2, user.getPassword());
ResultSet rs = preparedStatement.executeQuery();
// 如果有记录,返回true,登陆验证成功反之失败
while (rs.next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (connection != null) {
DbUtils.releaseResources(connection);
}
if (preparedStatement != null) {
DbUtils.releaseResources(preparedStatement);
}
}
return false;
}
}
3.2 LoginAction.java
package com.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
import com.struts2.dao.UserDaoImpl;
import com.struts2.domain.User;
/**
* @ClassName:LoginAction
* @Description:用户登陆的action,负责接受和处理请求
* @author:haitao
* @date:2020年8月3日 上午12:30:42
* @version:1.0
*/
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String username;
private String password;
/**
* 用户类
*/
private User user;
/**
* 持久层数据操作类
*/
private UserDaoImpl userDaoImpl;
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;
}
public String execute() throws Exception {
userDaoImpl = new UserDaoImpl();
user = new User();
// 以下两步通过获取jsp传过来的参数后通过User对象的set方法赋值
user.setUsername(getUsername());
user.setPassword(getPassword());
// 将User对象传入持久层方法login,返回true则登陆成功反之失败
if (userDaoImpl.login(user)) {
return SUCCESS;
} else {
return ERROR;
}
}
}
3.3 Dbutils.java
package com.struts2.util;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
/**
* @ClassName:DbUtil
* @Description:数据库连接工具类,使用druid数据库连接池
* @author:haitao
* @date:2020年8月2日 下午4:39:53
* @version:1.0
*/
public class DbUtils {
private static DataSource dataSource;
static {
try {
Properties pro = new Properties();
// ClassLoader classLoader = DbUtils.class.getClassLoader();
// InputStream resourceAsStrem = classLoader.getResourceAsStream("/durid.properties");
InputStream resourceAsStrem = DbUtils.class.getResourceAsStream("/druid.properties");
pro.load(resourceAsStrem);
dataSource = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() throws Exception {
return dataSource.getConnection();
}
public static <T> void releaseResources(T t) {
if (t != null) {
try {
Class<?> aClass = t.getClass();
Method close = aClass.getMethod("close");
close.invoke(t);
} catch (Exception e) {
}
}
}
}
4.流程
表现层通过配置文件发送请求传递参数(username和password
)调用LoginAction类中的execute()
方法。该方法调用持久层登陆业务方法UsrDaoImpl()
并返回数据库校验结果并指向对应结果的视图。
5.源码
源码: