代码:
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>用户登录</title>
</head>
<body>
<div align="right">
<s:a href="register.jsp"><font color="blue"><h5>还未注册?点击注册</h5></font></s:a>
</div>
<div style="color: #7FFF00">
<s:form action="login" method="post">
<s:textfield name="username" label="账号"></s:textfield>
<s:password name="password" label="密码"></s:password>
<s:submit value="登陆"></s:submit>
</s:form>
</div>
</body>
</html>
login_success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>我的主页</title>
</head>
<body>
<h4 align="right"><font color="blue">欢迎您,${user}</font></h4>
</body>
</html>
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户注册</title>
<script type="text/javascript">
function shuaxin(obj) {
var shijian = new Date().getTime();
obj.src="imageAction.action?d="+shijian;
}
</script>
</head>
<body>
<h1 align="center">用户注册</h1>
<div align="center">
<s:fielderror cssStyle="color:red"></s:fielderror>
<s:actionerror cssStyle="color:red"></s:actionerror>
<br>
<s:form action="register" theme="simple" method="post">
<table width="50%" border="0" style="width: 501px; height: 342px;">
<tr>
<td align="right">账号:</td>
<td width=20><s:textfield name="username"></s:textfield></td>
<td><font color="red" align="left"><h6>*必填</h6></font></td>
</tr>
<tr>
<td align="right">密码:</td>
<td><s:password name="password"></s:password></td>
<td><font color="red" align="left"><h6>*必填</h6></font></td>
</tr>
<tr>
<td align="right">重复密码:</td>
<td><s:password name="repassword"></s:password></td>
<td><font color="red" align="left"><h6>*必填</h6></font></td>
</tr>
<tr>
<td align="right">性别:</td>
<td><input type="radio" name="sex" value="0" checked />男<input type="radio" name="sex" value="1" />女</td>
</tr>
<tr>
<td align="right">电子邮箱:</td>
<td><s:textfield name="email"></s:textfield></td>
<td><font color="red" align="left"><h6>*必填</h6></font></td>
</tr>
<tr>
<td align="right">验证码:</td>
<td><s:textfield name="validate"></s:textfield></td>
<td><img src="imageAction" align="left" alt="点击图片" onClick="shuaxin(this)" /></td>
</tr>
<tr>
<td></td>
<td>
<s:submit value="提交"></s:submit>
<s:reset value="重置"></s:reset>
</td>
</tr>
</table>
</s:form>
</div>
</body>
</html>
register_success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>注册成功</title>
<script language='javascript' type='text/javascript'>
var secs = 5; //倒计时的秒数
var URL;
function Load(url) {
URL = url;
for ( var i = secs; i >= 0; i--) {
window.setTimeout('doUpdate(' + i + ')', (secs - i) * 1000);
}
}
function doUpdate(num) {
document.getElementById('ShowDiv').innerHTML = '将在' + num + '秒后自动跳转到登录页面';
if (num == 0) {
window.location = URL;
}
}
</script>
</head>
<body>
<center>
<h1>
<font color="red" align="center">恭喜您,注册成功!!</font>
</h1>
<br />
<div id="ShowDiv"></div>
<script language="javascript">
Load("http://localhost:8082/StrustLogin/login.jsp");
</script>
<s:a href="/StrustLogin/login.jsp">
<font color="blue"><h5>
手动登录?
</h5> </font>
</s:a>
</center>
</body>
</html>
ImageAction.java
package action;
import java.io.*;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.awt.*;
import java.awt.image.BufferedImage;
public class ImageAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private ByteArrayInputStream inputStream;
// 产生四个0~9的随机数,放在一个字符串里
public String createRandomString() {
String str = "";
for (int i = 0; i < 4; i++) {
str += Integer.toString((new Double(Math.random() * 10)).intValue());
}
return str;
}
// 随机产生一个颜色
public Color createsRandomColor() {
int r = (new Double(Math.random() * 256)).intValue();
int g = (new Double(Math.random() * 256)).intValue();
int b = (new Double(Math.random() * 256)).intValue();
return new Color(r, g, b);
}
// 生成一个内存图片,将四个随机数写在图片上
public BufferedImage createImage(String str) {
int width = 60;
int height = 22;
BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 设定背景色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 画边框
g.setColor(Color.black);
g.drawRect(0, 0, width - 1, height - 1);
// 将认证码显示到图象中
g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
// 使用随机颜色
g.setColor(this.createsRandomColor());
// 将随机字符串的每个数字分别写到图片上
g.drawString(Character.toString(str.charAt(0)), 8, 17);
g.drawString(Character.toString(str.charAt(1)), 20, 17);
g.drawString(Character.toString(str.charAt(2)), 33, 17);
g.drawString(Character.toString(str.charAt(3)), 45, 17);
// 图象生效
g.dispose();
return image;
}
// 将图片的以字节形式写到InputStream里
public ByteArrayInputStream createInputStream() throws Exception {
// 获取随机字符串
String str = this.createRandomString();
BufferedImage image = this.createImage(str);
// 将产生的字符串写入session,供校验时使用
ActionContext actionContext = ActionContext.getContext();
Map session = actionContext.getSession();
session.put("random", str);
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
ImageIO.write(image, "JPEG", imageOut);
imageOut.close();
ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
output.close();
return input;
}
@Override
public String execute() throws Exception {
setInputStream(createInputStream());
return SUCCESS;
}
public ByteArrayInputStream getInputStream() {
return inputStream;
}
public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}
}
LoginAction.java
package action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import biz.Users;
import dao.DbService;
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
String username;
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 execute() throws Exception {
// TODO Auto-generated method stub
DbService dbservice = new DbService();
Users user = new Users();
user = dbservice.hasUser(username, password);
if(user.getUsername()==null){
this.addFieldError("username", "用户名或密码不正确");
return INPUT;
}
else{
ActionContext actionContext = ActionContext.getContext();
Map session = actionContext.getSession();
session.put("user", user.getUsername());
}
return SUCCESS;
}
}
RegisterAction.java
package action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import biz.Users;
import dao.DbService;
public class RegisterAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String username;
private String password;
private String repassword;
private String sex;
private String email;
private String validate;
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 getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getValidate() {
return validate;
}
public void setValidate(String validate) {
this.validate = validate;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
int sex1=Integer.parseInt(sex);
Users user = new Users();
user.setUsername(username);
user.setEmail(email);
user.setPassword(password);
user.setSex(sex1);
DbService dbservice = new DbService();
if(dbservice.hasSameName(username))
{
this.addFieldError(username, "用户名已存在");
return INPUT;
}
else {
dbservice.addUser(user);
}
return SUCCESS;
}
@Override
public void validate() {
// TODO Auto-generated method stub
ActionContext actionContext = ActionContext.getContext();
Map session = actionContext.getSession();
if( !repassword.equals(password) )
{
this.addFieldError(repassword, "重复密码不一致");
}
if (!session.get("random").equals(validate))
{
this.addFieldError(validate, "验证码错误");
}
}
}
LoginAction-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>账号不能为空</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
</field>
</validators>
RegisterAction-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message>账号不能为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>账号长度应在 ${minLength} ~ ${maxLength}之间</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>密码长度应在 ${minLength} ~ ${maxLength}之间</message>
</field-validator>
</field>
<field name="repassword">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message>重复密码不能为空</message>
</field-validator>
</field>
<field name="email">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message>邮箱不能为空</message>
</field-validator>
<field-validator type="email">
<message>邮箱输入不正确</message>
</field-validator>
</field>
<field name="validate">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>验证码不能为空</message>
</field-validator>
</field>
</validators>
Users.java
package biz;
public class Users {
private int userid;
private String username;
private String password;
private int sex;
private String email;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
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 int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Users(String username, String password, int sex, String email) {
super();
this.username = username;
this.password = password;
this.sex = sex;
this.email = email;
}
public Users(int userid, String username, String password, int sex,
String email) {
super();
this.userid = userid;
this.username = username;
this.password = password;
this.sex = sex;
this.email = email;
}
public Users() {
super();
}
}
DbConnection.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DbConnection {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection con = null;
String url = "jdbc:mysql://localhost:3306/test";
String userName = "root";
String pwd = "root";
try {
con = DriverManager.getConnection(url, userName, pwd);
System.out.println("数据库连接成功!");
} catch (SQLException e) {
System.out.println("数据库连接失败!");
e.printStackTrace();
}
return con;
}
public static void closeConnection(ResultSet rs, Statement st, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
DbService.java
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import biz.Users;
public class DbService {
public void addUser(Users user) {
Connection connection = DbConnection.getConnection();
PreparedStatement ps = null;
String sql = "insert into users(username,password,sex,email) values(?,?,?,?)";
try {
ps = connection.prepareStatement(sql);
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setInt(3, user.getSex());
ps.setString(4, user.getEmail());
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Users hasUser(String username, String password) {
Users user = new Users();
Connection connection = DbConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from users where username= ? and password = ?";
try {
ps = connection.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs = ps.executeQuery();
if (rs.next()) {
user.setPassword(rs.getString("password"));
user.setUsername(rs.getString("username"));
user.setSex(rs.getInt("sex"));
user.setEmail(rs.getString("email"));
user.setUserid(rs.getInt("user_id"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DbConnection.closeConnection(rs, ps, connection);
}
return user;
}
public boolean hasSameName(String username) {
String name = null;
Connection connection = DbConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from users where username = ?";
try {
ps = connection.prepareStatement(sql);
ps.setString(1, username);
rs = ps.executeQuery();
if (rs.next()) {
name = rs.getString("username");
if (name.equals(username)) {
return true;
}else{
return false;
}
}else{
return false;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DbConnection.closeConnection(rs, ps, connection);
}
return false;
}
}
struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="gbk"></constant>
<package name="StrutsLogin" extends="struts-default">
<action name="register" class="action.RegisterAction">
<result name="success">/register_success.jsp</result>
<result name="input">/register.jsp</result>
</action>
<action name="login" class="action.LoginAction">
<result name="success" type="redirect">/login_success.jsp</result>
<result name="input">/login.jsp</result>
</action>
<action name="imageAction" class="action.ImageAction">
<result type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action>
</package>
</struts>
截图: