Struts 2相關配置與基本操作演示(案例Demo)
基本介紹
Struts 2
? ? ? ?Struts 2是Struts的下一代產品,是在 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>
? ? ? ? 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)