现在我们来做一个用户注册的例子,这个例子会涉及到后台数据库的操作,这在我以前Struts2的文章里面是没有提到过的,为此我们要多做些准备工作:首先我们将Mysql的JDBC驱动包拷贝到Tomcat安装目录下的lib目录中,然后在MYSQL的test数据库下建立一张名为reg_user的表(为了避免乱码问题,注意编码方式设置为utf8),创建表的语句如下:
create table reg_user
(
id int auto_increment,
username varchar(20) not null,
password varchar(20) not null,
sex boolean,
email varchar(20),
pwd_question varchar(50),
pwd_answer varchar(20),
reg_date datetime,
last_login_date datetime,
last_login_ip varchar(20),
primary key(id)
)DEFAULT CHARSET=utf8 ;
然后配置一下数据源,在WEB根目录的/META-INF子目录下编写配置文件context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true">
<Resource name="jdbc/test" auth="Container"
type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"
username="root" password="123" maxActive="200" maxIdle="30"
maxWait="-1" />
</Context>
有了它们,启动MYSQL服务器,在我们的JAVA应用程序中就可以利用JNDI的方式访问到MYSQL的test数据库了。下面我们一步一步完成咱们的注册程序(以后我们就不特别提醒大家导入jar包和配置web.xml了):
Step1:准备注册页面:register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="register.action" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="user.username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="user.password"></td>
</tr>
<tr>
<td>性别:</td>
<td><input type="radio" name="user.sex" value="true" checked>男
<input type="radio" name="user.sex" value="false">女</td>
</tr>
<tr>
<td>邮件地址:</td>
<td><input type="password" name="user.email"></td>
</tr>
<tr>
<td>密码问题:</td>
<td><input type="text" name="user.pwdQuestion"></td>
</tr>
<tr>
<td>密码答案:</td>
<td><input type="password" name="user.pwdAnswer"></td>
</tr>
<tr>
<td><input type="submit" value="注册"></td>
<td><input type="reset" value="重填"></td>
</tr>
</table>
</form>
</body>
</html>
success.jsp 用户注册成功,使用<s:property>标签获取用户的注册名,向用户显示成功信息
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1><s:property value="user.username" />,恭喜您注册老许的博客(http://www.blog.csdn.net/lenotang)成功。</h1>
</body>
</html>
error.jsp 用户注册失败,输出exception对象
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
注册失败,原因是:<s:property value="exception"/><br>
请<a href="<%=basePath%>register!default.action">重新注册</a>!
</body>
</html>
Step2:编写与reg_user表对应的实体类
package org.leno.struts2.model;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private static final long serialVersionUID = 6663778172288542840L;
private Integer id;
private String username;
private String password;
private Boolean sex;
private String email;
private String pwdQuestion;
private String pwdAnswer;
private Date regDate;
private Date lastLoginDate;
private String lastLoginIp;
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 Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPwdQuestion() {
return pwdQuestion;
}
public void setPwdQuestion(String pwdQuestion) {
this.pwdQuestion = pwdQuestion;
}
public String getPwdAnswer() {
return pwdAnswer;
}
public void setPwdAnswer(String pwdAnswer) {
this.pwdAnswer = pwdAnswer;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
public Date getLastLoginDate() {
return lastLoginDate;
}
public void setLastLoginDate(Date lastLoginDate) {
this.lastLoginDate = lastLoginDate;
}
public String getLastLoginIp() {
return lastLoginIp;
}
public void setLastLoginIp(String lastLoginIp) {
this.lastLoginIp = lastLoginIp;
}
}
Step3:编写数据访问类UserDAO,封装数据访问细节
package org.leno.struts2.model;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class UserDAO {
private DataSource dataSource;
/**
* 切记:由于采用数据源连接池的方式(利用Tomcat提供的数据源实现)获取数据库的连接,因此需要
* 将Mysql的JDBC驱动包拷贝到Tomcat安装目录下的lib目录中
*/
public UserDAO() {
try {
Context ctx = new InitialContext();
dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/test");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public boolean register(User user) throws SQLException {
boolean flag = false;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = dataSource.getConnection();
String sql = "insert into reg_user(username,password,sex,email,pwd_question,pwd_answer,reg_date) values(?,?,?,?,?,?,?)";
ps = con.prepareStatement(sql);
int index = 0;
ps.setString(++index, user.getUsername());
ps.setString(++index, user.getPassword());
ps.setBoolean(++index, user.getSex());
ps.setString(++index, user.getEmail());
ps.setString(++index, user.getPwdQuestion());
ps.setString(++index, user.getPwdAnswer());
ps
.setTimestamp(++index, new Timestamp(user.getRegDate()
.getTime()));
ps.execute();
rs = ps.executeQuery("select last_insert_id()");
if (rs.next()) {
user.setId(rs.getInt(1));
flag = true;
} else {
return flag;
}
} catch (SQLException e) {
throw e;
} finally {
closeResultSet(rs);
closePreparedStatement(ps);
closeConnection(con);
}
return flag;
}
public List findAll() throws SQLException {
List list = new ArrayList();
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = dataSource.getConnection();
String sql = "select * from reg_user";
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt(1));
user.setUsername(rs.getString(2));
list.add(user);
}
} catch (SQLException e) {
throw e;
} finally {
closeResultSet(rs);
closePreparedStatement(ps);
closeConnection(con);
}
return list;
}
private void closeResultSet(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void closePreparedStatement(PreparedStatement ps) {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void closeConnection(Connection con) {
try {
if (con != null && !con.isClosed()) {
con.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Step4:编写RegisterAction,调用UserDao来实现用户注册功能
package org.leno.struts2.action;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.struts2.dispatcher.RequestMap;
import org.leno.struts2.model.User;
import org.leno.struts2.model.UserDAO;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
private static final long serialVersionUID = 6254310773139650886L;
private User user;
private UserDAO userDao;
public RegisterAction() {
super();
this.userDao = new UserDAO();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
/**
*请求/register!default.action,调用doDefault方法
*/
@Override
public String doDefault() throws Exception {
return INPUT;
}
public String execute() throws Exception {
user.setRegDate(new Date());
System.out.println("**********"+user.getUsername());
userDao.register(user);
// List userList = userDao.findAll();
// Iterator it = userList.iterator();
// while(it.hasNext()){
// User u = (User) it.next();
// System.out.println(u.getUsername());
// }
// ActionContext context = ActionContext.getContext();
// RequestMap request = (RequestMap) context.get("request");
// request.put("userList", userList);
return SUCCESS;
}
}
Step5:当然是在struts.xml上配置RegisterAction了
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="register"
class="org.leno.struts2.action.RegisterAction">
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
<result name="success">/success.jsp</result>
<result name="input">/register.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
这样,我们一个简单的用户注册程序就开发完毕了。大家跑出来后就记住它,我们以后做的验证和I18N例子都会使用到这个程序。