Struts2 常用標簽

来源:https://www.cnblogs.com/chy18883701161/archive/2019/09/07/11481139.html
-Advertisement-
Play Games

Struts中的標簽可分為2類: 通用|普通標簽 包括流程式控制制標簽、數據訪問標簽 UI標簽 包括表單標簽、非表單標簽 Struts2中的標簽均帶有首碼s。 常用的流程式控制制標簽 1、if-elseif-else標簽 條件判斷 test指定條件,滿足條件時,顯示標簽體的內容。 2、iterator標簽 ...


 

Struts中的標簽可分為2類:

  • 通用|普通標簽     包括流程式控制制標簽、數據訪問標簽
  • UI標簽    包括表單標簽、非表單標簽

 

Struts2中的標簽均帶有首碼s。

 

 

 


 

 

 

常用的流程式控制制標簽

1、if-elseif-else標簽     條件判斷

<s:set var="score" value="95" scope="request" />

<s:if test="#request.score>=80">優秀</s:if>
<s:elseif test="#request.score>=60">及格</s:elseif>
<s:else>不及格</s:else>

test指定條件,滿足條件時,顯示標簽體的內容。

 

 

2、iterator標簽   迭代Array、List、Map

<%
    List<User> list=new ArrayList<>();
    list.add(new User("劉備", 28));
    list.add(new User("關羽", 25));
    list.add(new User("張飛", 18));
    request.setAttribute("list",list);
%>

<table>
    <s:iterator var="user" value="#request.list">
        <tr>
            <td><s:property value="#user.name" /></td>
            <td><s:property value="#user.age" /></td>
        </tr>
    </s:iterator>
</table>

var指定臨時變數,代表一項,value指定Array | List | Map 。

 

在標簽體中可直接使用臨時變數。但不能這樣訪問:

<td>user.name</td>
<td>#user.name</td>
<td>%{#user.name}</td>

 

 

 


 

 

 

常用的數據訪問標簽

<s:debug />

<s:set var="group" value="vip" scope="session" />

<s:property value="#request.list" />

<s:include value="xxx.jsp" />

 

<s:debug>會在頁面上生成一個調試鏈接,可查看ValueStack中的數據。

<s:set>用於向某個域中存入數據,相當於setAttribute(),var指定參數的name,value指定參數的value。

<s:property>用於輸出ValueSatck中的數據,value指定要輸出的數據,只能使用OGNL表達式,不能使用常量,比如value="ok‘"是無效的。

<s:include>用於包含其他的JSP頁面。

 

 

 


 

 

 

常用的表單標簽

<s:form action="" method="">
    
    <s:textfield name="user" value="" label="用戶名" />
    <s:password name="pwd" value="" label="密碼" />
    <s:textarea name="comment" rows="10" cols="40" label="評論" value="" />

    <s:radio name="gender" list="#{'male':'男','female':'女'}" label="gender" />

    <s:checkboxlist name="hobby" list="#{'basketball':'籃球','running':'跑步','swimming':'游泳'}" label="愛好" />

    <s:checkbox name="hobby" value="basketball" label="籃球" />
    <s:checkbox name="hobby" value="running" label="跑步" />
    <s:checkbox name="hobby" value="swimming" label="游泳" />

    <s:select name="" list="#{'zk':'專科','bk':'本科','ss':'碩士','bs':'博士','qt':'其它'}" label="學歷" />
    <s:select name="" list="#{'zk':'專科','bk':'本科','ss':'碩士','bs':'博士','qt':'其它'}" label="學歷" headerKey="" headerValue="--請選擇--" />

    <s:file name="" />

    <s:hidden name="" value="" />

    <s:submit value="提交" />
    <s:reset value="重置" />

</s:form>

 

<s:textarea>的預設值是寫在value中的,這點與html的文本域不同。

 

list屬性可以寫成List,也可以寫成Map。寫成List時,value屬性值、選項文字都是List的元素;寫成Map時,value屬性值是Map的key,選項文字是Map的value。

 

可以用<s:checkboxlist>組合一組覆選框,以數組形式提交。

也可以逐個寫<s:checkbox>,各自提交。



 <s:select name="" list="#{'zk':'專科','bk':'本科','ss':'碩士','bs':'博士','qt':'其它'}" label="學歷" headerKey="" headerValue="--請選擇--" />

header即下拉列表中顯示的選項(第一項),headerKey指定第一項的value,headerValue指定第一項的顯示文字。

 

Struts2只提供了常用的表單標簽,沒有提供日期選擇器、顏色選擇器等標簽。

 

 

 

 

命名空間

如果struts.xml中設置命名空間:

    <package name="action" namespace="/action" extends="struts-default">
        <action name="LoginAction" class="action.LoginAction">
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
        </action>

    </package>

可以這樣寫action:

<s:form action="LoginAction" namespace="/action" >
    
</s:form>

 

 

不提倡這樣寫:

<s:form action="action/LoginAction">
    
</s:form>

第一次提交,地址欄是action/LoginAction;

如果填寫有問題,轉回此頁面重新填寫,點擊提交,地址欄變為action/action/LoginAction!

如果填寫還有問題,再次轉回此頁面重新填寫,點擊提交,地址欄變為action/action/action/LoginAction!

......

如果只提交一次,沒有問題;如果重覆提交多次,會有一點小問題。

只是地址欄變了,其實仍是action/LoginAction處理的。前一種更讓人放心。

 

 

 

 

可以給表單設置主題樣式:

<s:form action="" theme="xhtml">

</s:form>

主題預設為xhtml,每個表單元素都顯示為塊級,前後自動換行。

儘量用xhtml,其他自帶的主題不好控制效果。在xhtml主題的基礎上,可以使用cssClass、cssStyle,通過css樣式來改變界面。

 

其實Struts2標簽不常用,因為不好控制樣式,一般都是用html標簽。

 

 

 

 

表單元素常設置的屬性:

<s:textfield 
        title="ok"
        readonly="true" 
        disabled="true"
        required="true"
        cssClass="red"
        cssStyle="color: red;font-size: 18px;"
     onclick=""
/>

title指定提示文字,滑鼠移上去時會顯示提示文字。

readonly、disabled、required的設置方式和html的不同。required為true,提交時會檢查是否已填寫此欄位,未填寫會提示。

cssClass指定要引用的類選擇器,可以引用Struts2內置的樣式,也可以引用自定義的CSS樣式。

cssStyle寫行內樣式。

可以使用事件屬性。

 

 

 

 

數據回顯

<action name="LoginAction" class="action.LoginAction">
      <result name="success">/index.jsp</result>
      <result name="error">/login.jsp</result>
</action>

提交的表單通不過檢查時,通常會轉發給表單頁面重新填寫。

html標簽會丟失所有的表單數據,需要重新填一遍。Struts2標簽仍保留表單數據,會自動填寫上次提交的表單。

 

數據回顯的原理:Action處理完業務,調用表單頁面,此時ValueStack還沒被銷毀,會自動調用getter方法取出ValueStack中的表單數據,填寫表單。

需要給表單欄位對應的屬性設置getter方法,否則不能回顯。

 

<s:password>密碼欄位預設不會回顯,如需回顯,需要設置showPassword屬性為true:

<s:password name="pwd" showPassword="true"/>

 

 

 

 

防止重覆提交表單

刷新頁面可能會重新提交表單,造成表單的重覆提交。Struts2可以防止表單的重覆提交。

 

在表單中增加<s:token />元素:

<s:form action="LoginAction">
    
    
    <s:token />
    <s:submit value="提交" />
</s:form>

 

 在處理此表單的Action的配置中使用token攔截器:

<action name="LoginAction" class="action.LoginAction">
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            
            <result name="success">/index.jsp</result>
            <result name="error">/login.jsp</result>
</action>

在struts.xml中,如果此Action沒配置攔截器,預設會使用struts-default.xml中配置的預設攔截器棧。

預設攔截器棧是對請求進行常規的預處理操作,一般都需要。

如果我們在struts.xml中給此Action配置了攔截器,就不會再使用預設的攔截器棧,所以我們需要顯式引用預設的攔截器棧。

 

 

原理:

<s:token />本質是在表單中添加一個name="struts.token"的隱藏域,設置一個唯一標識此次表單提交的value,

token攔截器取出這個隱藏域的參數,和session中的struts.token比較,value相同就是重覆提交,直接pass調本次請求,不再調用action來處理;

value值不同,說明不是重覆提交,會將這個srtuts.token值放到session中,覆蓋原有的值,並調用action來處理請求。

 

如果使用了token攔截器,但一次都沒有使用<s:token />標簽,提交表單後,token攔截器獲取的value為null,session中的value也是null,相同,便不會調用action來處理,相當於提交不了表單。

沒有使用<s:token />標簽,就不要使用token攔截器。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在整理Java基礎知識的面試題,看到了一個題目的答案不夠準確,這裡跟大家分享一下。 一、面試題的小錯誤 對於TreeSet和TreeMap來說,元素應該是無序(指元素的存取)而不是有序的,而在表中它可能想表達的是可以排序,不夠嚴謹,嚴格來講 元素的有序≠可以排序。元素的存取有序和排序本質上應該是 ...
  • 1.1.類的定義 創建類 創建對象 1.2.private關鍵字 1.3.構造方法 1.4.Scanner類 1.5.Random類 1.6.ArrayList集合 1.7.String類 ...
  • 二分查找:兩種方式: 非遞歸方式和遞歸方式主要思路: 對於已排序的數組(先假定是從小到大排序), 先定義兩個"指針", 一個"指向"首元素low, 一個"指向"末尾元素high. 然後, 開始折半比較, 即讓要查找的數與數組中間的元素(索引為 low+high/2)比較. 若要查找的數比中間數小, ...
  • 前言 - 簡介 我們在寫代碼的過程中, 不可避免的重度依賴所處的開發環境. 本文重點帶大家在 Window 搭建 C 簡單控制台項目. 當作存檔, 用於記錄項目搭建各種重覆操作. 在詳細過程之前, 我們約定下基礎環境 Best new version Window Best new version ...
  • lambda是表達式,用於創建匿名函數,可以和filter、map、reduce配合使用。 本文環境Python3.7。 ...
  • const在不同位置時的不同意義 指針類型前:聲明一個指向常量的指針,程式中不能通過指針來改變它所指向的值,但指針本身的值可以改變,即指針可以指向其他數據; \" "號和指針名之間,聲明一個指針常量(常指針),指針本身的值不可改變,即不能指向其他數據,但指向的數據的值可以改變; 兩個地方都加,聲明指 ...
  • 0907自我總結 重新整理django中Auth模塊 一.設置 預設Auth表單 預設是使用自帶的 表單 自定義Auth表單 一定要在 中告訴 ,我現在使用我新定義的 表來做用戶認證。寫法如下: 在 創建表單模型可以對 進行繼承因為我們可以從源碼中看出來auth自帶的user表示繼承 類,所有我們可 ...
  • 一、函數名 ​ 函數名是⼀個變數, 但它是⼀個特殊的變數, 與括弧配合可以執⾏函數的變數。 1. 函數名的記憶體地址 2. 函數名可以賦值給其他變數 3. 函數名可以當做函數的參數 4. 函數名可以作為函數的返回值 二、閉包 1. 定義 ​ 如果在一個內部函數里,對在外部作用於(但不是在全局作用域)的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...