最近学习了Struts2,然后现在结合以前学过的Tomcat数据源实现一个注册程序。这里省略了一些部分,只写出部分重要代码,也算是一次总结吧。
首先、编写DAO :DAO是数据访问对象,封装了数据访问逻辑,当然这里为了简单起见把他们都写在了一个DAO类,并没有严格按照DAO的开发模式,比如DAO的接口类,DAO的真实主题类,DAO的代理类,数据库连接类,DAO工厂类,这是只是一个简单的UserDAO类。
查找数据源主要分三步:
1、初始化名称查找上下文 :Context ctx = new InitialContext();
2、通过名称查找DataSource对象 :DataSource ds = (DataSource)ctx.lookup(JDDI名称);比如java:comp/env/ jdbc/test;红色部分是固定前缀,为了避免命名冲突。
3、通过DataSource取得一个数据库连接对象 :Connection conn = ds.getConnection();
package cn.guet.hj.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import cn.guet.hj.bean.User; /** * * 数据访问对象 DAO * 主要封装数据访问逻辑 */ public class UserDAO { private DataSource dataSource;//数据源对象 /** * 在构造方法中初始化数据源对象 */ public UserDAO(){ Context ctx;//名称查找上下文 try { //第一步 初始化名称查找上下文 ctx = new InitialContext(); //第二步 通过名称查找数据源对象 dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/test"); } catch (NamingException e) { e.printStackTrace(); } } public DataSource getDataSource(){ return this.dataSource; } /** * 实现用户登录功能 */ public User register(User user)throws SQLException{ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ //第三步 通过DataSource取得一个数据库连接对象 conn = this.getDataSource().getConnection(); String sql = "insert into reg_user(username,password,sex,email,pwd_question,pwd_answer,reg_date) values(?,?,?,?,?,?,?)"; pstmt = conn.prepareStatement(sql); int index = 0; pstmt.setString(++index, user.getUsername()); pstmt.setString(++index, user.getPassword()); pstmt.setBoolean(++index, user.getSex()); pstmt.setString(++index, user.getEmail()); pstmt.setString(++index, user.getPwd_question()); pstmt.setString(++index, user.getPwd_answer()); pstmt.setTimestamp(++index, new java.sql.Timestamp(user.getReg_date().getTime())); pstmt.execute(); }finally{ if(rs!=null) rs.close(); if(pstmt!=null) pstmt.close(); if(conn!=null) conn.close(); } return user; } } 以上的代码还有一点要注意的是时间,注册时间是调用DAO是自动赋值的,但是要时间的类型是Timestamp ,时间戳,这样可以获得精确的时间。
然后,配置数据源 :在WebRoot/META-INF下新建context.xml配置数据源
<?xml version="1.0" encoding="UTF-8"?> <Context reloadable="true"> <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="123" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mldn"/> </Context> 几点说明:注意这里的name与DAO中用于查找数据DataSource对象的name,前面没有java:comp/env
auth是指容器负责资源的连接
type指明数据源对应的类型DataBase
接着编写Action类: 这个Action调用了User 和UserDAO。当请求为/register!default.action到来时调用doDefault方法,进入注册界面,正在做具体工作时的是execute方法,这也是默认的。
public class RegisterAction extends ActionSupport { private static final long serialVersionUID = 8995631776199916187L; private User user; private UserDAO userDao; /** * 在构造方法中初始化UserDAO */ public RegisterAction(){ userDao = new UserDAO(); } /** * 处理/register!default.action请求 */ public String doDefault()throws Exception{ return INPUT; } /** * 注册方法 */ public String execute()throws Exception{ user.setReg_date(new Date()); userDao.register(user); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } 几点说明:1、这里Action的属性为User,一定要为他添加setter与getter方法,以便JSP页面通过OGNL自动设置和访问User对象。
2、注意default.action请求可以访问的方法为default或doDefault。
最后修改配置文件struts.xml和web.xml
<struts> <constant name="struts.i18n.encoding" value="GBK"/> <package name="default" extends="struts-default"> <action name="register" class="cn.guet.hj.action.RegisterAction"> <exception-mapping result="error" exception="java.lang.Exception"/> <result name="input">/WEB-INF/pages/register.jsp</result> <result name="success">/WEB-INF/pages/success.jsp</result> <result name="error">/WEB-INF/pages/error.jsp</result> </action> </package> </struts> 特别说明:中文乱码的解决方法,设置常量struts.i18n.encoding为GBK。
测试:http://localhost/LoginByStruts2/register!default.action