Struts2 入門及概述
Struts2 概述
由 lxjazni_7 建立,youj 最後一次修改 2016-12-12
Struts2 是目前較為普及和成熟的基於MVC設計模式的web應用程式框架,它不僅僅是Struts1 的升級版本,更是一個全新的Struts架構。最初,是以WebWork框架和Struts框架為基礎,通過提供增強和改進的Struts框架,進而實現簡化web技術人員開發工作的目標。不久之後,Webwork框架和Struts社群聯合創造了現在流行的Struts2框架。
Struts2 框架的優點
瞭解了這幾個主要的優點,會促使你考慮使用Struts2 :
POJO表單及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分。在Struts2框架下,你可以用任何一POJO來接收表單輸入,同樣的,你可以把任一POJO視為一個Action類。 標籤支援 - Struts2 改進了標籤表單,而新的標籤可讓開發人員減少程式碼編寫量。 AJAX支援 - Struts2 被認可接收進Web 2.0技術,並建立了功能非常類似於標準的Struts2 標籤的AJAX標籤,把AJAX支援整合進其結果中。 易於整合 - Struts有多種整合方式可使用,現在與其他型別的框架,如Spring、Tiles、SiteMesh之類的,整合更為容易了。 模板支援 - 支援使用模板生成檢視。 外掛支援 - 有大量的外掛可用於Struts2,而使用外掛可以增強和擴大Struts2 核心行為。 效能分析 - Struts2 為除錯和配置應用程式提供綜合的效能分析,此外,Struts也以嵌入除錯工具的形式提供整合除錯。 易於修改標籤 - 在Struts2 中,可使用Freemarker的模板對標籤標記進行調整,而修改標籤不需要JSP或是Java知識,基本的HTML、XML和CSS知識就足夠了。 促進減少配置 - Struts2 使用各種設定的預設值促進減少配置,而你不需要再配置什麼除非是偏離了Struts2 設定的預設設定。 檢視技術 - Struts2 為多種檢視選項(JSP、Freemarker、Velocity、XSLT等)提供支援。
以上是使Struts2 成為準企業框架的十大優點。
Struts2 框架的缺點
儘管Struts2 有一大列的優點,但我們還是要提到關於它的一些仍需不斷改進的缺點:
更大的學習曲線 - 使用Struts MVC,你必須要熟悉JSP、Servlet APIs標準以及一個大型、複雜的框架。
文件缺乏 - 相比於Servlet和JSP APIs標準,Struts的線上資源較少,許多初學者會發現Apache線上文件混亂並缺乏整理。
不夠透明 - 相比於使用正常的基於Java的Web應用程式,使用Struts的應用程式有許多是進行在後臺,這使得框架不易於理解。
最後說明一點,一個好的框架應該提供各種型別的應用程式都可以使用的通用行為,Struts2 是最好的Web框架之一,並頻繁用於RIA(Rich Internet Applications)的發展。
1.環境搭建
導jar包
分模組開發的xml
基礎模組
<?xml version="1.0" encoding="UTF-8"?><package name="base" extends="struts-default" abstract="true">
<!-- struts2.5之後動態呼叫需要匹配正則 -->
<global-allowed-methods>regex:.*</global-allowed-methods>
</package>
單一模組
<?xml version="1.0" encoding="UTF-8"?><action name="paramAction" class="com.struts.one.web.ParamAction"></action>
總模組
<?xml version="1.0" encoding="UTF-8"?>xml 中央控制器
<?xml version="1.0" encoding="UTF-8"?> web_struts struts2 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter struts2 /*動態方法呼叫 開發中少,安全性低,基本沒人用,不需要請忽略
下面為單一模組的配置檔案
程式碼展示(//ServletActionContext.getRequest().setAttribute(“rs”, Integer.valueOf(cal.getNum1())+Integer.valueOf(cal.getNum2())); 部分)
包括值棧傳值(this.res = Integer.valueOf(cal.getNum1())+Integer.valueOf(cal.getNum2()); 部分)
public class CalAction implements ModelDriven{
//傳統作用域向jsp傳值
private Cal cal = new Cal();
//值棧傳值(提供變數)
private Object res;
public Object getRes() {
return res;
}
public void setRes(Object res) {
this.res = res;
}
public String add() {
//ServletActionContext.getRequest().setAttribute("rs", Integer.valueOf(cal.getNum1())+Integer.valueOf(cal.getNum2()));
//值棧傳值 = 傳一個變數
this.res = Integer.valueOf(cal.getNum1())+Integer.valueOf(cal.getNum2());
return "success";
}
public String min() {
//ServletActionContext.getRequest().setAttribute("rs", Integer.valueOf(cal.getNum1())-Integer.valueOf(cal.getNum2()));
this.res = Integer.valueOf(cal.getNum1())-Integer.valueOf(cal.getNum2());
return "success";
}
public String mul() {
//ServletActionContext.getRequest().setAttribute("rs", Integer.valueOf(cal.getNum1())*Integer.valueOf(cal.getNum2()));
this.res = Integer.valueOf(cal.getNum1())*Integer.valueOf(cal.getNum2());
return "success";
}
public String div() {
//ServletActionContext.getRequest().setAttribute("rs", Integer.valueOf(cal.getNum1())/Integer.valueOf(cal.getNum2()));
this.res = Integer.valueOf(cal.getNum1())/Integer.valueOf(cal.getNum2());
return "success";
}
@Override
public Cal getModel() {
return cal;
}
}
2.與j2ee互動(傳參)
一、瀏覽器->後臺 主要講解
1、modeldriven介面傳值
2、set、get方法傳值
3、物件導航傳值
二、後臺->瀏覽器jsp
1、傳統作用域向jsp傳值
—與j2ee容器互動—
1 非注入
1.1 耦合
ServletActionContext
1.2 解耦(建立使用解耦模式)
ActionContext
2 注入
2.1 耦合
2.2 解耦
三、值棧傳值(具體看上面程式碼,傳變數的)
程式碼展示
public class ParamAction implements ModelDriven{
/**
* 1、modeldriven介面傳值
*/
private User user1 = new User();
@Override
public User getModel() {
// TODO Auto-generated method stub
return user1;
}
/**
* 2、set、get方法傳值
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 驗證引數賦值問題
*/
private String uname;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
/**
* 3、物件導航傳值
*/
private User user2;
public User getUser2() {
return user2;
}
public void setUser2(User user2) {
this.user2 = user2;
}
public String execute() {
System.out.println("modeldriven介面傳值:"+this.user1);
System.out.println("set、get方法傳值:"+this.name);
//System.out.println("set、get方法傳值:"+this.uname);
System.out.println("物件導航傳值:"+this.user2);
return null;
}
}