1. 程式人生 > >Struts2 入門及概述

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"?>
/success.jsp /success.jsp
<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 /*

動態方法呼叫 開發中少,安全性低,基本沒人用,不需要請忽略
下面為單一模組的配置檔案

/success.jsp 程式碼展示計算器的加減乘除,返回都為“success”在單一模組配置中method="{1}" 的作用 ? name="calAction_*" 查詢 method="{1}"也就是CalAction 為add()的方法 name="calAction_*_*" 後面_*為結果集 那麼定義/success.jsp即可查詢相對應方法

程式碼展示(//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;
}

}