struts1.x和struts2.x隨筆
網(wǎng)上有很多關(guān)于struts1.x和struts2.x的文章,但是都不太清楚,本人身為初學(xué)者,把自己的心得分享給和我一樣的初學(xué)者,如有不對的地方請多多指出,謝謝。如果需要轉(zhuǎn)載請注重個(gè)人學(xué)習(xí)成果,請注明出處,謝謝!
另外參考網(wǎng)上高手寫的struts心得原創(chuàng),地址:http://www.blogjava.net/nokiaguy/archive/2008/04/15/193229.html 建議看看。
首先我測試的工具是myeclipse9.0 M2。
筆記開始:
首先先給大家看看目錄:
struts1.x的整站結(jié)構(gòu)圖: struts2.x的整站結(jié)構(gòu)圖:
首先給出struts1.x 的搭建過程,之后是struts2的搭建過程,在搭建過程中會對struts1.x和struts2.x的重點(diǎn)進(jìn)行說明并說說他們的區(qū)別。在搭建環(huán)境之前說明一下,我是用myeclipse9.0 M2開發(fā)的,myeclipse會自動生成struts的jar包等文件及配置文件,如果是使用eclipse或者是其它工具開發(fā)的話,需要到網(wǎng)站下載struts框架需要的jar包,并添加到相應(yīng)的目錄,例如:在eclipse中開發(fā)struts1.x時(shí),需要把struts1.x的支持jar包復(fù)制到/WEB_INF/lib目錄下,把需要的tld文件復(fù)制到/WEB_INF目錄下。struts的框架請自己百度下載,在這里就不給的地址了。對于各個(gè)配置文件屬性的詳細(xì)說明,請讀者自己在百度搜索,百度很多的,都寫得很好。
struts1.x------------------------------------------------------------------------------------------------------------------------------------
現(xiàn)在開始搭建struts,搭建環(huán)境Struts1.x的基本步驟。
1. 安裝Struts1.x。由于Struts的入口點(diǎn)是ActionServlet,所以得在web.xml中需要配置這個(gè)Servlet。
2. 編寫ActionForm類(一般從org.apache.struts.action.ActionForm類繼承),這一步不是必須的,如果要接收客戶端提交的數(shù)據(jù),需要執(zhí)行這一步。
3. 編寫Action類(一般從org.apache.struts.action.Action類繼承)。
4. 在struts-config.xml文件中配置Action和ActionForm。
5. 如果要采集用戶錄入的數(shù)據(jù),一般需要編寫若干JSP頁面,并通過這些JSP頁面中的form將數(shù)據(jù)提交給Action。
根據(jù)上面的步驟,就可以搭建出struts1.x的的環(huán)境
(一)編寫web.xml文件(如果沒有就新建),配置要使用struts1.x必須配置web.xml文件,這樣web才能支持struts,配置代碼如下:
(二)編寫ActionForm類,在ActionForm類可以說是一個(gè)簡單的POJO類,在它的內(nèi)容里只需要定義對象的屬性和定義每個(gè)參數(shù)的get和set方法(這里的參數(shù)就是表單中的的參數(shù),名字可以根據(jù)自己習(xí)慣,最好是見名知意),所以struts1.x的ActionForm代碼如下
struts1.x 的Form文件:LoginForm.java的類文件代碼如下:
package struts1.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
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;
}
}
(三)編寫Action類,struts1.x 的Action類是最關(guān)鍵的類,它是必須的。Action類必須繼續(xù)Action類并實(shí)現(xiàn)Action類中的execute方法,這個(gè)方法中的的內(nèi)容就是我們的重點(diǎn),我們把數(shù)據(jù)的控制都寫在這里,這個(gè)Action類接收表單的數(shù)據(jù),進(jìn)行判斷處理,然后根據(jù)結(jié)果返回一個(gè)頁面轉(zhuǎn)向(我這里的只是簡單的測試,并沒有涉及數(shù)據(jù)庫操作,所以比較簡單),所以struts1.x的Action代碼如下
struts1.x 的Action文件:LoginAction.java的類文件代碼如下:
package struts1.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 struts1.form.LoginForm;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
String username=loginForm.getUsername();
String password=loginForm.getPassword();
if(username.equals("aaa")&&password.equals("000")){
return mapping.findForward("Success");
}else return mapping.findForward("Fail");
}
}
(四)在struts-config.xml文件中配置Action和ActionForm。這個(gè)配置就是讓服務(wù)器知道怎么工作,比如:當(dāng)用戶在登錄頁面點(diǎn)擊登錄之后,它就根據(jù)action的配置工作,當(dāng)然還有其他的一下配置,在這個(gè)測試中不需要就不寫了。
struts1.x 的struts-config.xml配置頁面代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans >
<form-bean name="loginForm" type="struts1.form.LoginForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
name="loginForm"
path="/login"
scope="request"
type="struts1.action.LoginAction">
<forward name="Success" path="/success.jsp"></forward>
<forward name="Fail" path="/fail.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="struts1.ApplicationResources" />
</struts-config>
第五步的內(nèi)容已經(jīng)在前面寫好了,各個(gè)頁面的代碼如上面所示,現(xiàn)在就可以運(yùn)行測試了。到此struts1.x測試完成。
struts2.x----------------------------------------------------------------------------------------------------------------------------------------------
開始搭建struts2.x。在說struts2.x之前先說一下webwork吧,WebWork2.2版本發(fā)布之后,官方宣稱WebWork框架將要和Struts合并。這讓一些WebWork的用戶產(chǎn)生了擔(dān)憂,合并之后,是不是就意味著自己在WebWork這方面技術(shù)和經(jīng)驗(yàn)的積累都已浪費(fèi)?已使用或即將使用WebWork的項(xiàng)目是不是就意味著更多的風(fēng)險(xiǎn)?
答案是:完全不用擔(dān)心這些。WebWork和Struts的合并,是各取所長,然后誕生出一個(gè)更加高效的Web框架。而這個(gè)框架用得就是WebWork的優(yōu)秀技術(shù)和Struts的強(qiáng)大社區(qū)。
合并的情況如下:
1、 產(chǎn)生一個(gè)新的項(xiàng)目Struts Action 2.0 = WebWork2.2 + 一些Struts的功能和特性。
2、 WebWork框架將會中止新功能的增加,如果有新的版本發(fā)布都會是Bug的修改。
3、 代碼、框架的開發(fā)者、社區(qū)都將移到Struts。
4、 合并的目標(biāo)是致力于生產(chǎn)率的提高。
5、 Struts不再是一個(gè)框架,它是一個(gè)社區(qū)。
6、 Struts社區(qū)中主要有兩個(gè)Web框架。一個(gè)是基于Action模型的Struts Action;另一個(gè)是基于組件模型的Struts Shale。
由上面的說明可以看到,struts2.x是webwork和struts1.x的合并產(chǎn)物,他們各取其優(yōu),但是要說明的是Struts2雖然在大版本號上是第二個(gè)版本,但基本上在配置和使用上已經(jīng)完全顛覆了Struts1.x的方式(當(dāng)然,Struts2仍然是基于MVC模式的,也是動作驅(qū)動的,可能這是唯一沒變的東西)。Struts2實(shí)際上是在Webwork基礎(chǔ)上構(gòu)建起來的MVC框架。我們從Struts2的源代碼中可以看到,有很多都是直接使用的xwork(Webwork的核心技術(shù))的包。既然從技術(shù)上來說Struts2是全新的框架,那么就讓我們來學(xué)習(xí)一下這個(gè)新的框架的使用方法。
搭建環(huán)境Struts2.x的基本步驟。
1. 安裝Struts2.x ,在web.xml中需要配置struts。
2. 編寫Action類(包含了struts1.x中的Action和ActionForm,一般從com.opensymphony.xwork2.ActionSupport繼承)。
3. 在struts.xml文件中配置Action。
4. 如果要采集用戶錄入的數(shù)據(jù),一般需要編寫若干JSP頁面,并通過這些JSP頁面中的form將數(shù)據(jù)提交給Action。
根據(jù)上面的步驟,就可以搭建出struts2.x的的環(huán)境
(一)安裝Struts2.x,配置web.xml文件,這一步對于Struts1.x和Struts2都是必須的,只是安裝的方法不同。Struts1的入口點(diǎn)是一個(gè)Servlet,而Struts2的入口點(diǎn)是一個(gè)過濾器(Filter)。因此,Struts2要按過濾器的方式配置。下面是在web.xml中配置Struts2的代碼:
struts2.x 的web.xml配置頁面代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
(二)編寫Action類,這一步和Struts1.x也必須進(jìn)行。只是Struts1.x中的動作類必須從Action類中繼承,而Struts2.x的動作類需要從com.opensymphony.xwork2.ActionSupport類繼承。
在Struts1.x中,必須要單獨(dú)建立一個(gè)ActionForm類(或是定義一個(gè)動作Form),而在Struts2中ActionForm和Action已經(jīng)二合一了。從下面的代碼可以看出,前面部分就是應(yīng)該寫在ActionForm類中的內(nèi)容。
從下面的代碼可以看出,動作類的一個(gè)特征就是要覆蓋execute方法,只是Struts2的execute方法沒有參數(shù)了,而Struts1.x的execute方法有四個(gè)參數(shù)。而且execute方法的返回值也不同的。Struts2只返回一個(gè)String,用于表述執(zhí)行結(jié)果(就是一個(gè)標(biāo)志)。
所以Action類代碼如下:
struts2.x 的Action類,LoginAction類文件的代碼如下:
package com.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private 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
if(getUsername().equals("bbb")&&getPassword().equals("111")){
return "Success";
}
else
{
return "Fail";
}
}
}
(三)在struts.xml文件中配置Action,這一步struts1.x和struts2.x都是必須的,只是在struts1.x中的配置文件一般叫struts-config.xml(當(dāng)然也可以是其他的文件名),而且一般放到WEB-INF目錄中。而在struts2.x中的配置文件一般為struts.xml,放在src目錄下,當(dāng)程序運(yùn)行的時(shí)候會自動復(fù)制到/WEB-INF下。
struts2.x 的struts.xml配置頁面代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2" extends="struts-default" >
<action name="Login" class="com.struts2.action.LoginAction">
<result name="Success">/success.jsp</result>
<result name="Fail">/fail.jsp</result>
</action>
</package>
</struts>
在<struts>標(biāo)簽中可以有多個(gè)<package>,第一個(gè)<package>可以指定一個(gè)Servlet訪問路徑(不包括動作名),如“/mystruts”。extends屬性繼承一個(gè)默認(rèn)的配置文件“struts-default”,一般都繼承于它,大家可以先不去管它。<action>標(biāo)簽中的name屬性表示動作名,class表示動作類名。
到此struts2.x配置完成。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
各個(gè)頁面代碼如下:
index.jsp,success.jsp,fail.jsp的頁面代碼(struts1.x和struts2.x的一樣):
index.jsp頁面代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="login.jsp">登錄</a> <br>
</body>
</html>
success.jsp頁面代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
登錄成功! <br>
</body>
</html>
fail.jsp頁面代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
登錄失敗! <br>
</body>
</html>
struts1.x 的login.jsp頁面代碼如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<html:form action="/login">
username : <html:text property="username"/><br/>
password : <html:password property="password"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
struts2.x 的login.jsp頁面代碼如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<s:form action="Login">
<s:textfield name="username" label="username" />
<s:password name="password" label="password" />
<s:submit/>
</s:form>
</body>
</html>
----------------------------------------------------------------------------------------------------------------------------------------
struts2.x的其他一些特性:
在login.jsp中使用了Struts2帶的tag。在Struts2中已經(jīng)將Struts1.x的好幾個(gè)標(biāo)簽庫都統(tǒng)一了,在Struts2中只有一個(gè)標(biāo)簽庫/struts-tags。這里面包含了所有的Struts2標(biāo)簽。但使用Struts2的標(biāo)簽大家要注意一下。在<s:form>中最好都使用Struts2標(biāo)簽,盡量不要用HTML或普通文本,大家可以將struts2.x中的login..jsp的代碼改為如下的形式,看看會出現(xiàn)什么效果:
........
<body>
<s:form action="Login">
username : <s:textfield name="username" />
password : <s:password name="password" />
<s:submit/>
</s:form>
</body>
提示一下,在<s:form>中Struts2使用<table>定位。如果使用上面的寫法,在瀏覽器中將會看到username和文本框不在同一行內(nèi)。
<result>標(biāo)簽的name實(shí)際上就是execute方法返回的字符串,如果返回的是“positive”,就跳轉(zhuǎn)到positive.jsp頁面,如果是“negative”,就跳轉(zhuǎn)到negative.jsp頁面。在<struts>中可以有多個(gè)<package>,在<package>中可以有多個(gè)<action>。我們可以用如下的URL來訪問這個(gè)動作:
注:Struts1.x的動作一般都以.do結(jié)尾,而Struts2是以.action結(jié)尾。
到此struts2.x配置完成。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
各個(gè)頁面代碼如下:
index.jsp,success.jsp,fail.jsp的頁面代碼(struts1.x和struts2.x的一樣):
index.jsp頁面代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="login.jsp">登錄</a> <br>
</body>
</html>
success.jsp頁面代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
登錄成功! <br>
</body>
</html>
fail.jsp頁面代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
登錄失敗! <br>
</body>
</html>
struts1.x 的login.jsp頁面代碼如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<html:form action="/login">
username : <html:text property="username"/><br/>
password : <html:password property="password"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
struts2.x 的login.jsp頁面代碼如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<s:form action="Login">
<s:textfield name="username" label="username" />
<s:password name="password" label="password" />
<s:submit/>
</s:form>
</body>
</html>
----------------------------------------------------------------------------------------------------------------------------------------
struts2.x的其他一些特性:
在login.jsp中使用了Struts2帶的tag。在Struts2中已經(jīng)將Struts1.x的好幾個(gè)標(biāo)簽庫都統(tǒng)一了,在Struts2中只有一個(gè)標(biāo)簽庫/struts-tags。這里面包含了所有的Struts2標(biāo)簽。但使用Struts2的標(biāo)簽大家要注意一下。在<s:form>中最好都使用Struts2標(biāo)簽,盡量不要用HTML或普通文本,大家可以將struts2.x中的login..jsp的代碼改為如下的形式,看看會出現(xiàn)什么效果:
........
<body>
<s:form action="Login">
username : <s:textfield name="username" />
password : <s:password name="password" />
<s:submit/>
</s:form>
</body>
提示一下,在<s:form>中Struts2使用<table>定位。如果使用上面的寫法,在瀏覽器中將會看到username和文本框不在同一行內(nèi)。

浙公網(wǎng)安備 33010602011771號