使用Struts 2.0 框架实现用户注册登录模块(数据库校验)

 代码:

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>

截图:








  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
一.功能简介 1. 实现一个图书管理系统。图书信息存放到一个数据库中。图书包含信息:图书号、图书名、作者、价格、备注字段。 2. 系统实现如下的基本管理功能: (1)用户分为两类:系统管理员,一般用户。 (2)提供用户注册和用户登录验证功能;其中登录用户的信息有:登录用户名,登录密码等。 (3)管理员可以实现对注册用户的管理(删除),并实现对图书的创建、查询、修改和删除等有关的操作。 (4)一般用户,只能查询图书,并进行借书、还书操作,每个用户最多借阅8本,即当目前借书已经是8本,则不能再借书了,只有还书后,才可以再借阅。 二.涉及技术 Struts2框架、MySQL数据库、C3P0数据池、Jsp、HTML、CSS、JavaScript等技术。 三.设计思路 1. 基于Struts2框架进行编程设计,连接MySQL数据库实现数据的增删查改,应用Jsp、HTML、CSS、JavaScript对访问页面进行编写和美化。 2. 分别创建book表和user表,用以存放图书信息和用户数据。其中user表中,设有flag以区分管理员和普通用户。 3. 分别创建Book类和User类,与数据表相对应。每本书和每个用户都有唯一的id与之对应。 4. 创建C3P0属性文件和数据库连接工具类。 5. 设计数据库操作类:UserDao类和BookDao类。UserDao用于实现所有对user表的操作,BookDao用于实现所有对book表的操作。 6. 创建分别对应UserDao类和BookDao类的Action:UserAction和BookAction。采用基于注解的方式进行Action配置。 7. 用户账号分为管理员账号和普通用户账号,注册时加以区分,登录时即可自动判断进入对应的操作主页面。 8. 管理员可实现用户的查询显示,模糊查询,删除,批量删除,全选和取消全选等功能;可实现对图书的查询显示,模糊查询,添加,删除,批量删除,全选和取消全选等功能。 9. 普通用户实现借书和还书功能,借书功能通过对book表的查询,将未借出的图书按照id顺序排列显示,点击表格后方的“借阅”按钮,进行确认借阅,将book表中本书的borrowperson列的值改为本用户账号。对于借阅成功的图书可以在“当前借阅”中进行查看。还书功能通过在“当前借阅”中点击“还书”按钮,进行确认还书,将book表中本书的borrowperson列的值改为“空”,本书信息将可以在“借书”界面查看。 四.存在的问题 1. 原本希望能为每一个用户创建一个对应的以其账号命名的数据表,用以存放用户所借图书信息,但创建表的SQL语句无法在java代码中执行,所以只好在book表中添加一列borrowperson,用来存放借阅本书的用户账号,这样查询用户当前借阅记录时,以“where borrowperson=‘account’”为条件对book表进行查询即可。但是每个用户要当前查询借阅记录时都需要对整个book表进行遍历,效率太低。 2. 模糊查询时,因同时需要进行where筛选,SQL语句无法执行,只好分开查询,先进行模糊查询,查询结果存放到list表中,再通过遍历list表进行判断是否符合where的条件,若符合,则存入另一个list表中。这种方法虽然实现了查询,但效率太低,代码过于繁重。 五.改进预想 这些本不应该是预想,原本希望在本次作业中实现的,但时间不够充分,只能作为下一步的改建预想。 1. 希望实现登录时验证码验证登录; 2. 希望实现查询时,查询结果分页浏览; 3. 进一步优化Action之间的传值方法; 4. 页面进一步优化、美化; 5. 实现用户借书还书时间记录,和借阅时长限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇潇雨歇_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值