說(shuō)明:此教程是oksonic視頻教程的修改,我移植到eclipse3.2+myEclipse5.0環(huán)境下。原來(lái)放在我在和訊的博客上,寫的比較早,完成于去年下半學(xué)期,當(dāng)時(shí)還在學(xué)校,現(xiàn)在出來(lái)打工了,今年7月畢業(yè)。感覺(jué)在CSDN的高手多,所以轉(zhuǎn)移至此。
功能:集合了SSH框架,完成簡(jiǎn)單的登陸功能
工具:
eclipse-SDK-3.2.1、MyEclipse_5.0.1GA_E3.2、Tomcat_5.5.15、mysql-5.0.18
相關(guān)資料下載
原來(lái)的資料都是放在gbaopan下,現(xiàn)在gbaopan關(guān)了,沒(méi)有地方放了,只能放在郵箱里,在發(fā)件箱里的附件中
視頻教程下載郵件主題: struts+hibernate+spring視頻.part1
struts+hibernate+spring視頻.part2
工程下載郵件主題: struts+hibernate+spring_src.part1
struts+hibernate+spring_src.part1
說(shuō)明文件郵件主題: struts+hibernate+spring_說(shuō)明
properties2GBK.bat struts+hibernate+spring_說(shuō)明
開(kāi)始。。新建工程:名稱為 login
創(chuàng)建Struts框架
創(chuàng)建 index.jsp,增加一鏈接指向 login.jsp
<html>
<head>
<title>Struts+Spring+Hibernate</title>
</head>
<body>
<a href="login.jsp">Login</a>
</body>
</html>
按下Ctrl + N,創(chuàng)建 login.jsp、LoginAction,使用MyEclipse的向?qū)Ь涂梢粤耍浀眠x對(duì)正確的版本
在ActionForm配置頁(yè)中選擇類型為動(dòng)態(tài)Form,并繼承于DynaValidatorForm,新增兩個(gè)屬性:username、password,
在創(chuàng)建jsp文件打上鉤,將路徑改為/login.jsp,然后下一步,改LoginAction的Input source改為/login.jsp,點(diǎn)擊完成
按下Ctrl + N 創(chuàng)建一個(gè)forwards,記得選對(duì)正確的版本
name 輸入 indexGo
路徑選擇 /index.jsp
配置validator
先添加Struts插件,使用向?qū)?span>
Plugin class : org.apache.struts.validator.ValidatorPlugIn
Property : pathnames
Value : /WEB-INF/validator-rules.xml,/WEB-INF/validation.xml
這里需要兩個(gè)xml文件
現(xiàn)在創(chuàng)建“validation.xml” 文件
文件內(nèi)容如下:
<?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”
增加以下內(nèi)容
prompt.username=User Name
prompt.password=User Password
errors.required={0} is required.
再創(chuàng)建中文件資源文件“ApplicationResources_zh_CN.properties”
增加以下內(nèi)容
prompt.username=用戶名稱
prompt.password=登錄密碼
errors.required={0} 必需填寫!
我這沒(méi)有用Properties Editor插件,所以在tomcat發(fā)布后會(huì)顯示亂碼,我們可以用native2ascii來(lái)解決
我建了個(gè)批處理文件properties2GBK.bat
native2ascii -encoding gbk ApplicationResources_zh_CN.properties
temp.properties
del ApplicationResources_zh_CN.properties
rename temp.properties ApplicationResources_zh_CN.properties
放在你的classpath下,或者拷到你要轉(zhuǎn)GBK的地方,雙擊一下就可以了
我剛開(kāi)始在eclipse編輯中文properties文件,保存后再打開(kāi),也會(huì)出現(xiàn)亂碼,只要在eclipse上設(shè)置一下就可以了
具體設(shè)置:Eclipse-->Preferences...-->在“type filter text“欄中輸入”Content Types“查找,
然后在選擇右邊的Text下邊相應(yīng)的文件后綴名,即properties.修改其編碼就可。可以修改成GBK
我這已經(jīng)改好了,直接打開(kāi)就是漢語(yǔ)了。。。
建議下載 properties Editor插件,我這上不了外國(guó)網(wǎng)站,沒(méi)有辦法。。。。有空再下吧。。
修改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>
這里說(shuō)明提交的數(shù)據(jù)必需經(jīng)過(guò)驗(yàn)證,而驗(yàn)證則是通過(guò)validator框架進(jìn)行的。
修改web.xml文件
增加
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
顯示主頁(yè)
修改LoginAction.java文件的execute方法,內(nèi)容如下
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();
}
}
現(xiàn)在再修改一下login.jsp
增加以下部份
<%@ page language="java" contentType="text/html;
charset=UTF-8" %>
其中charset=UTF-8 是使用UTF-8的字符編碼,這也是為了支持國(guó)際化而使用的。要不然中文還是會(huì)顯示亂碼
關(guān)于亂碼解決,網(wǎng)上查資料,一查就有一堆
我們現(xiàn)在還沒(méi)有傳遞中文參數(shù),要不然還得加個(gè)過(guò)濾器。。
好了,現(xiàn)在可以啟動(dòng)Tomcat進(jìn)行測(cè)試了
http://localhost:8080/login/
如果不輸入任何數(shù)據(jù)而直接提交表單的話就可以看到效果了。
好了,如果沒(méi)有什么問(wèn)題的話就繼續(xù)往下看吧,如果有問(wèn)題的話就得往上看了^_^
出現(xiàn)了亂碼,我們用native2ascii來(lái)解決,非得我重啟一下!> ok了
現(xiàn)在創(chuàng)建Spring框架了,在這里我將Spring所有的包全部加載進(jìn)去,因?yàn)槲疫€不知道具體用到哪些類,全部加進(jìn)去方便點(diǎn)
單選框選第二個(gè),這樣的話所有的類庫(kù)和標(biāo)簽等都將拷貝到項(xiàng)目中去,這樣方便以后的布署
下一步后是創(chuàng)建配置文件,將文件放到“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的代理器來(lái)對(duì)Action進(jìn)行控制
當(dāng)提交到/login.do是將控制權(quán)交給了spring,然后由spring來(lái)決定是否轉(zhuǎn)回到struts的Action
現(xiàn)在來(lái)配置spring
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
<beans>
<bean name="/login"
class="com.test.struts.action.LoginAction"
singleton="false"></bean>
</beans>
屬性singleton="false",指明了Action 的實(shí)例獲取方式為每次重新創(chuàng)建。解決了Struts中令人詬病的線程安全問(wèn)題(Struts中,由一個(gè)Action實(shí)例處理所有的請(qǐng)求,這就導(dǎo)致了類公用資源在并發(fā)請(qǐng)求中的線程同步問(wèn)題。)(摘自spring開(kāi)發(fā)指南)
測(cè)試一下,如果沒(méi)有什么問(wèn)題的話就繼續(xù)往下看吧,如果有問(wèn)題的話就得往上看了^_^
好的,struts spring倆人成為朋友了,友好的集成到了一起。。。
建立數(shù)據(jù)庫(kù)在 這里我使用的是mysql-5.0.18
配置好mySql連接......
不好意思,這里我忘記驅(qū)動(dòng)怎么寫了。。。
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')
創(chuàng)建Hibernate框架
新建包com.test.hibernate
com.test.beans
選hibernate3.1 libraries全選,我也不知道那個(gè)具體有什么用^_^,可能只選第一個(gè)也行,但考慮還要用DAO,第三個(gè)也選上了,
看第二是高級(jí)支持,也加上了,沒(méi)試?yán)锩娴淖饔茫蠹矣锌湛梢栽囈幌隆!?span>
第二步選 spring configuration file 我們直接在Spring配置hibernate的連接。。就不用創(chuàng)建hibernate.cfg.xml了
第三步選existing Spring configuration file我們剛才已經(jīng)創(chuàng)建了一個(gè)。。
SessionFactory ID就直接填sessionFactory
第四步 Bean Id填 dataSource 我們用JDBC Driver,DB Profile選剛才配置好的
使用MyEclipse的數(shù)據(jù)Database Explorer工具創(chuàng)建User.hmb.xml、AbstractUser.java、User.java,UserDAO文件
這里選項(xiàng)比較多,大家看視頻。。我就不一一說(shuō)明了。。。不懂的看書(shū)^_^
打開(kāi)User.hbm.xml配置文件,把 catalog="meilvin" 這一項(xiàng)刪除了,要不后果很嚴(yán)重。因?yàn)閙ySql在連接的時(shí)候要寫上數(shù)據(jù)庫(kù)
如果我們?cè)谶@里也寫上數(shù)據(jù)庫(kù)的名字的話就會(huì)重復(fù)了,就變成了meilvin.meilvin.user,顯然是錯(cuò)的。后面就會(huì)報(bào)錯(cuò),我深有體會(huì)。
修改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的方法來(lái)進(jìn)行用戶驗(yàn)證
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();
}
}
}
現(xiàn)在剩下最后的spring配置了
把原來(lái)的
<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>
利用反轉(zhuǎn)控制產(chǎn)生action
現(xiàn)在可以進(jìn)行測(cè)試了,可以登陸了^-^
老是說(shuō)log4j沒(méi)有配置,下次視頻配置一下。。。成功了。。
注冊(cè)新用戶,用戶瀏覽、刪除用戶
打開(kāi)
UserDAO.java 文件,增加以下方法:
public boolean addUser(User user) {
try {
//調(diào)用前面save方法
save(user);
} catch (Exception e) {
System.out.println(e.getMessage());
return false;
}
return true;
}
按下 Ctrl + N ,使用向?qū)?chuàng)建 adduser.jsp 、AdduserForm(DynaValidatorForm)、AdduserAction.java文件,這是注冊(cè)新用戶的Action
我用的是maxthon瀏覽器,如果是add.jsp,它會(huì)當(dāng)做廣告攔下來(lái),,,,多加個(gè)user...
修改配置內(nèi)容如下:
<action
attribute="adduserForm"
input="/adduser.jsp"
name="adduserForm"
path="/adduser"
validate="true"
type="org.springframework.web.struts.DelegatingActionProxy" />
第一句實(shí)現(xiàn)了必須對(duì)提交的數(shù)據(jù)進(jìn)行驗(yàn)證
第二句實(shí)現(xiàn)了和spring集成
修改
AdduserAction.java 文件,內(nèi)容如下:
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();
}
}
關(guān)于在Action中使用 User 對(duì)像,我在這里沒(méi)有使用 IoC 方式進(jìn)行管理,這不好,希望大家在正式應(yīng)用中使用。
在spring配置文件(applicationContext.xml)中加入以下內(nèi)容:
<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 文件的首行,替換為以下內(nèi)容,目的是為了使用UTF-8的編碼格式顯示頁(yè)面
<%@ page language="java" contentType="text/html;
charset=UTF-8" %>
修改
validation.xml 文件,加入以下內(nèi)容:
<form name="adduserForm">
<field property="username"
depends="required">
<arg0 key="prompt.username" />
</field>
<field property="password"
depends="required">
<arg0 key="prompt.password" />
</field>
</form>
現(xiàn)在整個(gè) AddUser 已經(jīng)完成,如果你覺(jué)得不放心的話可以在這里停一停先進(jìn)行這一段的測(cè)試!
創(chuàng)建一個(gè)Action用于查詢數(shù)據(jù),名稱為 find
創(chuàng)建
display.jsp 文件,用于顯示所有用戶
創(chuàng)建一個(gè) 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 文件,內(nèi)容如下:
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)中加入以下內(nèi)容:
<bean name="/find"
class="com.test.struts.action.FindAction"
singleton="false">
<property name="userDAO">
<ref bean="UserDAO" />
</property>
</bean>
修改
display.jsp 文件,內(nèi)容如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="
<%@ taglib uri="
<%@ taglib uri="
<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>
現(xiàn)在整個(gè) Display 已經(jīng)完成,如果你覺(jué)得不放心的話可以在這里停一停先進(jìn)行這一段的測(cè)試!
新建一個(gè) Action 用于刪除選中的用戶,name:del
修改
struts-config.xml 文件中的以下內(nèi)容為:
<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 文件,內(nèi)容如下:
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導(dǎo)入包
在spring配置文件(applicationContext.xml)中加入以下內(nèi)容:
<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>
代碼已經(jīng)全部完成,可以進(jìn)行測(cè)試了!!!
如果測(cè)試不成功,請(qǐng)往回查看。。。。完了!!!
失誤失誤,大小寫不注意,就是這種后果,大家以后要注意點(diǎn)哦
好了,成功了,祝大家都成功!
拜拜!
posted on 2007-12-18 11:43
xyz 閱讀(1134)
評(píng)論(0) 編輯 收藏 所屬分類:
他山之石