说明:此教程是oksonic视频教程的修改,我移植到eclipse3.2+myEclipse5.0环境下。原来放在我在和讯的博客上,写的比较早,完成于去年下半学期,当时还在学校,现在出来打工了,今年7月毕业。感觉在CSDN的高手多,所以转移至此。
功能:集合了SSH框架,完成简单的登陆功能
工具: eclipse-SDK-3.2.1、MyEclipse_5.0.1GA_E3.2、Tomcat_5.5.15、mysql-5.0.18
相关资料下载 原来的资料都是放在gbaopan下,现在gbaopan关了,没有地方放了,只能放在邮箱里,在发件箱里的附件中
用户名: infon.mei@163.com 密码: mei.infon
视频教程下载邮件主题: struts+hibernate+spring视频.part1 struts+hibernate+spring视频.part2
工程下载邮件主题: struts+hibernate+spring_src.part1 struts+hibernate+spring_src.part1 说明文件邮件主题: struts+hibernate+spring_说明 properties2GBK.bat struts+hibernate+spring_说明 开始。。新建工程:名称为 login 创建Struts框架 创建 index.jsp,增加一链接指向 login.jsp <html> <head> <title>Struts+Spring+Hibernate</title> </head> <body> <a href="login.jsp">Login</a> </body> </html> 按下Ctrl + N,创建 login.jsp、LoginAction,使用MyEclipse的向导就可以了,记得选对正确的版本 在ActionForm配置页中选择类型为动态Form,并继承于DynaValidatorForm,新增两个属性:username、password, 在创建jsp文件打上钩,将路径改为/login.jsp,然后下一步,改LoginAction的Input source改为/login.jsp,点击完成 按下Ctrl + N 创建一个forwards,记得选对正确的版本 name 输入 indexGo 路径选择 /index.jsp 配置validator 先添加Struts插件,使用向导 Plugin class : org.apache.struts.validator.ValidatorPlugIn Property : pathnames Value : /WEB-INF/validator-rules.xml,/WEB-INF/validation.xml 这里需要两个xml文件 现在创建“validation.xml” 文件
文件内容如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN" "validator_1_1_3.dtd" > <form-validation> <formset> <form name="loginForm"> <field property="username" depends="required"> <arg0 key="prompt.username" /> </field> <field property="password" depends="required"> <arg0 key="prompt.password" /> </field> </form> </formset> </form-validation> 编辑资源文件“ApplicationResources.properties” 增加以下内容 prompt.username=User Name prompt.password=User Password errors.required={0} is required. 再创建中文件资源文件“ApplicationResources_zh_CN.properties” 增加以下内容
prompt.username=用户名称 prompt.password=登录密码 errors.required={0} 必需填写!
我这没有用Properties Editor插件,所以在tomcat发布后会显示乱码,我们可以用native2ascii来解决 我建了个批处理文件properties2GBK.bat native2ascii -encoding gbk ApplicationResources_zh_CN.properties temp.properties del ApplicationResources_zh_CN.properties rename temp.properties ApplicationResources_zh_CN.properties 放在你的classpath下,或者拷到你要转GBK的地方,双击一下就可以了 我刚开始在eclipse编辑中文properties文件,保存后再打开,也会出现乱码,只要在eclipse上设置一下就可以了 具体设置:Eclipse-->Preferences...-->在“type filter text“栏中输入”Content Types“查找, 然后在选择右边的Text下边相应的文件后缀名,即properties.修改其编码就可。可以修改成GBK 我这已经改好了,直接打开就是汉语了。。。 建议下载 properties Editor插件,我这上不了外国网站,没有办法。。。。有空再下吧。。 修改struts-config.xml文件 在以下位置增加validate="true" <action-mappings > <action attribute="loginForm" input="/login.jsp" name="loginForm" path="/login" scope="request" validate="true" type="com.test.struts.action.LoginAction" /> </action-mappings> 这里说明提交的数据必需经过验证,而验证则是通过validator框架进行的。
修改web.xml文件 增加 <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> 显示主页 修改LoginAction.java文件的execute方法,内容如下 public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaValidatorForm loginForm = (DynaValidatorForm) form; String username=loginForm.getString("username"); String password=loginForm.getString("password"); if(username.equals("test")||password.equals("test")){ return mapping.findForward("indexGo"); }else{ return mapping.getInputForward(); } } 现在再修改一下login.jsp 增加以下部份 <%@ page language="java" contentType="text/html; charset=UTF-8" %> 其中charset=UTF-8 是使用UTF-8的字符编码,这也是为了支持国际化而使用的。要不然中文还是会显示乱码 关于乱码解决,网上查资料,一查就有一堆 我们现在还没有传递中文参数,要不然还得加个过滤器。。
好了,现在可以启动Tomcat进行测试了 http://localhost:8080/login/
如果不输入任何数据而直接提交表单的话就可以看到效果了。 好了,如果没有什么问题的话就继续往下看吧,如果有问题的话就得往上看了^_^ 出现了乱码,我们用native2ascii来解决,非得我重启一下!> ok了 现在创建Spring框架了,在这里我将Spring所有的包全部加载进去,因为我还不知道具体用到哪些类,全部加进去方便点 单选框选第二个,这样的话所有的类库和标签等都将拷贝到项目中去,这样方便以后的布署 下一步后是创建配置文件,将文件放到“WebRoot/WEB-INF”目录下,文件名称为“applicationContext.xml” 配置struts-config.xml文件,添加(spring)的插件 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in> 修改LoginAction配置 原: <action attribute="loginForm" input="/login.jsp" name="loginForm" path="/login" scope="request" validate="true" type="com.test.struts.action.LoginAction" /> </action-mappings> 改为: <action attribute="loginForm" input="/login.jsp" name="loginForm" path="/login" scope="request" validate="true" type="org.springframework.web.struts.DelegatingActionProxy" /> </action-mappings> 这里将使用spring的代理器来对Action进行控制 当提交到/login.do是将控制权交给了spring,然后由spring来决定是否转回到struts的Action 现在来配置spring <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"></bean> </beans>
属性singleton="false",指明了Action 的实例获取方式为每次重新创建。解决了Struts中令人诟病的线程安全问题(Struts中,由一个Action实例处理所有的请求,这就导致了类公用资源在并发请求中的线程同步问题。)(摘自spring开发指南) 测试一下,如果没有什么问题的话就继续往下看吧,如果有问题的话就得往上看了^_^ 好的,struts spring俩人成为朋友了,友好的集成到了一起。。。 建立数据库在 这里我使用的是mysql-5.0.18 配置好mySql连接...... 不好意思,这里我忘记驱动怎么写了。。。 CREATE TABLE `user` ( `ID` int(11) NOT NULL auto_increment, `USERNAME` varchar(50) NOT NULL default '', `PASSWORD` varchar(50) NOT NULL default '', PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 添加记录 insert into user (USERNAME,PASSWORD) values ('test','test')
创建Hibernate框架 新建包com.test.hibernate com.test.beans 选hibernate3.1 libraries全选,我也不知道那个具体有什么用^_^,可能只选第一个也行,但考虑还要用DAO,第三个也选上了, 看第二是高级支持,也加上了,没试里面的作用,大家有空可以试一下。。 第二步选 spring configuration file 我们直接在Spring配置hibernate的连接。。就不用创建hibernate.cfg.xml了 第三步选existing Spring configuration file我们刚才已经创建了一个。。 SessionFactory ID就直接填sessionFactory 第四步 Bean Id填 dataSource 我们用JDBC Driver,DB Profile选刚才配置好的
使用MyEclipse的数据Database Explorer工具创建User.hmb.xml、AbstractUser.java、User.java,UserDAO文件 这里选项比较多,大家看视频。。我就不一一说明了。。。不懂的看书^_^
打开User.hbm.xml配置文件,把 catalog="meilvin" 这一项删除了,要不后果很严重。因为mySql在连接的时候要写上数据库 如果我们在这里也写上数据库的名字的话就会重复了,就变成了meilvin.meilvin.user,显然是错的。后面就会报错,我深有体会。
修改UserDAO,增加如下方法 public boolean isValidUser(String username, String password) { String hql = "from User u where u.username=? and u.password=?"; String []userInfo=new String[2]; userInfo[0]=username; userInfo[1]=password; List userList = this.getHibernateTemplate().find(hql, userInfo); if (userList.size() > 0) { return true; } return false; }
修改LoginAction.java文件,使用userDao的方法来进行用户验证 package com.test.struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.validator.DynaValidatorForm; import com.test.UserDAO;
public class LoginAction extends Action {
private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaValidatorForm loginForm = (DynaValidatorForm) form; // TODO Auto-generated method stub String username = (String) loginForm.get("username"); String password = (String) loginForm.get("password"); loginForm.set("password", null); if (userDAO.isValidUser(username,password)) { return mapping.findForward("indexGo"); } else { return mapping.getInputForward(); } } } 现在剩下最后的spring配置了 把原来的 <bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"></bean> 删除了 在最底下增加 <bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"> <property name="userDAO"> <ref bean="UserDAO" /> </property> </bean> 利用反转控制产生action 现在可以进行测试了,可以登陆了^-^ 老是说log4j没有配置,下次视频配置一下。。。成功了。。
注册新用户,用户浏览、删除用户
打开 UserDAO.java 文件,增加以下方法: public boolean addUser(User user) { try { //调用前面save方法 save(user); } catch (Exception e) { System.out.println(e.getMessage()); return false; } return true; }
按下 Ctrl + N ,使用向导创建 adduser.jsp 、AdduserForm(DynaValidatorForm)、AdduserAction.java文件,这是注册新用户的Action 我用的是maxthon浏览器,如果是add.jsp,它会当做广告拦下来,,,,多加个user...
修改配置内容如下: <action attribute="adduserForm" input="/adduser.jsp" name="adduserForm" path="/adduser" validate="true" type="org.springframework.web.struts.DelegatingActionProxy" />
第一句实现了必须对提交的数据进行验证 第二句实现了和spring集成
修改 AdduserAction.java 文件,内容如下:
private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; }
public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaValidatorForm adduserForm = (DynaValidatorForm) form; User user = new User(); user.setUsername(adduserForm.getString("username")); user.setPassword(adduserForm.getString("password")); adduserForm.set("password", null); if (userDAO.addUser(user)) { return mapping.findForward("indexGo"); } else { return mapping.getInputForward(); } }
关于在Action中使用 User 对像,我在这里没有使用 IoC 方式进行管理,这不好,希望大家在正式应用中使用。
在spring配置文件(applicationContext.xml)中加入以下内容: <bean name="/adduser" class="com.test.struts.action.AdduserAction" singleton="false"> <property name="userDAO"> <ref bean="UserDAO" /> </property> </bean>
修改 index.jsp 文件 <html> <head> <title>Struts+Spring+Hibernate</title> </head> <body> <a href="login.jsp">Login</a> <br> <a href="add.jsp">Add User</a> </body> </html>
修改 adduser.jsp 文件的首行,替换为以下内容,目的是为了使用UTF-8的编码格式显示页面 <%@ page language="java" contentType="text/html; charset=UTF-8" %>
修改 validation.xml 文件,加入以下内容: <form name="adduserForm"> <field property="username" depends="required"> <arg0 key="prompt.username" /> </field> <field property="password" depends="required"> <arg0 key="prompt.password" /> </field> </form>
现在整个 AddUser 已经完成,如果你觉得不放心的话可以在这里停一停先进行这一段的测试!
创建一个Action用于查询数据,名称为 find
创建 display.jsp 文件,用于显示所有用户
创建一个 forward displayGO 指向 display.jsp 选中 redirect
修改 UserDAO.java 文件,增加 findAllUser() 方法,代码如下: public List findAllUser() { List users=this.getHibernateTemplate().find("from User u"); if(users.size()>0) return users; return null; }
修改 struts-config.xml 文件 <action path="/find" type="org.springframework.web.struts.DelegatingActionProxy" />
修改 FindAction.java 文件,内容如下: private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; }
public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { List users=userDAO.findAllUser(); if(users!=null){ HttpSession session=request.getSession(); session.setAttribute("users",users); return mapping.findForward("displayGo"); } return mapping.getInputForward(); }
在spring配置文件(applicationContext.xml)中加入以下内容: <bean name="/find" class="com.test.struts.action.FindAction" singleton="false"> <property name="userDAO"> <ref bean="UserDAO" /> </property> </bean>
修改 display.jsp 文件,内容如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%> <html> <head> <title>DISPLAY</title> </head> <body> <logic:present name="users"> <form action="del.do"> <table border="1"> <logic:iterate id="element" name="users"> <tr><td width="100"> <input type="radio" name="select" value="<bean:write name="element" property="id"/>"> <bean:write name="element" property="username"/> </td></tr> </logic:iterate> </table> <INPUT type="submit" name="Submit" value="submit"> </form> </logic:present> </body> </html>
现在整个 Display 已经完成,如果你觉得不放心的话可以在这里停一停先进行这一段的测试!
新建一个 Action 用于删除选中的用户,name:del
修改 struts-config.xml 文件中的以下内容为: <action path="/del" type="org.springframework.web.struts.DelegatingActionProxy" />
修改 UserDAO.java 文件,增加以下方法 public boolean delUser(Integer lid) { try { User user=(User)findById(lid); this.getHibernateTemplate().delete(user); } catch (Exception e) { System.out.println(e.getMessage()); return false; } return true; }
修改 DelAction.java 文件,内容如下: public class DelAction extends Action {
private UserDAO userDAO;
public UserDAO getUserDAO() { return userDAO; }
public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; }
public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Integer selid=Integer.valueOf(request.getParameter("select")); if(userDAO.delUser(selid)) return mapping.findForward("indexGo"); return mapping.getInputForward(); } } Ctrl+Shift+o导入包 在spring配置文件(applicationContext.xml)中加入以下内容: <bean name="/del" class="com.test.struts.action.DelAction" singleton="false"> <property name="userDAO"> <ref bean="UserDAO" /> </property> </bean>
修改 index.jsp 文件 <html> <head> <title>Struts+Spring+Hibernate</title> </head> <body> <a href="login.jsp">Login</a> <br> <a href="add.jsp">Add User</a> <br> <a href="find.do">Display</a> </body> </html>
代码已经全部完成,可以进行测试了!!!
如果测试不成功,请往回查看。。。。完了!!! 失误失误,大小写不注意,就是这种后果,大家以后要注意点哦 好了,成功了,祝大家都成功! 拜拜!