java创建描述文件,IT技术交流:Java 轻量级整合开发
原標題:IT技術交流:Java 輕量級整合開發
ervlet-ActionServlet
控制器,接受用戶請求和狀態改變,以及發出視圖選擇
FilterDispatcher
Action
控制器的一部分,與模型交互,執行狀態改變或狀態查詢,以及告訴ActionServlet 下一個選擇的視圖
ActionForm
狀態改變的數據
vo
ActionMapping
狀態改變事件
xwork.xml
ActionForward
用戶指向或者視圖選擇
Result
三.運行流程
[p=30, 2, left]
1.提交request→web容器(即tomcat);
2.依據web應用上下文找到web應用;如:
3.再依據部署描述文件web.xml找到ActionServlet
action
org.apache.struts.action.ActionServlet
config
/WEB-INF/struts-config.xml
2
action
*.do
4. ActionServlet接著大致執行順序如下:
a.讀struts-config.xml形成ActionMapping
b. 依據path找到相應的Action類定義
type="cn.javass.s2test.web.action.UserAction"
name="userForm"
scope="request"
input="/pages/add.jsp">
c.依據action定義找到Form的定義
name="userForm"
type="cn.javass.s2test.vo.UserForm">
d.把頁面參數填充到Form中
e. 調用execute()
f.執行execute()得到ActionFoward
g.依據ActionFoward到mapping中去下一個頁面
四.怎么做
1. 創建ActionForm
package cn.javass.s2test.vo;
import java.io.Serializable;
import java.util.*;
import org.apache.struts.action.ActionForm;
public class UserForm extends ActionForm implements Serializable {
private String uuid,userId,name;
private int age;
private Collection ufCol = new ArrayList();
@Override
public String toString(){
return "uuid=="+uuid+"userId=="+userId+"name=="+name+"age=="+age+"ufCol=="+ufCol;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final UserForm other = (UserForm) obj;
if (uuid == null) {
if (other.uuid != null)
return false;
} else if (!uuid.equals(other.uuid))
return false;
return true;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Collection getUfCol() {
return ufCol;
}
public void setUfCol(Collection ufCol) {
this.ufCol = ufCol;
}
}
說明:
l ActionForm是一個JavaBean,需繼承org.apache.struts.action.ActionForm類,它捕獲通過HTTP請求傳送的參數
l ActionForm針對每個HTML表單中的字段具有一個對應的屬性
l ActionServlet匹配請求中的參數和ActionForm中的屬性,并調用ActionForm中的setter方法,將參數傳入ActionForm
l 我們的add.jsp有四個表單字段(下面將會看到),所以,我們需要定義ActionForm中相應的setter方法ActionForm中的getter/setter方法,可以通過Eclipse集成環境,自動生成
l ActionForm中的內部屬性全部定義為私有的(private),并通過公共(public)的getter/setter方法來訪問
2.創建Action類
package cn.javass.s2test.web.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import cn.javass.s2test.business.ebi.UserEbi;
import cn.javass.s2test.util.springhelp.SpringBF;
import cn.javass.s2test.vo.UserForm;
public class UserAction extends Action {
private UserEbi getEbi(){
return (UserEbi)SpringBF.getBF().getBean("user-ebi");
}
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){
UserForm uf = (UserForm)form;
this.getEbi().create(uf);
uf.setUfCol(this.getEbi().getAll());
System.out.println("col============="+this.getEbi().getAll());
ActionForward af = mapping.findForward("toList");
return af;
}
}}
說明:
l Action是一個Java類,需繼承org.apache.struts.action.Action類
l ActionServlet將會組裝ActionForm,并將它傳遞給Action
l Action 通常負責:
? 輸入校驗
? 調用業務邏輯類執行業務邏輯操作
? 決定返回哪個ActionForward
l 我們的UserAction做了如下事情,這些是一個Action通常都會做的最典型的事情:
? 將輸入的ActionForm強制轉換為UserActionForm
? 從UserActionForm對象中獲取數據信息
? 執行數據信息的邏輯判斷操作
? 根據業務邏輯執行的結果,決定返回哪個ActionForward
3.創建Struts配置文件struts-config.xml
/p>
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
name="userForm"
type="cn.javass.s2test.vo.UserForm">
name="userForm"
scope="request"
input="/pages/add.jsp">
說明:
l struts-config.xml文件,是由ActionServlet讀取的配置文件,它定義了所有關于Action、ActionForm、ActionForward等的詳細信息
l 標簽內部可以包含多個標簽
l 標簽必須指定name和type屬性
925]? name屬性是給此ActionForm一個標識名稱
925]? type屬性指定了此ActionForm是哪個類,必須是全路徑的類名
05]l 標簽可以配置的重要屬性包括:
95]? path-從頁面上通過一個什么樣的URL路徑來訪問Action(不包含.do)
95]? type – 訪問這個URL的時候,調用哪個Action類,這是Action的全路徑類名
95]? name – 這個屬性用來標識哪個ActionForm將被創建,并將提交的表單組件給它
95]? scope – FormBean的作用域范圍,可以取值為session和request,一般取值都是request
創建add.jsp
pageEncoding="gb2312"%>
新增頁面業務編號:
用戶編號:
用戶姓名:
用戶年齡:
說明:
l 添加一個表單,action為cc.do,這個cc.do的意思,將會告訴struts的ActionServlet,它將需要調用哪個Action來處理這個表單的請求
l 添加輸入域name,這個name的表單字段,必須跟UserActionForm中的屬性一致
運行流程:
l 當你從瀏覽器輸入地址:http://localhost:808...b/pages/add.jsp,Tomcat將按通常情況來處理這個JSP并返回瀏覽器
l 當你提交表單,實際上是提交到了這樣一個URL地址:http://localhost:8088/web/cc.do,Tomcat將會根據web.xml的配置,將這個請求發送給相應的Servlet,在我們的應用中,Tomcat將會把這個請求發送給org.apache.struts.action.ActionServlet這個類(請參看web.xml的配置)
l 然后ActionServlet根據struts-config.xml的配置信息,調用UserAction對象去處理這個請求,在此之前,它會將頁面表單的請求數據封裝到UserForm對象中,并傳遞給LoginAction
l UserAction返回一個ActionForward對象,包含了將要轉向的路徑信息
l ActionServlet根據這個ActionForward對象所包含的路徑信息,調用相應的頁面去執行響應
Struts1和Struts2的區別和對比:
u Action 類:
? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。
? Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定制的服務成為可能。Struts2提供一個ActionSupport基類去 實現 常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
u 線程模式:
? Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發時特別小心。Action資源必須是線程安全的或同步的。
? Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,并且不會導致性能和垃圾回收問題)
u Servlet 依賴:
? Struts1 Action 依賴于Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
? Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。
u 可測性:
? 測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)。
? Struts 2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。
u 捕獲輸入:
? Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經 常創建多余的類捕獲輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存 在的JavaBean(仍然會導致有冗余的javabean)。
? Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用。
u 表達式語言:
? Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。
? Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"Object Graph Notation Language" (OGNL).
u 綁定值到頁面(view):
? Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。
? Struts 2 使用 "ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。
u 類型轉換:
? Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。
? Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。
u 校驗:
? Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。
? Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性
u Action執行的控制:
? Struts1支持每一個模塊有單獨的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。
? Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創建不同的生命周期。堆棧能夠根據需要和不同的Action一起使用。
u MyEclipse支持struts1,不支持struts2。返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的java创建描述文件,IT技术交流:Java 轻量级整合开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国剩余定理matlab非互质,中国剩余
- 下一篇: php接受go返回数据,Golang: