?? 14. struts2.x note.txt
字號:
Struts 2.x初階
1.MVC原理
2.Struts框架的介紹
3.Struts2.x快速上手
4.Struts2.x框架的分析
*******************************************************************************
一、MVC原理
1. Model1---> Model2 ---> MVC Framework
2. Html/JavaScript --> dynamic web content 動態,可交互; 3. CGI --> Servlet --> JSP --> MVC (Model1 --> Model2) --> Framework 進程調用 線程調用,性能提高 靜態內容與動態內容分離; 框架 本地語言 可移植 頁面中嵌入java javabean --> 控制器
*******************************************************************************
二、Struts框架的起源和發展 設計理念:基于請求(http request) ---struts,WebWork.... 基于事件驅動,組件編程 ---JSF,Tapestry,ZK,echo
1.Struts1.x M:沒有定義設計方法 C:ActionServlet + struts-config.xml(核心控制器) Action:業務邏輯的控制器 V:JSP實現(EL) + Tags +Tiles .....
2.WebWork open source (開源組織:opensymphony) Rickard Oberg --- Jboss/XDoclet(annotation) C:核心控制器(ServletDispatcher) 業務控制器(Action) --- 使用攔截器鏈 V:支持JSP模板,FreeMarker, Velocity 等....
3.Struts2.x Struts1.x + WebWork 的整合(血統來自于WebWork) ServletDiapatcher --> FilterDispatcher
4.Struts1.x vs. Struts2.x 1)Struts1.x: 非常依賴Servlet API execute(mapping,form,request,response){...} 2)WebWork 攔截器鏈設計,擺脫對Servlet API的依賴 Action 3)Struts2.x: 控制器更加徹底:業務控制器Action---支持POJO 不再支持內置的IoC容器(Spring)
*******************************************************************************
三、Struts2.x快速上手
itcompany系統的部分功能:
登錄模塊
公司信息查詢
1.登錄應用————struts2.x快速上手
1)創建web工程,設置環境
A.WEB-INF/lib/
+Struts2.x需要的基本.jar
B.web.xml:
<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>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
C.在classpath下添加struts.xml
src/ + struts.xml (手工做時,則發布在WebRoot/WEB-INF/classes/)
<?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.0.dtd">
<struts>
<package name="login" extends="struts-default">
...
</package>
</struts>
2)login.jsp
使用基本的<html>標簽
<form action="Login.action" method="post">
username
password
3)Controller的開發(POJO)
+com.LoginAction
private String username;
private String password;
//getter,setter方法
public String execute() throws Exception {
//處理登錄邏輯
}
注釋:
execute方法:普通的方法,沒有任何的Servlet API、Struts2.x API的耦合
跳轉:
"success"
"fail"
4)配置Controller Action
struts.xml
+Action的配置
<struts>
<package name="login" extends="struts-default">
<action name="Login" class="com.LoginAction">
<result name="success">/successful.jsp</result>
<result name="fail">/login.jsp</result>
</action>
</package>
</struts>
********************************************
*通過不斷重構demo,來深入了解Struts應用。*
********************************************
2.改進Controller Action
implements Action(Interface of xwork)
1)Login.jsp---->Logon.jsp(重新提供)
<form action="Logon.action" method="post">
2)public class LogonAction implements Action
execute() {
...
return this.SUCCESS;
return this.ERROR;
}
注釋:閱讀Action接口的源碼
3.使用Servlet API添加狀態跟蹤(HttpSession)
1)在LogonAction的execute方法添加:
ActionContext.getContext().getSession().put("username", getUsername());
ActionContext
+getSession()
注意:返回的不是HttpSession,而是一個Map的封裝,
Struts2.x框架的內置攔截器實現了Session和HttpSession之間的轉換
2)在目標頁面successful.jsp添加
${username }
輸出該Session中key為"username"的值
4.實現系統的另外一個功能:
點擊鏈接,查詢并列舉出所有的Company信息
1)successful.jsp
<a href="ListComp.action">查看公司信息</a>
2)提供處理查詢公司信息的Action:
ListCompsAction
private List comps;
//其中,comps放置的是pojo.Company的列表
在execute()方法中,添加如下代碼:
String username = (String)ActionContext.getContext().getSession().get("username");
if("maxwell".equals(username)) {
Company comp = new Company();
comp.setCompName("Tarena");
comp.setAddress("天河區崗頂");
comp.setCity("廣州市");
comp.setEmail("hr@tarena.com.cn");
Company comp1 = new Company();
comp1.setCompName("Tecent");
comp1.setAddress("深南路55號");
comp1.setCity("深圳市");
comp1.setEmail("hr@qq.com.cn");
Company comp2 = new Company();
comp2.setCompName("IBM Research Center(Chinese)");
comp2.setAddress("王府井3樓");
comp2.setCity("北京市");
comp2.setEmail("hr@ibm.com");
companies.add(comp);
companies.add(comp1);
companies.add(comp2);
this.setComps(companies);
//跳轉到顯示頁面
return this.SUCCESS;
} else {
return this.LOGIN;
}
3)提供配置(struts.xml)
<action name="ListComp" class="com.ListCompsAction">
<result name="success">/viewCompanies.jsp</result>
<result name="login">/logon.jsp</result>
</action>
4)viewCompanies.jsp顯示數據
<table border=1>
<tr>
<th>公司名</th>
<th>城市</th>
<th>地址</th>
<th>郵箱</th>
</tr>
<%
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
List<Company> comps = (List) vs.findValue("comps");
for(Company comp : comps) {
%>
<tr>
<td><%=comp.getCompName() %></td>
<td><%=comp.getCity() %></td>
<td><%=comp.getAddress() %></td>
<td><%=comp.getEmail() %></td>
</tr>
<%
}
%>
</table>
注釋:
struts.valueStack
Action中的成員屬性,屬性可能是
(1)請求的參數
(2)下一個頁面顯示的數據
這些屬性的值被封裝起來,并放置在ValueStack對象中,
ValueStack對象的獲取:
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
開發人員可以通過屬性名來從ValueStack中讀取數據
5.對視圖的改進(使用struts標簽庫)
盡可能的消滅jsp中的Java代碼
1)加入標簽庫:
<%@ taglib prefix="s" uri="/struts-tags"%>
2)logon.jsp---->logonPage.jsp
<table border=1>
<s:form action="Logon" method="post">
<tr>
<s:textfield name="username" label="username"></s:textfield>
</tr>
<tr>
<s:password name="password" label="password"></s:password>
</tr>
<tr>
<s:submit value="login"></s:submit>
</tr>
</s:form>
</table>
注解:
<s:form/>標簽
<s:textfield/>
<s:password/>
<s:submit/>
3)viewCompanies.jsp----->listCompanies.jsp
<h1>It公司信息列表</h1>
<table border=1>
<tr>
<th>公司名</th>
<th>城市</th>
<th>地址</th>
<th>郵箱</th>
</tr>
<!-- 迭代輸出ValueStack對象中的comps, 其中status為迭代索引 -->
<s:iterator value="comps" status="index">
<!-- 判斷索引是否為奇數 -->
<s:if test="#index.odd == true">
<tr style="background-color:yellow">
</s:if>
<s:else>
<tr style="background-color:red">
</s:else>
<td><s:property value="compName"/></td>
<td><s:property value="city"/></td>
<td><s:property value="address"/></td>
<td><s:property value="email"/></td>
</tr>
</s:iterator>
</table>
注解:
<s:if test/>:判斷標簽
<s:else/>
<s:iterator/>迭代輸出,等價于jstl中的<c:forEach/>
6.i18n的支持
1)定義資源文件
resource包下
+itcomps.properties
+itcomps_en.properties
內容:
login.title=Please input your username and password
login.username=User Name
login.password=Password
login.submit=Login
login.success.msg=Congratulation, successfully Login!
view.comps.link=View the companies information
view.comps.title=View Companies
view.comps.compName=Company Name
view.comps.city=City
view.comps.addr=Address
view.comps.email=Email Box
+itcomps.txt
login.title=請輸入用戶名和密碼
login.username=用戶名
login.password=密碼
login.submit=登錄
login.success.msg=恭喜你,成功登錄了!
view.comps.link=查看公司信息
view.comps.title=查看It公司信息
view.comps.compName=公司名字
view.comps.city=城市
view.comps.addr=地址
view.comps.email=郵箱
+使用native2ascii工具把itcomps.txt轉換為itcomps_zh_CN.properties
內容:
login.title=\u8BF7\u8F93\u5165\u7528\u6237\u540D\u548C\u5BC6\u7801
login.username=\u7528\u6237\u540D
login.password=\u5BC6\u7801
login.submit=\u767B\u5F55
login.success.msg=\u606D\u559C\u4F60\uFF0C\u6210\u529F\u767B\u5F55\u4E86\uFF01
view.comps.link=\u67E5\u770B\u516C\u53F8\u4FE1\u606F
view.comps.title=\u67E5\u770BIt\u516C\u53F8\u4FE1\u606F
view.comps.compName=\u516C\u53F8\u540D\u5B57
view.comps.city=\u57CE\u5E02
view.comps.addr=\u5730\u5740
view.comps.email=\u90AE\u7BB1
2)添加struts.properties在類路徑下,并加入如下設置:
struts.custom.i18n.resources=resource.itcomps
3)輸出信息(2種方式)
方式一:
<s:text name="key"></s:text>
key:國際化信息的key,輸出為其value
方式二:使用OGNL表達式
%{getText('key')}
例如:
<s:textfield name="username" label="%{getText('login.username')}"></s:textfield>
<s:property value="%{getText('key')}"/>
7.添加數據校驗(編碼式)
需求:登記用戶
1)logon.jsp---->enroll.jsp
<s:form action="enroll" method="post">
2)開發EnrollAction
extends ActionSupport
添加校驗方法
@Override
public void validate() {
if(getUsername() == null || getUsername().equals("")) {
this.addFieldError("username", "username.required");
}
if(getPassword() == null || getPassword().equals("")) {
this.addFieldError("password", "password.required");
}
}
演示
3)加入i18n的支持
定義資源文件的內容:
username.required=User Name is required!
password.required=Password is required!
username.required=用戶名為必錄項!
password.required=密碼為必錄項!
使用native2ascii工具更新_zh_CN.properties文件
修改EnrollAction代碼:
this.addFieldError("username", this.getText("username.required"));
注意:
前提是要求輸入域必須在<s:form/>中。
8.聲明式驗證
1)logon.jsp
使用struts2標記
2)在Action下添加同名的校驗配置
LogonAction-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message key="username.required"></message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message key="password.required"></message>
</field-validator>
</field>
</validators>
*******************************************************************************
四、Struts2.x框架的分析
1)框架架構
2)基本流程
3)Struts2.x的基本配置
web.xml
struts.xml
struts.properties
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -