日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts2基础知识(三)

發布時間:2024/7/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2基础知识(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要包括以下內容

  • OGNL表達式
  • 標簽
  • 防止表單重復提交
  • 使用第三方插件
  • tomcat啟動時struts2容器做的事
  • OGNL表達式

    OGNL是Object Graphic Navigation Language(對象圖導航語言)的縮寫,它是一個開源項目。Struts2框架使用OGNL作為默認的表達式語言。

    相對EL表達式,它提供了平時我們需要的一些功能,如:
    支持對象方法調用,如xxx.sayHello();
    支持類靜態方法調用和值訪問,表達式的格式為@[類全名(包括包路徑)]@[方法名|值名],例如:@java.lang.String@format(‘foo %s’,’bar’)或@cn.itcast.Constant@APP_NAME;
    操作集合對象

    Ognl有一個上下文(Context)概念,說白了上下文就是一個MAP結構,它實現了java.utils.Map接口,在Struts2中上下文(Context)的實現為ActionContext,下面是上下文(Context)的結構示意圖

    小技巧:在頁面中使用查看上下文中的對象

    OGNL表達式語言

    • 訪問上下文(Context)中的對象需要使用#符號標注命名空間,如#application、#session
      另外OGNL會設定一個根對象(root對象),在struts2中根對象就是ValueStack(值棧)。如果要訪問根對象(即ValueStack)中對象的屬性,則可以省略#命名空間,直接訪問該對象的屬性即可。

    • 在Struts2中,根對象ValueStack的實現類為OgnlValueStack,該對象不是我們想象的只存放單個值,而是存放一組對象。在OgnlValueStack類里有一個List類型的root變量,就是使用它存放一組對象。

    • Context—–OnglValueStack root變量[action,OgnlUtil,…]

    • 在root變量中處于第一位的對象叫棧頂對象。通常我們在OGNL表達式里直接寫上屬性的名稱即可訪問root變量里對象的屬性,搜索順序是從棧頂對象開始尋找,如果棧頂對象不存在該屬性,就會從第二個對象尋找,如果沒有找到就從第三個對象尋找,依次往下訪問,直到找到為止。

    注意:Struts2中,OGNL表達式需要配合Struts標簽才可以使用。如:

    <s:property value=“name”/>
    • 由于ValueStack(值棧)是Struts2中OGNL的根對象,如果用戶需要訪問值棧中的對象,在JSP頁面可以直接通過下面的EL表達式訪問ValueStack(值棧)中對象的屬性:
      ${foo}//獲得值棧中某個對象的foo屬性。

    • 如果訪問其他Context中的對象,由于他們不是根對象,所以在訪問時,需要添加#前綴

    • application對象:用于訪問ServletContext,例如#application.userName或者#application[‘userName’],相當于調用ServletContext的getAttribute(“username”)。

    • session對象:用來訪問HttpSession,例如#session.userName或者#session[‘userName’],相當于調用session.getAttribute(“userName”)。

    • request對象:用來訪問HttpServletRequest屬性(attribute)的Map,例如#request.userName或者#request[‘userName’],相當于調用request.getAttribute(“userName”)。

    • parameters對象:用與訪問HTTP的請求參數,例如#parameters.userName或者#parameters[‘userName’],相當于調用request.getParameter(“username”)。

    • attr對象:用于按page->request->session->application順序訪問其屬性。

    采用OGNL表達式創建List/Map集合對象

    如果需要一個集合元素的時候(例如List對象或者Map對象),可以使用OGNL中同集合相關的表達式。使用如下代碼直接生成一個List對象:

    <s:set name=“list” value=“{‘a’,’b’,’c’}”/> <s:iterator value=“#list”> <s:property/><br/> </s:iterator>

    Set標簽用于將某個值放入指定范圍。
    scope:指定變量被放置的范圍,該屬性可以接受application、session、request、page或action。如果沒有設置該屬性,則默認放置在OGNL Context中。
    value:賦給變量的值。如果沒有設置該屬性,則將ValueStack棧頂的值賦給變量。

    生成一個Map對象:

    <s:set name=“foobar” value=“#{‘foo1’:’bar1’,’foo2’:’bar2’}”/> <s:iterator value=“#foobar”> <s:property value=“key”/>=<s:property value=“value”/><br/> </s:iterator>

    采用OGNL表達式判斷對象是否存在于集合中

    對于集合類型,OGNL表達式可以使用in和not in兩個元素符號。其中,in表達式用來判斷某個元素是否在指定的集合對象中;not in判斷某個元素是否不在指定的集合對象中,如下所示:
    in表達式:

    <s:if test=“’foo’ in {‘foo’,’bar’}” 在 </s:if> <s:else> 不在 </s:else>

    not in 表達式:

    <s:if test=“’foo’ in {‘foo’,’bar’}” 不在 </s:if> <s:else> 在 </s:else>

    OGNL表達式的投影功能

    出了in和not in之外,OGNL還允許使用某個規則獲得集合對象的子集,常用的有以下3個相關操作符。

    ?:獲得所有符合邏輯的元素
    ^:獲得符合邏輯的第一個元素
    $:獲得符合邏輯的最后一個元素
    例如代碼:

    <s:iterator value=“books.{?#this.price>35}”> <s:property value=“title”/>-$<s:property value=“price”/><br/> </s:iterator>

    在上面代碼中,直接在集合后緊跟.{}運算符表明用于取出該集合的子集,{}內的表達式用于獲取符合條件的元素,this指的是為了從大集合books篩選數據到小集合,需要對大集合books進行迭代,this代表當前迭代的元素。本例的表達式用于獲取集合中價格大于35的書集合。

    public class BookAction extends ActionSupport{ private List<Book> books; public String execute(){ books = new ArrayList<Book>(); books.add(new Book(“a”,”spring”,67)); books.add(new Book(“b”,”ejb”,15)); } }

    常用標簽

    Property標簽

    Property標簽用于輸出指定值: <s:set name=“name” value=“kk”/> <s:property value=“#name”/> default:可選屬性,如果需要輸出的屬性值為null,則顯示該屬性指定的值 escape:可選屬性,指定是否格式化HTML代碼 value:可選屬性,指定需要輸出的屬性值,如果沒有指定該屬性,則默認輸出ValueStack棧頂的值。 id:可選屬性,指定該元素的標識。(過時)

    if/elseif/else標簽

    <s:set name=“age” value=“21”/> <s:if test=“#age==23”> 23 </s:if> <s:elseif test=“#age==21”> 21 </s:if> <s:else> 都不等 </s:else>

    Iterator標簽

    Iterate標簽用于對集合進行迭代,這里的集合包含List、Set和數組。 <s:set name=“list” value=“{‘a’,’b’,’c’}”/> <s:iterator value=“#list” status=“st”> <font color=<s:if test=“#st.odd”>red</s:if><s:else>blue</s:else>> <s:property/></font><br/> </s:iterator> Value:可選屬性,指定被迭代的集合,如果沒有設置該屬性,則使用ValueStack棧頂的集合。 id:可選屬性,指定該元素的標識。(過時) status:可選屬性,該屬性指定迭代時的IterateStatus實例。該實例包含如下幾個方法: int getCount(),返回當前迭代了幾個元素。 int getIndex(),返回當前迭代元素的索引。 boolean isEven(),返回當前被迭代元素的索引是否是偶數。 boolean isOdd(),返回當前被迭代元素的索引是否是奇數。 boolean isFirst(),返回當前被迭代元素是否是第一個元素 boolean isLast(),返回當前被迭代元素是否是最后一個元素

    一個實例

    <s:set var="records" value="{'辟邪劍法','玉女心經','葵花寶典','金瓶梅','攝影藝術指導','道德與法制'}"></s:set><table border="1"><tr><th>序號</th><th>書名</th></tr><s:iterator value="#records" status="vs"><tr bgcolor="<s:property value='#vs.even?"red":"green"'/>"><td><s:property value="#vs.count"/></td><td><s:property/></td></tr></s:iterator></table>

    URL標簽

    實例

    <s:url action="a12" var="url"><!-- 還對URL進行了重寫 --><s:param name="username" value="'admin'"></s:param><!-- value的取值當做表達式了 --><s:param name="age" value="'38'"></s:param></s:url><a href="<s:property value="#url"/>">猛點</a><hr/><s:set value="'addCustomer'" var="addr"></s:set><!-- 存放的動作名稱 --><s:url value="%{#addr}"></s:url><!-- url標簽的value中的取值,默認是當做字符串的。 如果想把當做表達式來做,請使用%{}-->

    checkboxlist

    實例

    <s:checkboxlist name="hobby" list="{'吃飯','睡覺','學習'}" value="{'學習','吃飯'}"></s:checkboxlist><br/><s:checkboxlist list="hobby1" name="hh" value="hobby2"></s:checkboxlist><br/><s:checkboxlist list="#{'北京':'0','上海':'1','山東':'2'}" name="province" listKey="value" listValue="key" value="{'2'}"></s:checkboxlist>

    radio

    select

    實例

    <s:radio list="#{'0':'','1':''}" listKey="key" listValue="value"></s:radio><hr/><s:select list="#{'021':'上海','010':'北京','0531':'濟南'}" listKey="key" listValue="value" value="'010'"></s:select>

    防止表單重復提交

    防止表單的重復提交
    1、在表單中加入標簽
    2、在動作類中加入token的攔截器

    <interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="token"></interceptor-ref>

    3、增加一個名稱為invalid.token的結果視圖

    <result name="invalid.token">/success.jsp</result>

    實例如下

    <package name="p1" namespace="/customer" extends="struts-default"><action name="addCustomer" class="cn.itcast.action.CustomerAction" method="add"><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="token"></interceptor-ref><result name="invalid.token">/success.jsp</result><result name="success">/success.jsp</result></action></package>

    使用第三方插件,以jfreechart為例

    • 導入jar包

    • jfreechart.jar
    • jcommon.jar
    • struts2-jfreechart-plugin.jar
    • Action類的書寫

    package cn.itcast.action;import java.io.Serializable;import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.StandardXYItemRenderer; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection;import com.opensymphony.xwork2.ActionSupport;public class GetChartAction extends ActionSupport implements Serializable {private JFreeChart chart;public JFreeChart getChart() {return chart;}public String execute(){ValueAxis xAxis = new NumberAxis("年度");ValueAxis yAxis = new NumberAxis("產值");XYSeries xySeries = new XYSeries("綠豆");xySeries.add(0,300);xySeries.add(1,200);xySeries.add(2,400);xySeries.add(3,500);xySeries.add(4,600);xySeries.add(5,500);xySeries.add(6,800);xySeries.add(7,1000);xySeries.add(8,1100);XYSeriesCollection xyDataset = new XYSeriesCollection(xySeries);XYPlot xyPlot = new XYPlot(xyDataset,xAxis,yAxis,new StandardXYItemRenderer(StandardXYItemRenderer.SHAPES_AND_LINES));chart = new JFreeChart(xyPlot);return SUCCESS;} }
    • 配置文件
    <package name="p2" extends="jfreechart-default"><action name="chart" class="cn.itcast.action.GetChartAction"><result type="chart" name="success"><param name="height">400</param><param name="width">600</param></result></action></package>
    • 訪問頁面
    <body><s:url action="chart" var="url"></s:url><img alt="hello" src='<s:property value="url"/>'></body>

    效果如下

    tomcat啟動時struts2容器做的事

    完成

    總結

    以上是生活随笔為你收集整理的Struts2基础知识(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。