1. 程式人生 > >Struts 2相關配置與基本操作演示(案例Demo)

Struts 2相關配置與基本操作演示(案例Demo)

emp content 表達式求值 success etc obj height pen ria

版權聲明:本文為博主原創文章,未經博主同意不得轉載。 https://blog.csdn.net/ma_hoking/article/details/35984507

基本介紹

Struts 2

? ? ? ?Struts 2Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合並的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構區別巨大。

Struts 2以WebWork為核心,採用攔截器的機制來處理用戶的請求,這種設計也使得業務邏輯控制器能夠與ServletAPI全然脫離開,所以Struts 2能夠理解為WebWork的更新產品。盡管從Struts 1到Struts 2有著太大的變化,可是相對於WebWork。Struts 2的變化非常小。

【本文的演示項目以Struts 2.3.16 版本號為例】

【轉載使用,請註明出處:http://blog.csdn.net/mahoking/article/details/35984507

Struts 2 IOC

? ? ? ? ? ?對於IoC來說。常見的就是Spring框架的了。而且在眼下Java EE開發中,使用SSH框架時,也主要依賴於Spring框架所提供的IoC功能。

但Struts2框架本身也提供了IoC的功能。

IoC(Inversion of Control)。隨著Java社區中輕量級容器(Lightweight Contianer)的推廣而越來越為大家耳熟能詳。值得一提的是,Spring確實是一個值得學習的框架,由於有越來越多的開源組件,如iBATIS(新版本號為Mybatis)等。都放棄與Spring重疊的功能的開發。因此。Struts 2推薦大家通過Spring實現控制反轉。

? ? ? ?控制反轉(Inversion of Control,IoC)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題,也是輕量級的Spring框架的核心。 控制反轉一般分為兩種類型。依賴註入(DependencyInjection。簡稱DI

)和依賴查找。依賴註入應用比較廣泛。

? ? ? ? ?1、依賴查找(Dependency Lookup):容器提供回調接口和上下文環境給組件。

EJB和Apache Avalon都使用這種方式。

? ? ? ? ?2、依賴註入(Dependency Injection):組件不做定位查詢,僅僅提供普通的Java方法讓容器去決定依賴關系。

後者是時下最流行的IoC類型,其又有接口註入(Interface Injection)。設值註入(Setter Injection)和構造子(器)註入(ConstructorInjection)三種方式。【如想深入了解,須要讀者自行拓展閱讀】

Struts 2 ValueStack(值棧)OGNL

? ? ? ? 值棧ValueStack是Struts2框架核心組件,它提供對上下文信息和運行環境中元素的訪問機制。

其在底層實現了一個棧,但與傳統棧的實現有所不同。

? ? ? ? 值棧由下面4個層級對象組成:

? ? ? ? (1) 暫時對象:這些對象在請求處理過程中須要暫時保存。比方集合中當前正在叠代的元素。

? ? ? ? (2) 模型對象:當Action實現了ModelDriven接口時,模型對象就會被存放在棧中被運行的Action前面。否則不存在這個級別的內容;

? ? ? ? (3) Action對象:此對象為當前正在運行的action。

? ? ? ? (4) 命名對象:不論什麽對象都能夠被賦予一個標誌符而成為命名對象。比方與HTTP同等作用域的對象集合相應的Struts2命名對象,#application、#session、#request、#attr和#parameters等。

? ? ? ? 值棧的使用方式:

? ? ? ? 棧的傳統使用方式是壓棧和出棧。

對於值棧則是通過使用OGNL(ObjectGraph Navigational Language對象導航語言)語法編寫的特定表達式來查找。或者是在該表達式之上求值。

? ? ? ? OGNL表達式【該部分的應用,會在演示Demo中涉及】

  • ?使用圓點符號和表達式求值
  • ?調用被檢索對象的方法
  • ?結合自己定義標簽使用

? ? ? 常見使用方法:

? ? ? (1) person.name??調用getPerson().getName()

? ? ? (2) #session.user從會話對象中獲取user屬性對象

? ? ? (3) #session.shopcart.size()獲取會話中購物車的數量

? ? ? (4) top 獲取值棧最頂層對象 【該部分須要讀者,自行拓展閱讀】

? ? ? ?【轉載使用。請註明出處:http://blog.csdn.net/mahoking/article/details/35984507

參考案例

第一步:創建Web項目 StrutsDemo
第二步:加入所需的jar文件(包) ? 參見【相關Jar文件】
項目完整結構截圖例如以下:

技術分享圖片



第三步:加入並編輯struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<!-- 啟動開發模式 -->
	<constant name="struts.devMode" value="true"/>
	<!-- <constant name="struts.objectFactory" value="spring" />  bean交spring管理 -->
	<!-- 為true可使用感嘆號調用方法,官網不推薦 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="false" />
	<!-- 載入src/config/struts2/ 文件夾下全部struts文件 註意命名格式 -->
	<!-- <include file="config/struts2/struts-*.xml"></include> -->
	<include file="config/struts2/struts-test.xml"></include>
</struts>

第四步:編寫Action 對象【本例涉及IOC與非IOC兩種方式】

1、 非IOC方式Action

/**
 * 非IoC方式Action
 * @author Mahc
 */
public class UnIOCmode {
	private String message;
	private ArrayList<Person> persons = new ArrayList<Person>();
	public String method() {
//		獲得ActionContext實例,以便訪問Servlet API  
        ActionContext ctx = ActionContext.getContext();
        
//      獲取Parameter  
//      Map paramMap = ctx.getParameters();    獲取的對象為String[]
        if(null!=ctx.getParameters().get("msg")){
	        String[] msg = (String[])ctx.getParameters().get("msg");
	        System.out.println(msg[0]);
        }
        
        // Java  Servlet  HttpServletRequest 對象操作
        String servletMsg = ServletActionContext.getRequest().getParameter("msg");
        System.out.println(servletMsg);
        //
//        ctx.getParameters().put("msg", "parameter信息");   待檢測
        
//      向application域存入數據  
//      Map<String, Object> applicationMap = ctx.getApplication();
        ctx.getApplication().put("msg", "application信息");

//      向session域存入數據   
//      Map<String, Object> sessionMap = ctx.getSession();
        ctx.getSession().put("msg", "seesion信息"); 
        
//      向request域存入數據   
        HttpServletRequest request = ServletActionContext.getRequest();  
        request.setAttribute("msg", "request信息");
        
		//////////////////////////////////////////
        System.out.println("Struts2 非IOC 配置成功。");
        message = "Success";
		//////////////////////////////////////////
		
    	Person p = new Person();
		p.setAge(25);
		p.setBirthday(new Date());
		p.setName("pla1");
		persons.add(p);
		// 為persons賦值  
		for(int i=1;i<4;i++){
			Person person = new Person();
			person.setAge(19+i);
			person.setBirthday(new Date());
			person.setName("pla"+i);
			persons.add(person);
		}
		return "msg";
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public ArrayList<Person> getPersons() {
		return persons;
	}

	public void setPersons(ArrayList<Person> persons) {
		this.persons = persons;
	}
}

2、 IOC方式Action

/**
 * IOC方式Action
 * @author Mahc
 */
public class IOCmode extends ActionSupport implements ServletRequestAware ,SessionAware,ApplicationAware,ParameterAware{

	private HttpServletRequest request;
	private Map<String,Object> sessionMap;
	private Map<String,Object> applicationMap;
	private Map parameterMap;
	
	private ArrayList<Person> persons = new ArrayList<Person>();
	private String message;
	
	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setSession(Map<String, Object> session) {
		sessionMap = session;
	}

	public void setApplication(Map<String, Object> application) {
		applicationMap = application;
	}

	public void setParameters(Map<String, String[]> parameter) {
		parameterMap = parameter;
		if(null!=parameterMap.get("ioc_msg")){
			String[] ioc_msgs = (String[]) parameterMap.get("ioc_msg");
	        System.out.println("ioc_msg========="+ioc_msgs[0]);
		}
	}

	public String method(){
		
//		向application域存入數據
		applicationMap.put("ioc_msg", "application信息_ioc");
		
//		向session域存入數據
		sessionMap.put("ioc_msg", "session信息_ioc");
		
//		向request域存入數據
		request.setAttribute("ioc_msg", "request信息_ioc");
		
		//////////////////////////////////////////
        System.out.println("Struts2  IOC 配置成功!

"); message = "IOC_SUCCESS"; ////////////////////////////////////////// //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ Person p = new Person(); p.setAge(25); p.setBirthday(new Date()); p.setName("pla1"); persons.add(p); // 為persons賦值 for(int i=1;i<4;i++){ Person person = new Person(); person.setAge(19+i); person.setBirthday(new Date()); person.setName("pla"+i); persons.add(person); } //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ return "IOC_SUCCESS"; } public ArrayList<Person> getPersons() { return persons; } public void setPersons(ArrayList<Person> persons) { this.persons = persons; } }


第五步:編寫相關JSP頁面?

【IOC.jsp相應IOC方式,unIOC.jsp相應非IOC方式】

1、 unIOC.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>

		<title>首頁</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
	</head>

	<body>
		<p>
			parameters:
			<s:property value="#parameters.msg" />
		</p>
		<p>
			request.msg:
			<s:property value="#request.msg" />
		</p>
		<p>
			session.msg:
			<s:property value="#session.msg" />
		</p>
		<p>
			application.msg:
			<s:property value="#application.msg" />
		</p>
		<p>
			attr.msg:
			<s:property value="#attr.msg" />
		</p>
		<hr />
		<%=request.getAttribute("msg")%>
		${message}

		<h3>
			用於過濾和投影(projecting)集合
		</h3>

		<p>
			年齡大於20
		</p>

		<ul>
			<!-推斷年齡-->

			<s:iterator value="persons.{?

#this.age>20}"> <li> <s:property value="name" /> - 年齡: <s:property value="age" /> </li> </s:iterator> </ul> <p> 姓名為pla1的年齡: <s:property value="persons.{?#this.name==‘pla1‘}.{age}[0]" /> </p> <hr /> <h3> 構造Map </h3> <s:set name="foobar" value="#{‘foo1‘:‘bar1‘, ‘foo2‘:‘bar2‘}" /> <p> The value of key "foo1" is <s:property value="#foobar[‘foo1‘]" /> </p> <hr /> <h4> %符號的使用方法 </h4> <s:set name="foobar" value="#{‘foo1‘:‘bar1‘, ‘foo2‘:‘bar2‘}" /> <p> The value of key "foo1" is <s:property value="#foobar[‘foo1‘]" /> </p> <p> 不使用%: <s:url value="#foobar[‘foo1‘]" /> </p> <p> 使用%: <s:url value="%{#foobar[‘foo1‘]}" /> </p> </body> </html>


2、 IOC.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>首頁</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
	</head>

	<body>
		<p>
			parameters:
			<s:property value="#parameters.ioc_msg" />
		</p>
		<p>
			request.ioc_msg:
			<s:property value="#request.ioc_msg" />
		</p>
		<p>
			session.ioc_msg:
			<s:property value="#session.ioc_msg" />
		</p>
		<p>
			application.ioc_msg:
			<s:property value="#application.ioc_msg" />
		</p>
		<p>
			attr.msg:
			<s:property value="#attr.ioc_msg" />
		</p>
		<hr />
		<%=request.getAttribute("ioc_msg")%>
		${message}

		<h3>
			用於過濾和投影(projecting)集合
		</h3>

		<p>
			年齡大於20
		</p>

		<ul>
			<!-推斷年齡-->

			<s:iterator value="persons.{?#this.age>20}">

				<li>
					<s:property value="name" />
					- 年齡:
					<s:property value="age" />
				</li>

			</s:iterator>

		</ul>

		<p>
			姓名為pla1的年齡:
			<s:property value="persons.{?#this.name==‘pla1‘}.{age}[0]" />
		</p>

		<hr />

		<h3>
			構造Map
		</h3>

		<s:set name="foobar" value="#{‘foo1‘:‘bar1‘, ‘foo2‘:‘bar2‘}" />

		<p>
			The value of key "foo1" is
			<s:property value="#foobar[‘foo1‘]" />
		</p>

		<hr />

		<h4>
			%符號的使用方法
		</h4>

		<s:set name="foobar" value="#{‘foo1‘:‘bar1‘, ‘foo2‘:‘bar2‘}" />

		<p>
			The value of key "foo1" is
			<s:property value="#foobar[‘foo1‘]" />
		</p>

		<p>
			不使用%:
			<s:url value="#foobar[‘foo1‘]" />
		</p>

		<p>
			使用%:
			<s:url value="%{#foobar[‘foo1‘]}" />
		</p>
	</body>
</html>

第六步:編輯Action相應XML文件(struts-test.xml)

struts-test.xml文件位於src/ config/struts2文件夾下

<?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.3.dtd"> <struts> <package name="test1" namespace="/test" extends="struts-default"> <action name="ioc_*" class="cn.mahaochen.web.IOCmode" method="{1}"> <result name="IOC_SUCCESS">/IOC.jsp</result> </action> <action name="unioc_*" class="cn.mahaochen.web.UnIOCmode" method="{1}"> <result name="msg">/unIOC.jsp</result> </action> </package> </struts>


第七步:測試操作
編輯index.jsp頁面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>Struts2.3.16 高速使用</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
	<style type="text/css">
        body {
            text-align:center;
        }
    </style>
	</head>
	<body >
		<p><h3>Struts2.3.16 高速使用</h3></p>
		<hr />
		<p><a href="test/unioc_method.action" >Struts2 非IOC方式</a></p>
		<p><a href="test/unioc_method.action?msg=123message321" >Struts2 非

IOC方式[含請求參數]</a></p>
		<p><a href="test/ioc_method.action" >Struts2 ??IOC方式

</a></p>
		<p><a href="test/ioc_method.action?ioc_msg=123message321" >Struts2 

??IOC方式[含請求參數]</a></p>
		<hr />
	</body>
</html>


測試用URL

? ? ? ? http://127.0.0.1/StrutsDemo/test/unioc_method.action ? ?非IOC方式測試
? ? ? ? http://127.0.0.1/StrutsDemo/test/ioc_method.action ? ? ? IOC方式測試

界面截圖

技術分享圖片

相關Jar文件

  • struts2-core-2.3.16.jar
  • xwork-core-2.3.16.jar
  • commons-logging-1.1.3.jar
  • ognl-3.0.6.jar
  • commons-fileupload-1.3.jar
  • freemarker-2.3.19.jar
  • commons-io-2.2.jar
  • javassist-3.11.0.GA.jar
  • commons-lang-2.4.jar
  • commons-lang3-3.1.jar

下載地址

下載演示項目?http://download.csdn.net/detail/ma_hoking/7561727

參考文獻

1、 http://www.java3z.com/cwbwebhome/article/article2/2938.html?

id=1631
2、 http://blog.163.com/neu_lxb/blog/static/179417010201145104245861/

【轉載使用,請註明出處:http://blog.csdn.net/mahoking/article/details/35984507


Struts 2相關配置與基本操作演示(案例Demo)