Struts2經常使用標籤


 property標籤html

  •property標籤用於輸出值棧中的對象的屬性值,使用value屬性來指定要輸出的對象屬性,若是沒有指定value屬性,那麼默認輸出棧頂對象。
 

屬性以下:java

例子:apache

<s:property value="username" default="遊客"/>

取出棧頂對象(一般是action)的username 屬性並輸出,若是沒有找到username屬性,那麼輸出「遊客」。數組

詳細例子:服務器

 

package com.struts;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.entity.Users;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 控制器類
 * 做用:處理客戶端的請求
 * @author asus
 *
 */
public class PropertyAction extends ActionSupport {

    /** 成員變量:值棧中屬性 */
    private Users user;
    
    /** 重寫execute方法 */
    public String execute(){
        /** 給成員變量賦值 */
        user= new Users(); 
        user.setName("admin");
        user.setPassword("q12345");
        
        /** 局部變量:非值棧中屬性 */
        Users userTow=user;
        String amp="&";
        String str="ABCD";
        String num="1";
        List<Users> list=new ArrayList<Users>();//集合中裝了兩個對象
        list.add(user);
        list.add(userTow);
        
        /** 將局部變量存入request範圍裏 */
        Map<String, Object> request=(Map<String, Object>) ActionContext.getContext().get("request");
        request.put("userTow", userTow);
        request.put("amp", amp);
        request.put("str", str);
        request.put("num", num);
        request.put("list", list);
        
        return SUCCESS;
    }
    
    /** JavaBean */
    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }
    
}
Action 控制器類

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<body>
        <h1>
            結果頁面
        </h1>
        <!-- property標籤基本用法 -->
        <!-- 取值棧中的屬性(Action中的成員屬性)
                須要生成Get,Set方法,不須要加範圍與井號
             -->
        結果1:
        <s:property value="user.name" default="若value屬性中沒有取到值則輸出此內容。" />
        <br>
        <!-- 取非值棧中的屬性(除了Action中的成員屬性外)
                須要加井號,與在獲取request/session/application/attr/parameters這五個範圍時,須要明確指定範圍
             -->
        結果2:
        <s:property value="#request.userTow.password" />
        <br>
        <!-- 
            escape:是否轉譯
                true:表示將value內的內容強制轉換成字符串顯示    如&會被轉換爲&amp;
                false:表示將value值當作html代碼去解析         會被被解析爲&
             -->
        結果3:
        <s:property value="#request.amp" escape="true" />
        hearts;
        <br>
        結果4:<!-- 這裏結果爲桃心符號 -->
        <s:property value="#request.amp" escape="false" />
        hearts;
        <br>
        

        <!-- property標籤靈活用法 -->
        <!-- 
            value參數的類型是object,能夠理解爲這個默認是會解析成ognl表達式的
                好比須要輸入一個字符串string,在value裏面的字符串string外面加了單引號,這樣不會將string解析成ognl表達式了
             -->
        結果5:
        <s:property value="'user'" />
        <br>
        <!-- 故value的值解析成OGNL表達式,在此表達式內,有些對象的值的使用與java代碼類似,但不相同,如下取幾個例子 -->
        結果6:
        <s:property value="#request.str.length()" />
        <br>
        結果7:
        <s:property value="#request.str.substring(1,3)" />
        <br>
        <!-- value內還能夠寫表達式,好比輸出一個整型變量num的+1值 -->
        結果8:
        <s:property value="#request.num+1" />
        <br>
        <!-- value內爲List集合時,取其長度 -->
        結果9:
        <s:property value="#request.list.size" />
        <br>
        <!-- value內爲List集合時,取其內容 -->
        結果10:
        <s:property value="#request.list.get(0).name" />
    </body>
JSP結果頁面

 

例子頁面輸出結果:session

 

 

 


set標籤app

  •Set標籤將一個值賦給指定範圍內變量。Set標籤在某些狀況下是比較有用的,例如在頁面中屢次引用一個複雜的表達式,咱們能夠將這個表達式賦給一個變量,而後直接引用變量。帶來的好處就是:
      –提高了性能(表達式的計算只有一次)
      –提升了代碼的可讀性。
 

屬性以下:jsp

例子:ide

        <!-- 使用bean標籤訂義一個javaBean實例 -->
        <s:bean name="lee.Person" id="p">
            <s:param name="name" value="zhangsan" />
            <s:param name="age" value="29" />
        </s:bean>
        將p放入默認範圍內
        <s:set value="#p" name="test" />
        <s:property value="#test.name" />
        <br>
        <s:property value="#test.age" />
        <br>
        將p放入application範圍內。
        <s:set value="#p" name="test" scope="application" />
        <s:property value="#attr.test.name" />
        <br>
        <s:property value="#attr.test.age" />
        <br>
        將p放入session範圍內。
        <s:set value="#p" name="test" scope="session" />
        ${sessionScope.test.name}
        <br>
        ${sessionScope.test.age}
        <br>

詳細例子:post

 

package com.struts;


import com.entity.Users;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 控制器類
 * 做用:處理客戶端的請求
 * @author asus
 *
 */
public class SetAction extends ActionSupport {

    /** 成員變量:值棧中屬性 */
    private Users user;
    
    /** 重寫execute方法 */
    public String execute(){
        /** 給成員變量賦值 */
        user = new Users();
        user.setName("admin");
        
        return SUCCESS;
    }
    
    /** JavaBean */
    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }
    
}
Action 控制器類

 

<%@ taglib uri="/struts-tags" prefix="s"%>
    <body>
        <!-- set標籤 -->
        <h1>
            set標籤
        </h1>
        <p>
            將Action中成員屬性:user.name的值保存到默認範圍中,即Stack Context(application)
        </p>
        <s:set name="name" value="user.name" />
        <!-- <s:property value="#application.name" />這種寫法取不到值 -->
        <s:property value="#name" />
        <s:property value="#attr.name" />

        <p>
            當指定範圍類型application
        </p>
        <s:set name="nameTow" value="user.name" scope="application" />
        <!-- <s:property value="#nameTow" />這種寫法取不到值  -->
        <s:property value="#attr.nameTow" />
        <s:property value="#application.nameTow" />

        <p>
            小結:set標籤默認範圍是application。 當刻意去指定範圍爲application時,雖然範圍相同,但他們取值方式又有略微不一樣。
            <br>
            共通點:均可以使用attr
            <br>
            區別:
            <br>
            1)默認不指定範圍的方式,取值能夠不加範圍標誌,不能使用application範圍標誌打點取值。
            <br>
            2)指定application的方式,取值必需要加範圍標誌,但可使用application範圍標誌打點取值。
            <br>

        </p>

    </body>
JSP結果頁面

 

例子頁面輸出結果:

 


push標籤 

  •push標籤用於把一個值壓入值棧(位於棧頂),注意和set標籤的區別,set標籤是將值放到action上下文中。當push標籤結束後,push標籤放入值棧中的對象將被刪除,換句話說,要訪問push標籤壓入棧中的對象,須要在標籤內部去訪問。
 
屬性以下:
 
 
    <!-- 使用bean標籤建立一個JavaBean實例,並將其放入Stack Context中 -->
        <s:bean name="lee.Person" id="p">

            <s:param name="name" value="'yeeku'" />

            <s:param name="age" value="29" />

        </s:bean>

        <s:push value="#p">

            <s:property value="name" />

            <s:propery value="age" />

        </s:push>

詳細例子:

 

package com.struts;


import com.entity.Users;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 控制器類
 * 做用:處理用戶的請求
 * @author asus
 *
 */
public class PushAction extends ActionSupport {

    /** 成員變量:值棧中屬性 */
    private Users user;
    
    /** 重寫execute方法 */
    public String execute(){
        user=new Users();
        user.setName("執拗的雨");
        user.setAge(15);
        user.setSex("女");
        
        //存入session會話範圍
        ActionContext.getContext().getSession().put("user", user);
        
        return SUCCESS;
    }
    
    /** JavaBean */
    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }
    
}
Action 控制器類

 

<%@ taglib uri="/struts-tags" prefix="s"%>
    <body>
        <!-- push標籤 -->
        <h1>push標籤</h1>
        <h4>
            普通方式訪問
        </h4>
        姓名:
        <s:property value="#session.user.name" />
        年齡:
        <s:property value="#session.user.age" />
        性別:
        <s:property value="#session.user.sex" />

        <h4>
            使用push標籤後簡化的訪問方式
        </h4>
        <s:push value="#session.user">
            姓名:<s:property value="name" />
            年齡:<s:property value="age" />
            性別:<s:property value="sex" />
        </s:push>
    </body>
JSP結果頁面

 

例子頁面輸出結果:


 

include標籤
  •include標籤相似於JSP的<jsp:include>標籤,用於包含一個Servlet或JSP頁面。include標籤的標籤體內能夠包含多個param標籤,用於向被包含的頁面傳遞請求參數。
 
屬性以下:

例子:

        <h2>
            使用s:include標籤來包含目標頁面
        </h2>

        <s:include value="include-file.jsp" />

        <!--使用include標籤來包含其餘頁面,而且傳入參數-->

        <s:include value="include-file.jsp">

            <s:param name="author" value="'yeeku'" />

        </s:include>

        被包含的頁面僅使用表達式語言輸出author參數,被包含頁面的代碼以下:

        <h3>
            被包含的頁面
        </h3>

        <!--表達式語言輸出author的請求參數-->

        ${param.author}

詳細例子:

    <body>
        <!-- include標籤 -->
        <h4>
            使用include標籤包含(引用)jsp1.jsp
        </h4>
        <s:include value="jsp1.jsp" />

        <h4>
            使用include標籤包含(引用)jsp2.jsp,使用嵌套的param標籤向jsp2.jsp傳遞參數
        </h4>
        <s:include value="jsp2.jsp">
            <s:param name="name" value="'姓拼名命'" />
            <s:param name="sex" value="'男'" />
        </s:include>
    </body>
JSP結果頁面
    <body>
        歡迎訪問jsp1.jsp頁面!
    </body>
jsp1.jsp
    <body>
        歡迎訪問jsp2.jsp頁面!
        <br>

        <!--表達式語言輸出author的請求參數,沒法使用s:property標籤取值,只能用EL表達式-->
        姓名:${param.name } 性別:${param.sex }
    </body>
jsp2.jsp

例子頁面輸出結果:


date標籤
  •date標籤用於格式化輸出日期值,也可用於輸出當前日期值與指定日期值之間的時差
 
屬性以下:
Ø注意:
Ø一、format屬性用於指定日期的格式化樣式,具體的樣式規則能夠參看java.text.SimpleDateFormat類的API文檔。
Ø二、將nice屬性設爲true,能夠輸出指定日期值和當前日期值之間的時差,此時format屬性失效,也就是說,當nice屬性爲true時,即便你指定了format屬性,它也不會起做用
Ø三、若是沒有使用nice屬性,也沒有指定format屬性,那麼date標籤將會在國際化資源包中查找struts.date.format鍵,並以這個鍵的值做爲日期的格式化樣式;若是這個鍵
   不存在,那麼默認將會使用DateFormat.MEDIUM格式化樣式。
Ø四、若是找不到name屬性指定的Date對象,那麼將返回空。
 
•第一步
  •在ApplicationResources.properties文件中添加struts.date.format鍵
    struts.date.format=yyyy/MM/dd hh:mm:ss
 
•第二步
  •可使用struts2的struts.custom.i18n.resources屬性來設置默認的資源包,編輯struts.xml文件,使用constant元素來配置struts.custom.i18n.resources屬性,
    內容以下:
<constant name=「struts.custom.i18n.resources」 value=「ApplicationResources」/>
 
•第三步

詳細例子:

struts.date.format=yyyy/MM/dd hh\:mm\:ss
ApplicationResource.properties
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <!-- 設置默認資源包 -->
    <constant name="struts.custom.i18n.resources" value="ApplicationResources"/>
</struts>    
struts.xml
<%@ page language="java" pageEncoding="UTF-8"%>
<!-- 引入Struts2標籤庫 -->
<%@ taglib uri="/struts-tags" prefix="s" %>
<!-- 引入Canlendar的包 -->
<%@page import="java.util.Calendar"%>
  <body>
    <%
        //獲取當天指定點上的時間
        Calendar calendar= Calendar.getInstance();
        //經過calendar.set方法修改當前日期,將天數向後加10天
        calendar.set(calendar.get(calendar.YEAR),
                     calendar.get(calendar.MONTH),
                     calendar.get(calendar.DATE) + 10);
        
        //存入application
           pageContext.setAttribute("futureDate",calendar.getTime());
     %>
     
     <h1>date標籤</h1>
     <h3>指定format="yyyy年MM月dd日"</h3>
     <s:date name="#attr.futureDate" format="yyyy年MM月dd日" />
     
     <h3>沒有使用format屬性,指定nice="true",能夠輸出「獲取到的日期值」和「如今的時間」之間的「時差」</h3>
     <!-- 
         將nice屬性設爲true,能夠輸出指定日期值和當前日期值之間的時差。
             指定日期爲:獲取到的日期值。
             當前日期爲:今天,如今的時間。
      -->
     <s:date name="#attr.futureDate" nice="true" />
     
     <h3>沒有使用format和nice屬性,將以資源包中struts.date.format鍵的值做爲格式化樣式</h3>
     <s:date name="#attr.futureDate" />
     
  </body>
date.jsp

例子頁面輸出結果:

 

 datetimepicker日期控件
第一步:添加DOJO.jar包

 

第二步:

<!-- 引入Ajax標籤 -->
<%@ taglib uri="/struts-dojo-tags" prefix="sx"%>

  <head>
    <!-- 在JSP頁面中加入head標籤
            負責在頁面上導入Dojo所須要的CSS庫和JavaScript庫 -->
        <sx:head />
  </head>
  
  <body>
      <!-- datetimepicker日期控件  日期月份會有亂碼,具體解決網上百度吧~-->
   <sx:datetimepicker name="user.birthday" label="出生日期" value="%{'2008-9-20'}"/>
  </body>

結果頁面:

 


if/elseif/else標籤
  •if/elseif標籤屬性test:爲必填屬性,是一個Boolean類型值,決定是否顯示if標籤內容。該標籤標準格式以下:
 
<s:if test=「表達式」>
……..
</s:if>
<s:elseif test=「表達式」>
……..
</s:elseif>
<s:else>
………..
</s:else>

例子:

<!-- 引入Struts2標籤庫 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
    <body>
        <!-- OGNL是一般要結合Struts 2的標誌一塊兒使用。struts2標籤裏不能使用EL表達式。 -->
        <h4>
            例子1
        </h4>
        <!-- 定義一個testname屬性 -->
        <s:set name="testname" value="%{'Java'}" />
        <!-- 使用if標籤判斷-->
        <s:if test="%{#testname=='Java'}">
            <div>
                <s:property value="%{# testname}" />
            </div>
        </s:if>
        <s:elseif test="%{#testname=='Jav'}">
            <div>
                <s:property value="%{# testname}" />
            </div>
        </s:elseif>
        <s:else>
            <div>
                testname不是「Java」
            </div>
        </s:else>
    </body>

 


 

 iterator(迭代標籤)
  •描述:用於遍歷集合(java.util.Collection)List,Map,數組或枚舉值(java.util.iterator)。
 
該標籤的屬性以下表:
 
•int getCount():返回當前迭代過元素的總數。
•int getIndex():返回當前迭代元素的索引。
•boolean isEven():判斷當前迭元素是否爲偶數。
•boolean isOdd():判斷當前迭元素是否爲奇數。
•boolean isFirst():判斷當前迭元素是否爲第一個元素。
•boolean isLast():判斷當前迭元素是否爲最後一個元素
 
例子:
<!-- 引入Struts2標籤庫 -->
<%@ taglib uri="/struts-tags" prefix="s" %>

  <body>
      <!-- iterator迭代標籤 -->
    <h1>iterator迭代標籤</h1>
    
    <h4>迭代List,不使用status</h4>
    <s:iterator value="{'zhangsan' , 'lisi' , 'wangwu'}" >
        <s:property/><br>
    </s:iterator>
    
    <h4>迭代List,使用status</h4>
    <table border="1" >
        <tr>
            <th>當前元素</th>
            <th>當前迭代的元素的總數</th>
            <th>當前迭代的元素的索引</th>
            <th>判斷當前迭代的元素是不是偶數</th>
            <th>判斷當前迭代的元素是不是奇數</th>
            <th>判斷當前迭代的元素是不是第一個元素</th>
            <th>判斷當前迭代的元素是不是最後一個元素</th>
        </tr>
        <s:iterator value="{'zhangsan' , 'lisi' , 'wangwu'}" status="status" >
            <tr>
                <td><s:property/></td>
                <td><s:property value="#status.getCount()" /></td>
                <td><s:property value="#status.index" /></td><!-- 簡寫方式:index 不簡寫方式:getIndex() -->
                <td><s:property value="#status.isEven()" /></td>
                <td><s:property value="#status.odd" /></td><!-- 簡寫方式:odd 不簡寫方式:isOdd() -->
                <td><s:property value="#status.first" /></td>
                <td><s:property value="#status.last" /></td>
            </tr>
        </s:iterator>
    </table>
    
    <h4>迭代Map,不使用status屬性,  \#{}是用來構造Map的寫法</h4>
    <s:iterator value="#{'first':'zhangsan', 'second':'lisi', 'third':'wangwu' }" >
        <s:property value="key" /> = <s:property value="value" /><br>
    </s:iterator>
  </body>

結果頁面:


token標籤(實現防止表單重複提交)
因爲某些緣由,用戶在進行相似表單提交的操做後,覺得表單未被提交,會進行屢次的重複提交。爲了不用戶屢次提交給服務器帶來負荷。咱們會對錶單提交這樣的操做進行一些處理,以告訴用戶不要重複提交。
 
第一步:使用<s:token></s:token>標籤:
     登陸頁面中的關鍵技術就是使用了標籤庫中的<s:token></s:token>標籤,
     它的做用就是在用戶訪問此頁面時會生成一個sessionId,
     在提交時會服務器會據此驗證表單是否已提交,
     提交到的Action便能配置TokenInterceptor攔截器驗證表單是否重複提交。
 
第二步:配置XML文件
     <result name="success">/success.jsp</result>
     <result name="invalid.token">/error.jsp</result>
     <interceptor-ref name="token"></interceptor-ref>
     <interceptor-ref name="defaultStack"></interceptor-ref>
    此Action下,咱們配置了token攔截器,另注意到在此Action下咱們還配置了一個       「invalid.token」result,提交時服務器若是根據token標籤產生的sessionId判斷出表單已提交,
   它則返回invalid.token指向的視圖。好比這裏,若是重複提交則會轉到.../error.jsp中去。
   另不要忘記了引入默認的攔截器棧。
 
<s:token />標籤防止重複提交,用法以下:
第一步:在表單中加入<s:token />
 <s:form action="helloworld_other" method="post" namespace="/test">
    <s:textfield name="person.name"/>
    <s:token/>
    <s:submit/>
  </s:form>
 
第二步:
<action name="helloworld_*" class="com.action.HelloWorldAction" method="{1}">
       <result>ok.jsp</result>
       <result name="invalid.token">error.jsp</result>
        <interceptor-ref name="token"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
</action>
 
詳細例子(用戶登陸):
package com.entity;

import java.util.Date;

/**
 * 用戶類
 * @author asus
 *
 */
public class Users {

    /** 屬性 */
    private String name;
    private String password;
    private int age;
    private String sex;
    private Date birthday;
    
    /** 構造方法 */
    public Users() {
        super();
    }
    public Users(String name, String password) {
        super();
        this.name = name;
        this.password = password;
    }
    
    /** javaBean */
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    
}
Users實體類
<%@ taglib uri="/struts-tags" prefix="s" %>

  <body>
        <!-- Struts2 表單標籤 -->
        <!-- 
            action=loginAction     爲token攔截器,重複提交,跳轉錯誤頁面
            action=login2Action 爲tokenSession攔截器,重複提交時,留着當前頁面,且攔截本次提交
         -->
        <s:form action="loginAction" method="post" theme="simple" >
            <!-- 加入token標籤 -->
            <s:token/>
            用戶名:<s:textfield name="user.name" />
            密碼:     <s:password name="user.password" />
            <s:submit value="登陸按鈕" />
        </s:form>
  </body>
login.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <package name="struts2" extends="struts-default">
        <!-- token標籤
            1-配置token攔截器,會實現若表單重複提交則跳轉錯誤頁面。
         -->
        <action name="loginAction" class="com.struts.LoginAction" >
            <result>/s_token/success.jsp</result>
            <!-- 當判斷表單重複提交時,token攔截器則會返回invalid.token指向的視圖 -->
            <result name="invalid.token" >/s_token/error.jsp</result>
            <!-- 配置防止表單重複提交的局部攔截器 Struts2自帶的攔截器,固然也能夠配置成全局默認的,看需求。
                注意:不要忘記了引入默認的攔截器棧 -->
            <interceptor-ref name="token"></interceptor-ref>
             <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
        
        <!-- token標籤
            2-配置tokenSession攔截器,會實現若表單重複提交時不會跳轉頁面(留在當前頁面)且攔截本次提交。
         -->
        <action name="login2Action" class="com.struts.LoginAction" >
            <result>/s_token/success.jsp</result>
            <!-- 配置防止表單重複提交的局部攔截器 Struts2自帶的攔截器,固然也能夠配置成全局默認的,看需求。
                注意:不要忘記了引入默認的攔截器棧-->
            <interceptor-ref name="tokenSession"></interceptor-ref>
             <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>    
struts.xml
package com.struts;



import com.entity.Users;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 控制器類
 * 做用:處理用戶的請求
 * @author asus
 *
 */
public class LoginAction extends ActionSupport {

    /** 成員變量:值棧中屬性 */
    private Users user;
    
    /** 重寫execute方法 */
    public String execute(){
        
        System.out.println("請求Action進入execute()方法。。");//控制檯測試,是否屢次重複提交。
        
        //驗證登陸
        if(user!=null){
            if(user.getName().equals("admin") && user.getPassword().equals("a123")){
                return SUCCESS;
            }
        }
        
        return SUCCESS;//只爲掩飾效果,密碼錯誤也會走成功頁面
    }
    
    /** JavaBean */
    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }
    
}
LoginAction
  <body>
        登錄成功進入此頁面!
  </body>
success.jsp
  <body>
        當表單重複提交時跳轉到此頁面!
  </body>
error.jsp

結果頁面:

相關文章
相關標籤/搜索