话不多说,直接开始源代码
这是工程目录
首先创建数据表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20),
`password` varchar(20),
`sex` varchar(1),
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'admin', '12345', '男', 18);
INSERT INTO `user` VALUES (2, 'zhangsan', 'qwer', '男', 20);
INSERT INTO `user` VALUES (5, 'xiaohong', 'qwer', '女', 18);
创建实体类User.java
package com.wang.entity;
public class User {
private String username;//用户名
private String password;//密码
private int age;//年龄
private String sex;//性别
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
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 + ", password=" + password + "]";
}
}
创建连接数据库的工具类DBConnection.java
package com.wang.jdbcutils;
import java.sql.*;
public class DBConnection {
// JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/springtest";
// 数据库的用户名与密码,需要根据自己的设置
static final String USER = "root";
static final String PASS = "root";
public static Connection getDBConnection() {
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开链接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
// 关闭数据库
public static void closeDB(Connection con, PreparedStatement pstm, ResultSet rs) {
if (rs != null)
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (pstm != null)
try {
pstm.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (con != null)
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
对数据库操作的dao层接口UserDao.java
package com.wang.dao;
import com.wang.entity.User;
public interface UserDao {
public User login(User user);
}
实现类UserDaoImpl.java
package com.wang.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.wang.entity.User;
import com.wang.jdbcutils.DBConnection;
public class UserDaoImpl implements UserDao {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
@Override
public User login(User user) {
User us = new User();
con = DBConnection.getDBConnection();
String sql = "select * from user where username=? and password = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
rs = pstmt.executeQuery();
//将从数据库中查找数据,若没找到us则为null
while (rs.next()) {
us.setUsername(rs.getString("username"));
us.setPassword(rs.getString("password"));
us.setAge(rs.getInt("age"));
us.setSex(rs.getString("sex"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return us;
}
}
Action类LoginAction.java
package com.wang.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.wang.dao.UserDao;
import com.wang.dao.UserDaoImpl;
import com.wang.entity.User;
public class LoginAction extends ActionSupport implements ModelDriven<User> {
User user = new User();
UserDao useDao = new UserDaoImpl();
public String login() {
ActionContext ac = ActionContext.getContext();
User us = useDao.login(user);
String str;
if (us.getUsername() != null) {
ac.getSession().put("user", us);
str = "success";
} else {
ActionContext.getContext().put("msg", "用户名或密码错误");
str = "input";
}
System.out.println(str);
return str;
}
//注销用户
public String clearSession() {
ActionContext ac = ActionContext.getContext();
Map<String, Object> session = ac.getSession();
session.clear();
return INPUT;
}
//从首页跳转到index.jsp,会被拦截器拦截,若session没有user数据则跳转到登录界面
public String index() {
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
拦截器LoginInterceptor.java
package com.wang.Interceptor;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
ActionContext ac = arg0.getInvocationContext();
// 获取session中的user类,若没有则user==null
Object user = ac.getSession().get("user");
if (user != null) {
return arg0.invoke();
} else {
ac.put("msg", "请登录!");
return Action.INPUT;
}
}
}
struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package extends="struts-default" name="default">
<!-- 实现登录操作 -->
<action name="login_*" class="com.wang.action.LoginAction"
method="{1}">
<result>/index.jsp</result>
<result name="input">/login.jsp</result>
<result name="clearSession">/login.jsp</result><!-- 注销用户的操作 -->
</action>
</package>
<package name="default2" extends="struts-default">
<!-- 自定义拦截器 -->
<interceptors>
<interceptor name="login" class="com.wang.Interceptor.LoginInterceptor">
</interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="login" />
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 使用拦截器 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="index" class="com.wang.action.LoginAction">
<result name="input">/login.jsp</result>
<result>/index.jsp</result>
</action>
</package>
</struts>
接下来是jsp页面
首页,也就是运行该工程的第一个页面,通过这个页面来使拦截器拦截
<body>
欢迎来到我的页面,
<a href="index">点击进入首页</a>
</body>
登录页面,这里用一个简单的表格来写出登录表单
<body>
<div align="center">
<h3 style="font-family: 华文行楷">登录</h3>
<form action="login_login" method="post">
<table>
<tr><td colspan="2" align="center">${msg}</td></tr>
<tr>
<td>用户名:</td>
<td><input name="username" type="text" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input name="password" type="text" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input value="登录" type="submit" />
<input value="重置" type="reset" /></td>
</tr>
</table>
</form>
</div>
</body>
登录成功的页面,会显示用户的数据
<body>
<div align="center">
<table>
<tr>
<td colspan="2" align="center">登录成功</td>
</tr>
<tr>
<td colspan="2">用户信息:</td>
</tr>
<tr>
<td>用户名:</td>
<td>${user.username }</td>
</tr>
<tr>
<td>密 码:</td>
<td>${user.password}</td>
</tr>
<tr>
<td>年 龄:</td>
<td>${user.age}</td>
</tr>
<tr>
<td>性 别:</td>
<td>${user.sex}</td>
</tr>
<tr>
<td colspan="2" align="center"><a href="login_clearSession"><input
type="button" value="注销" /></a></td>
</tr>
</table>
</div>
</body>
接下来是演示的图片
点击“进入首页”。若,没有登录过则进入登录界面
源代码已上传,可以下载https://github.com/1419908068/struts