随笔-34  评论-1965  文章-0  trackbacks-0

在上一篇文章《为Struts 2.0做好准备》中,我过于详细地介绍了Struts 2.0开发环境和运行环境的配置,所以,本文很少涉及的以上两方面的细节。如果,您看完《为Struts 2.0做好准备》后,还有什么不明白,或者没法运行文中例子,请联系我。我的E-MAIL:Max.M.Yuan@gmail.com。

在介绍常用标志前,我想先从总体上,对Struts 1.x与Struts 2.0的标志库(Tag Library)作比较。

  Struts 1.x Struts 2.0
分类 将标志库按功能分成HTML、Tiles、Logic和Bean等几部分 严格上来说,没有分类,所有标志都在URI为“/struts-tags”命名空间下,不过,我们可以从功能上将其分为两大类:非UI标志和UI标志
表达式语言(expression languages) 不支持嵌入语言(EL) OGNL、JSTL、Groovy和Velcity
以上表格,纯属个人总结,如有所不足或错误,请不吝指正

好了,我要开始介绍“常用”(这里所谓的“常用”,是指在已往工作中使用Struts里经常用到的)的标志了。

要在JSP中使用Struts 2.0标志,先要指明标志的引入。通过在JSP的代码的顶部加入以下代码可以做到这点。
<%@taglib prefix="s" uri="/struts-tags" %>
  1. 非UI标志
    • if、elseif和else

      描述:
      执行基本的条件流转。

      参数:

      名称必需默认类型描述备注
      testBoolean决定标志里内容是否显示的表达式else标志没有这个参数
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:

      <%@ page contentType="text/html; charset=UTF-8" %>
      <%@ taglib prefix="s" uri="/struts-tags" %>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
          
      <head>
              
      <title>Condition Flow</title>
          
      </head>
          
      <body>
              
      <h3>Condition Flow</h3>            
              
      <!--
                  这里有点小技巧:
                  本来可以用#parameters.name[0]来获得,请求中name的值。但是,在我实现include例子时,
                  无论我用param标志给name赋任何值,#parameters里面不会含有任何值,所以#parameters.name也为空值。
                  
                  其原因为:
                  当使用include标志时,被包含的页面(included)里#parameters拿到的是包含页面里的请求参数。
                  
                  因此,这里必须手工调用request.getParameter("name")。
              
      -->
              
      <s:set name="name" value="<%= "'" + request.getParameter("name") + "'" %>" />
              
      <s:if test="#name == 'Max'">
                  Max's file here
              
      </s:if>
              
      <s:elseif test="#name == 'Scott'">
                  Scott's file here
              
      </s:elseif>
              
      <s:else>
                  Other's file here
              
      </s:else>        
          
      </body>
      </html>
      例1 condition.jsp

    • iterator

      描述:
      用于遍历集合(java.util.Collection)或枚举值(java.util.Iterator)。

      参数:

      名称必需默认类型描述
      statusString如果设置此参数,一个IteratorStatus的实例将会压入每个遍历的堆栈
      valueObject/String要遍历的可枚举的(iteratable)数据源,或者将放入新列表(List)的对象
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:

      <%@ page contentType="text/html; charset=UTF-8" %>
      <%@ page import="java.util.List" %>
      <%@ page import="java.util.ArrayList" %>
      <%@ taglib prefix="s" uri="/struts-tags" %>

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <%
          List list 
      = new ArrayList();
          list.add(
      "Max");
          list.add(
      "Scott");
          list.add(
      "Jeffry");
          list.add(
      "Joe");
          list.add(
      "Kelvin");
          request.setAttribute(
      "names", list);
      %>
      <html>
          
      <head>
              
      <title>Iterator</title>
          
      </head>
          
      <body>
              
      <h3>Names: </h3>
              
      <!-- 
                  1、此处的空property元素用于获得当前iterator的值 
                  2、status被设成stuts,在iterator的里面就可以通过#stuts取得IteratorStatus的对象。IteratorStatus类包含当前序号信息,如是否第一个或最后一个,是否为奇数序号。这些信息在我们做格式化的时候,显得非常有用。
              
      -->
              
      <ol>
                  
      <s:iterator value="#request.names" status="stuts">                
                      
      <s:if test="#stuts.odd == true">
                          
      <li>White <s:property /></li>
                      
      </s:if>
                      
      <s:else>
                          
      <li style="background-color:gray"><s:property /></li>
                      
      </s:else>
                  
      </s:iterator>
              
      </ol>
          
      </body>
      </html>
      例2 iterator.jsp

    • i18n

      描述:
      加载资源包到值堆栈。它可以允许text标志访问任何资源包的信息,而不只当前action相关联的资源包。

      参数:

      名称必需默认类型描述
      valueObject/String资源包的类路径(如com.xxxx.resources.AppMsg)
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:

      HelloWorld=Hello Wrold!
      例3 classes\ ApplicationMessages.properties

      <%@ page contentType="text/html; charset=UTF-8" %>
      <%@ taglib prefix="s" uri="/struts-tags" %>

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
          
      <head>
              
      <title>Internationization</title>
          
      </head>
          
      <body>
              
      <h3>
                  
      <s:i18n name="ApplicationMessages">
                      
      <s:text name="HelloWorld" />
                  
      </s:i18n>
              
      </h3>
          
      </body>
      </html>
      例3 i18n.jsp

    • include

      描述:
      包含一个servlet的输出(servlet或jsp的页面)。

      参数:

      名称必需默认类型描述
      valueString要包含的jsp或servlet
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:

      <%@ page contentType="text/html; charset=UTF-8" %>
      <%@ taglib prefix="s" uri="/struts-tags" %>

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
          
      <head>
              
      <title>Iterator</title>
          
      </head>
          
      <body>
              
      <h3>Interator Page</h3>
              
      <s:include value="/condition.jsp">
                  
      <s:param name="name">Max</s:param>
              
      </s:include>
              
      <h3>i18n</h3>
              
      <s:include value="/i18n.jsp" />
          
      </body>
      </html>
      例4 include.jsp

    • param

      描述:
      为其他标签提供参数,比如include标签和bean标签. 参数的name属性是可选的,如果提供,会调用Component的方法addParameter(String, Object), 如果不提供,则外层嵌套标签必须实现UnnamedParametric接口(如TextTag)。

      value的提供有两种方式,通过value属性或者标签中间的text,不同之处我们看一下例子:

      <param name="color">blue</param><!-- (A) -->

      <param name="color" value="blue"/><!-- (B) -->
      (A)参数值会以String的格式放入statck.
      (B)该值会以java.lang.Object的格式放入statck.

      参数:

      名称必需默认类型描述
      nameString参数名
      valueStringvalue表达式
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:
      请参考例4。

    • set

      描述:
      set标签赋予变量一个特定范围内的值。当希望给一个变量赋一个复杂的表达式,每次访问该变量而不是复杂的表达式时用到。其在两种情况下非常有用: 复杂的表达式很耗时 (性能提升) 或者很难理解 (代码可读性提高)。

      参数:

      名称必需默认类型描述
      nameString变量名字
      scopeString变量作用域,可以为application, session, request, page, 或action.
      valueObject/String将会赋给变量的值
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:
      请参考例1。

    • text

      描述:
      支持国际化信息的标签。国际化信息必须放在一个和当前action同名的resource bundle中,如果没有找到相应message,tag body将被当作默认message,如果没有tag body,message的name会被作为默认message。

      参数:

      名称必需默认类型描述
      nameString资源属性的名字
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:
      请参考例3。

    • url

      描述:
      该标签用于创建url,可以通过"param"标签提供request参数。

      当includeParams的值时'all'或者'get', param标签中定义的参数将有优先权,也就是说其会覆盖其他同名参数的值。

      参数: 略

      例子:

      <%@ page contentType="text/html; charset=UTF-8" %>
      <%@ taglib prefix="s" uri="/struts-tags" %>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
          
      <head>
              
      <title>URL</title>
          
      </head>
          
      <body>
              
      <h3>URL</h3>            
              
      <href='<s:url value="/i18n.jsp" />'>i18n</a><br />
              
      <s:url id="url" value="/condition.jsp">
                  
      <s:param name="name">Max</s:param>
              
      </s:url>        
              
      <s:a href="%{url}">if\elseif\else</s:a>
          
      </body>
      </html>
      例5 url.jsp

    • property

      描述:
      得到'value'的属性,如果value没提供,默认为堆栈顶端的元素。

      参数:

      名称必需默认类型描述
      defaultString如果属性是null则显示的default值
      escapetrueBooelean是否escape HTML
      value栈顶Object要显示的值
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:
      请参考例2。

  2. UI标志

    UI标志又可以分为表单UI和非表单UI两部分。表单UI部分基本与Struts 1.x相同,都是对HTML表单元素的包装。不过,Struts 2.0加了几个我们经常在项目中用到的控件如:datepicker、doubleselect、timepicker、optiontransferselect等。因为这些标志很多都经常用到,而且参数也很多,要在一篇文章详细说明并非易事。

    需要深入了解这些标志的朋友,可以到以下查看以下网址:
    http://wiki.javascud.org/display/ww2cndoc/Tags WebWork2文档中文化计划(中文)
    http://cwiki.apache.org/WW/tag-reference.html Tag Developers Guide(英文)
    本文有相当的内容也来自这两处。

    在此,我虽然不能够详细讲述这些标志,但是可以与大家分享一个来Struts 2.0 Show Case一个例子。

    /*
     * $Id: UITagExample.java 420385 2006-07-10 00:57:05Z mrdon $
     *
     * Copyright 2006 The Apache Software Foundation.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      
    http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     
    */

    package org.apache.struts2.showcase;

    import org.apache.struts2.ServletActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.Validateable;
    import com.opensymphony.xwork2.util.OgnlValueStack;

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.io.File;

    /**
     
    */

    public class UITagExample extends ActionSupport implements Validateable {
        
        
    private static final long serialVersionUID = -94044809860988047L;        
        String name;
        Date birthday;
        String bio;
        String favoriteColor;
        List friends;
        
    boolean legalAge;
        String state;
        String region;
        File picture;
        String pictureContentType;
        String pictureFileName;
        String favouriteLanguage;
        String favouriteVehicalType 
    = "MotorcycleKey";
        String favouriteVehicalSpecific 
    = "YamahaKey";
        
        List leftSideCartoonCharacters;
        List rightSideCartoonCharacters;
        
        List favouriteLanguages 
    = new ArrayList();
        List vehicalTypeList 
    = new ArrayList();
        Map vehicalSpecificMap 
    = new HashMap();
        
        String thoughts;
        
        
    public UITagExample() {
            favouriteLanguages.add(
    new Language("EnglishKey""English Language"));
            favouriteLanguages.add(
    new Language("FrenchKey""French Language"));
            favouriteLanguages.add(
    new Language("SpanishKey""Spanish Language"));
            
            VehicalType car 
    = new VehicalType("CarKey""Car");
            VehicalType motorcycle 
    = new VehicalType("MotorcycleKey""Motorcycle");
            vehicalTypeList.add(car);
            vehicalTypeList.add(motorcycle);
            
            List cars 
    = new ArrayList();
            cars.add(
    new VehicalSpecific("MercedesKey""Mercedes"));
            cars.add(
    new VehicalSpecific("HondaKey""Honda"));
            cars.add(
    new VehicalSpecific("FordKey""Ford"));
            
            List motorcycles 
    = new ArrayList();
            motorcycles.add(
    new VehicalSpecific("SuzukiKey""Suzuki"));
            motorcycles.add(
    new VehicalSpecific("YamahaKey""Yamaha"));
            
            vehicalSpecificMap.put(car, cars);
            vehicalSpecificMap.put(motorcycle, motorcycles);
        }
       
            
        
    public List getLeftSideCartoonCharacters() {
            
    return leftSideCartoonCharacters;
        }

        
    public void setLeftSideCartoonCharacters(List leftSideCartoonCharacters) {
            
    this.leftSideCartoonCharacters = leftSideCartoonCharacters;
        }

            
        
    public List getRightSideCartoonCharacters() {
            
    return rightSideCartoonCharacters;
        }

        
    public void setRightSideCartoonCharacters(List rightSideCartoonCharacters) {
            
    this.rightSideCartoonCharacters = rightSideCartoonCharacters;
        }

            
        
    public String getFavouriteVehicalType() {
            
    return favouriteVehicalType;
        }

        
        
    public void setFavouriteVehicalType(String favouriteVehicalType) {
            
    this.favouriteVehicalType = favouriteVehicalType;
        }

        
        
    public String getFavouriteVehicalSpecific() {
            
    return favouriteVehicalSpecific;
        }

        
        
    public void setFavouriteVehicalSpecific(String favouriteVehicalSpecific) {
            
    this.favouriteVehicalSpecific = favouriteVehicalSpecific;
        }

        
        
    public List getVehicalTypeList() {
            
    return vehicalTypeList;
        }

        
        
    public List getVehicalSpecificList() {
            OgnlValueStack stack 
    = ServletActionContext.getValueStack(ServletActionContext.getRequest());
            Object vehicalType 
    = stack.findValue("top");
            
    if (vehicalType != null && vehicalType instanceof VehicalType) {
                List l 
    = (List) vehicalSpecificMap.get(vehicalType);
                
    return l;
            }

            
    return Collections.EMPTY_LIST;
        }

        
        
    public List getFavouriteLanguages() {
            
    return favouriteLanguages;
        }


        
    public String execute() throws Exception {
            
    return SUCCESS;
        }


        
    /* Getters and Setters */
               
        
    public String doSubmit() {
            
    return SUCCESS;
        }
           
        
        
    // === inner class 
        public static class Language {
            String description;
            String key;
            
            
    public Language(String key, String description) {
                
    this.key = key;
                
    this.description = description;
            }

            
            
    public String getKey() 
                
    return key; 
            }

            
    public String getDescription() 
                
    return description; 
            }

            
        }
        
        
        
    public static class VehicalType {
            String key;
            String description;
            
    public VehicalType(String key, String description) {
                
    this.key = key;
                
    this.description = description;
            }

            
            
    public String getKey() return this.key; }
            
    public String getDescription() return this.description; }
            
            
    public boolean equals(Object obj) {
                
    if (! (obj instanceof VehicalType)) 
                    
    return false;
                }

                
    else {
                    
    return key.equals(((VehicalType)obj).getKey());
                }

            }

            
            
    public int hashCode() {
                
    return key.hashCode();
            }

        }
        
        
        
    public static class VehicalSpecific {
            String key; 
            String description;
            
    public VehicalSpecific(String key, String description) {
                
    this.key = key;
                
    this.description = description;
            }

            
            
    public String getKey() return this.key; }
            
    public String getDescription() return this.description; }
            
            
    public boolean equals(Object obj) {
                
    if (! (obj instanceof VehicalSpecific)) {
                    
    return false;
                }

                
    else {
                    
    return key.equals(((VehicalSpecific)obj).getKey());
                }

            }

            
            
    public int hashCode() {
                
    return key.hashCode();
            }

        }

    }
    例6 org.apache.struts2.showcase.UITagExample.java

    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
    <head>
        
    <title>UI Tags Example</title>
        
    <s:head/>
    </head>
    <body>

    <s:actionerror/>
    <s:actionmessage/>
    <s:fielderror />

    <s:form action="exampleSubmit" method="post" enctype="multipart/form-data" tooltipConfig="#{'jsTooltipEnabled':'true'}">
        
    <s:textfield 
                
    label="Name" 
                name
    ="name"
                tooltip
    ="Enter your Name here" />

        
    <s:datepicker
                
    tooltip="Select Your Birthday"
                label
    ="Birthday"
                name
    ="birthday" />

        
    <s:textarea
                
    tooltip="Enter your Biography"
                label
    ="Biograph"
                name
    ="bio"
                cols
    ="20"
                rows
    ="3"/>

        
    <s:select
                
    tooltip="Choose Your Favourite Color"
                label
    ="Favorite Color"
                list
    ="{'Red', 'Blue', 'Green'}"
                name
    ="favoriteColor"
                emptyOption
    ="true"
                headerKey
    ="None"
                headerValue
    ="None"/>

        
    <s:select
                
    tooltip="Choose Your Favourite Language"
                label
    ="Favourite Language"
                list
    ="favouriteLanguages"
                name
    ="favouriteLanguage"
                listKey
    ="key"
                listValue
    ="description"
                emptyOption
    ="true"
                headerKey
    ="None"
                headerValue
    ="None"/>

        
    <s:checkboxlist
                
    tooltip="Choose your Friends"
                label
    ="Friends"
                list
    ="{'Patrick', 'Jason', 'Jay', 'Toby', 'Rene'}"
                name
    ="friends"/>

        
    <s:checkbox
                
    tooltip="Confirmed that your are Over 18"
                label
    ="Age 18+"
                name
    ="legalAge"/>

        
    <s:doubleselect
                
    tooltip="Choose Your State"
                label
    ="State"
                name
    ="region" list="{'North', 'South'}"
                value
    ="'South'"
                doubleValue
    ="'Florida'"
                doubleList
    ="top == 'North' ? {'Oregon', 'Washington'} : {'Texas', 'Florida'}" 
                doubleName
    ="state"
                headerKey
    ="-1"
                headerValue
    ="---------- Please Select ----------"
                emptyOption
    ="true" />

        
    <s:doubleselect
                
    tooltip="Choose your Vehical"
                label
    ="Favourite Vehical"
                name
    ="favouriteVehicalType"
                list
    ="vehicalTypeList"
                listKey
    ="key"
                listValue
    ="description"
                value
    ="'MotorcycleKey'"
                doubleValue
    ="'YamahaKey'"
                doubleList
    ="vehicalSpecificList"
                doubleListKey
    ="key"
                doubleListValue
    ="description"
                doubleName
    ="favouriteVehicalSpecific" headerKey="-1"
                headerValue
    ="---------- Please Select ----------"
                emptyOption
    ="true" />

        
    <s:file
                
    tooltip="Upload Your Picture"
                label
    ="Picture" 
                name
    ="picture" />
                
        
    <s:optiontransferselect
                
    tooltip="Select Your Favourite Cartoon Characters"
                label
    ="Favourite Cartoons Characters"
                name
    ="leftSideCartoonCharacters" 
                leftTitle
    ="Left Title"
                rightTitle
    ="Right Title"
                list
    ="{'Popeye', 'He-Man', 'Spiderman'}" 
                multiple
    ="true"
                headerKey
    ="headerKey"
                headerValue
    ="--- Please Select ---"
                emptyOption
    ="true"
                doubleList
    ="{'Superman', 'Mickey Mouse', 'Donald Duck'}" 
                doubleName
    ="rightSideCartoonCharacters"
                doubleHeaderKey
    ="doubleHeaderKey"
                doubleHeaderValue
    ="--- Please Select ---" 
                doubleEmptyOption
    ="true"
                doubleMultiple
    ="true" />
        
        
    <s:textarea
                
    label="Your Thougths"
                name
    ="thoughts" 
                tooltip
    ="Enter your thoughts here" />
                
        
    <s:submit onclick="alert('aaaa');" />
        
    <s:reset onclick="alert('bbbb');" />
    </s:form>
        
    </body>
    </html>
    例6 example.jsp

    <action name="example" class="org.apache.struts2.showcase.UITagExample">
        
    <result>example.jsp</result>
        
    <result name="input">example.jsp</result>
    </action>
    例6 struts.xml代码片段

posted on 2006-10-18 12:02 Max 阅读(85800) 评论(160)  编辑  收藏 所属分类: Struts 2.0系列
评论共2页: 上一页 1 2 

评论:
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-10-18 12:18 | 山风小子
写的很详细,辛苦了!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-10-19 10:34 | 有猫相伴的日子
不错,支持!!!!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-10-19 11:57 | teddy
struts 1.x 也是可以支持表达式语言的。需要引用struts-el包。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-10-19 14:00 | Max
@teddy
谢谢,您的纠正。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-10-21 11:37 | dennis
非常详细,辛苦,多谢  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-10-29 12:30 | 张先生
谢谢啦!愿您以后继续多写Struts2的文章!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-11-04 09:44 | java爱好者[匿名]
看了您的帖子受益非浅,我代表像我这样的初学者,向您表示感谢!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-12-01 11:21 | lxf
如果要让两个struts表单元素显示在同一行上面,该如果做呢?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-12-01 16:36 | Max
你可以在<s:form>加上theme="simple"属性,然后自已布局form的输出。如:
<s:form action="Login" method="POST" theme="simple">
<table>
<tr>
<td>
User name: <s:textfield name="name" label="User name"/>
</td>
<td>
Password: <s:password name="password" label="Password"/>
</td>
</tr>
</table>
</s:form>   回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-12-07 10:08 | Vivi[匿名]
@teddy
对于在Struts中使用EL要容器支持才行,在容器不支持的情况下才需要struts-el
  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2006-12-15 17:25 | sys53
<s:a 好不不支持在目标窗口打开
就像html <a href="" target="aaa">aaa</a>  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-02-14 16:40 | 阿甘
不错不错,支持支持  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-03-05 11:00 | kawaii
请教一下,<s:radio/>标签中,如何使一个值被默认选中?
这是我的程序片断:
<s:set name="male" value="%{getText('app.label.sex.male')}"/>
<s:set name="female" value="%{getText('app.label.sex.female')}"/>
<s:radio name="user.usex"
list="#{'male':#male,'female':#female}"
label="%{getText('app.label.sex')}" />
我现在想让male被默认选中,该怎么做了?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-03-07 15:39 | Max
@kawaii
使用value属性,如value='male'  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-03-13 10:59 | na
谢谢,谢谢  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-03-15 10:59 | hunter
哎﹗現在關于Struts2.0學習方面的資料很少﹗﹗支持﹗﹗
  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-03-16 09:41 | customer
你好,我在看example.jsp出现了错误信息:
FreeMarker template error!

Expression parameters.formName is undefined on line 76, column 43 in template/simple/doubleselect.ftl.
The problematic instruction:
----------
==> ${parameters.formName} [on line 76, column 41 in template/simple/doubleselect.ftl]
in include "/${parameters.templateDir}/simple/doubleselect.ftl" [on line 3, column 1 in template/xhtml/doubleselect.ftl]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression parameters.formName is undefined on line 76, column 43 in template/simple/doubleselect.ftl.
at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
at freemarker.core.Expression.getStringValue(Expression.java:118)
at freemarker.core.Expression.getStringValue(Expression.java:93)
at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.MixedContent.accept  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-03-19 11:50 | Max
@customer
我在文章里的最后一个例子是用Struts 2的Showcase的代码。你应该通过example!input.action进行访问。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-03-28 14:03 | bhj
感谢!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-08 10:44 | 杰克
刚刚在ASF上看了一个tutorial,就发现你的系列文章了。支持。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-04-19 13:07 | Tony
小弟最近在学习struts2.0 可是遇到一个奇怪的问题
我在jsp中直接使用struts2的标签 在地址栏直接敲*.jsp就会报错 但是通过调用action就可以正常显示
不知道是什么原因 我原来在用struts 1.x的时候没有出现过这个问题
报错如下:
org.apache.jasper.JasperException: Exception in JSP: /index.jsp:15

15: <s:form action="hello" method="post">
16: <s:textfield name="aaa" />
17: <s:submit/>
18: </s:form>

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.NullPointerException
org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:58)
org.apache.struts2.views.jsp.StrutsBodyTagSupport.getStack(StrutsBodyTagSupport.java:54)
org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:49)
org.apache.jsp.index_jsp._jspx_meth_s_form_0(index_jsp.java:100)
org.apache.jsp.index_jsp._jspService(index_jsp.java:73)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-19 17:11 | silence
<s:set name="name" value="<%= "'" + request.getParameter("name") + "'" %>" />可不可以让value等于某个属性,而不是写java代码从request里面拿,比如后台有个属性userName,在jap上这么写<s:set name="name" value="userName" />  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-19 23:27 | Max
@Tony
你应该没在web.xml有配置struts 2的filter,试下将以下列代码加到web.xml的<web-app></web-app>元素之间:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-19 23:29 | Max
@silence
可以  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-04-20 09:14 | Tony
@Max
可是我的web.xml是和struts2-blank-2.0.6中的是一样的,并且也配置了org.apache.struts2.dispatcher.FilterDispatcher ,可是问题还是存在  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-20 15:56 | doboy
请问:
1、如果要生成一个下拉框,如showcase里面的
<s:select
tooltip="Choose Your Favourite Language"
label="Favourite Language"
list="favouriteLanguages"
name="favouriteLanguage"
listKey="key"
listValue="description"
emptyOption="true"
headerKey="None"
headerValue="None"/>

这个list=favouriteLanguages是不是必须从action中get到,因为我试过从session或者pagecontext中获取到favouriteLanguages,然后写select标签时,报错,说The requested list key could not be resolved as a collection/array/map/enumeration/iterator type.......

2、如果同理生成一个checkboxlist,如何让它默认选中其中的几项,比如:
<s:checkboxlist
tooltip="Choose your Friends"
label="Friends"
list="{'Patrick', 'Jason', 'Jay', 'Toby', 'Rene'}"
name="friends"/>
然后有一个list为friends,其值为'Jason'和'Jay'。如何让Jason和jay默认被选中?

谢谢先!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-20 23:33 | Max
@doboy
1、不是,你也可以session或者pagecontext获取<s:select />的list,你的问题应该是你从session或者pagecontext取得的对象不是一个列表;

2、只需将friends的值设为"Jason"和"Jay"即可。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-04-22 07:17 | free
Struts1.x中可以使用<html:errors property="att"/>输出对特定字段的消息,在Struts2中使用<s:fielderror/>应该如何操作?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-23 11:16 | xulao
Syntax error in EL example.jsp

<s:form action="exampleSubmit" method="post" enctype="multipart/form-data" tooltipConfig="#{'jsTooltipEnabled':'true'}">

在:'true',有红线,语法错!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-23 11:17 | pengzhan
如何让select中显示的和option中的vlaue不一样,它原有的s:select中出来的原码是这样的select name="employee.station.name" id="save_employee_station_name">
<option value="Shanghai">Shanghai</option>
<option value="Nanjing">Nanjing</option>
</select>
如何让它成为这样:
select name="employee.station.name" id="save_employee_station_name">
<option value="1">Shanghai</option>
<option value="2">Nanjing</option>
</select>  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-23 14:56 | mm
<s:datepicker />如何使用,使用之前是不是需要jar文件放到lib目录下?我在程序里引用怎么出错呢?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-23 15:18 | mm
能不能介绍一下struts2的bean标签的使用?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-24 10:22 | doboy
@Max
1、我看了一下struts2的源码,它在解析ListUIBean的时候,会判断if (list instanceof Collection) ,如果不是的话,就会报"The requested list key '" + list + "' could not be resolved as a collection/array/map/enumeration/iterator type. "的错误。因为放在session或pageContext都是以Object存放的。所以判断list并不是collection?

2、对于checkboxlist的默认选项,我测试过,如果list里面的内容是字符串的话,则传入一个name="friends",其中friends包含对应的字符串list,即可显示默认选中。
但如果list里面的内容是一个对象list的话,传入一个name为一个对象list,则不会默认选中。请问,我这样做法是否在哪里弄错了?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-24 11:37 | zyh
@mm
新的2.0.6中已经没有<s:datepicker />你可以使用<s:datetimepicker />  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-25 04:51 | lxu
JSP中的那些UI标签如何让其排列整齐?
  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-25 09:10 | Max
@lxu
1、在<s:form>标签,将theme属性为“simple” ,然后自己通过表格布局;
2、更佳的做法自定义一个theme,并将其设为默认应用到整个站点。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-25 09:21 | Max
@doboy
1、即使session或pageContext的对象是以Object类型放的,但是如果它原来是Collection类型的,instanceof Collection返回的值都是true的;
2、你应该针对值传入list或数组,如你的<s:checkboxlist />的listValue是String类型的,你应该在赋值时传入一个String的list或数组。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-25 09:29 | Max
@mm
你可以参考文章中的两个链接  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-25 09:31 | Max
@free
有,用name属性。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-25 09:33 | Max
@pengzhan
用listKey和listValue,《在Struts 2.0中国际化(i18n)您的应用程序》中有例子。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-25 09:35 | Max
@xulao
如果IDE的提示,无需理会。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-25 17:56 | jiajia
使用combobox 是报javascrip错
jsp是这样写的
<s:combobox name="job.needPerson" list="job.needpersonList"/>
解析后德html是
<script type="text/javascript">
function autoPopulate_job.needPerson(targetElement) {
targetElement.form.elements'job.needPerson'].value=
targetElement.options[targetElement.selectedIndex].value;
}
</script>
<input type="text" name="job.needPerson" value="" id="login_job_needPerson"/>
<br/>
<select onChange="autoPopulate_job.needPerson(this);">
<option value="0">5</option>
<option value="1">10</option>
<option value="2">15</option>
</select>
javascrip的错是说autoPopulate_job对象没有,我把html上autoPopulate_job删掉,保存后打开就没问题,但是这部分javascrip是自动生成的,请问该怎么办?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-27 14:39 | mm
struts2.0.6中,有没有可以实现跳转的标签,就像jsp中的<jsp:forward>?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-04-27 15:54 | free
@Max
使用了Struts2.0.6的实现,在JSP中书写如下的错误消息:
<s:fielderror name="%{'model.name'}"/>
<s:fielderror name="%{'model.password'}"/>
并在xxx-validator.xml中书写
<field name="model.name">
<field-validator type="requiredstring">
<message>Please enter Username</message>
</field-validator>
</field>
<field name="model.password">
<field-validator type="requiredstring">
<message>Please enter Password</message>
</field-validator>
</field>
为什么在提交空表单的时候,password字段的上方也出现了Please enter Username,而不是Please enter Password?  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-27 16:26 | lxu
在showcase例子中,直接运行example.jsp 和 通过example!input.action进行访问,它们分别是如何工作的?谢谢  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-28 10:51 | pengzhan
MAX:能不能详细讲解一下<s:action>的用法,并举例运用在<s:select>中,谢谢了  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-28 11:33 | furong
我有一个很菜的问题需要解决,希望Max帮帮忙
我的一个temp.jsp文件内容是
body>
<s:form action="temp">
<s:select label="继承"
list="{'yes','no'}"
name="isDerive"
emptyOption="true"
headerKey="None"
headerValue="None"
/>
<s:submit />
</s:form>

然后对应的action配置如下:
<action name="temp" class="Temp.temp">
<result>out.jsp</result>
</action>
对应的out.jsp文件是用来输出那个select所选中的值(是或者否)

现在的问题是我不知道怎么在Temp.temp.java文件中获取select选中的值,然后在out.jsp中输出

我不知道我有没有说清楚,反正就是不知道怎样在action类中获取select 的值.请帮帮忙!!
非常感谢!!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-28 16:48 | lxu
java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]
调试 showcase 出现上述错误,请MAX看看是什么原因,谢谢!  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-04-28 17:30 | soa
struts2真的很不错

我想问问,LZ你这些资料是怎么总结出来的!!!
都参考了些什么资料。虽然我可以成功执行,但是我只是知道其然,而不知道所以然,这样到时我就无法变通。
所以我很想知道其中的原理,怎么才能根据实际情况才做自己需要的东西?
比如说,LZ在这个例子中,为什么需要配置属性呢?
什么时候才要配置呢
lz刚开始是怎么知道呢? (关于这点我非常感兴趣)


  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-04-28 17:34 | soa
如果lz能介绍一下做struts开发时的一些思路或者步骤吧,那是最好不过的了  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-04-29 15:31 | tzw
Max 辛苦了!
我想知道 struts1.1的tiles模板的标签 struts2.0是怎么处理的

  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-05-14 11:29 | 安静
我用struts2.0的标签.但是那里面自带的样式.我是否可以不要.怎样做.谢谢  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-05-18 15:42 | 秋雨
Max 辛苦.  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-05-23 14:54 |
想问下
我照着例子做的
在地址栏输入http://localhost:8080/struts2Test/uiexample.action
页面显示
FreeMarker template error!

Expression parameters.formName is undefined on line 76, column 43 in template/simple/doubleselect.ftl.
The problematic instruction:
----------
==> ${parameters.formName} [on line 76, column 41 in template/simple/doubleselect.ftl]
in include "/${parameters.templateDir}/simple/doubleselect.ftl" [on line 3, column 1 in template/xhtml/doubleselect.ftl]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression parameters.formName is undefined on line 76, column 43 in template/simple/doubleselect.ftl.
at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
at freemarker.core.Expression.getStringValue(Expression.java:118)
at freemarker.core.Expression.getStringValue(Expression.java:93)
at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.Environment.include(Environment.java:1375)
at freemarker.core.Include.accept(Include.java:155)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.Environment.process(Environment.java:176)
at freemarker.template.Template.process(Template.java:232)
...................

请问这是什么原因?
谢谢  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍[未登录] 2007-05-24 10:02 |
??
  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-05-24 10:30 | Max
@吴
这是Struts 2的showcase例子,可以参考其源代码,或看一下我的http://www.blogjava.net/max/archive/2007/05/18/118442.html
  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-06-14 11:50 | apec
@jiajia

你的name属性中不应该出现点号,这在Javascript解析时出现了歧义。  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-06-16 12:05 | gz
顶楼主一个,亲下:)  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-06-19 14:31 | 任遨游
我在用doubleselect时报错
FreeMarker template error!

Expression parameters.formName is undefined on line 76, column 43 in template/simple/doubleselect.ftl.
The problematic instruction:
----------
==> ${parameters.formName} [on line 76, column 41 in template/simple/doubleselect.ftl]
in include "/${parameters.templateDir}/simple/doubleselect.ftl" [on line 3, column 1 in template/xhtml/doubleselect.ftl]
----------

Java backtrace for programmers:

  回复  更多评论
  
# re: 常用的Struts 2.0的标志(Tag)介绍 2007-06-19 14:31 | 任遨游
@任遨游
参考楼主的源码,还是报错,上网search,资料很少  回复  更多评论
  
评论共2页: 上一页 1 2 

只有注册用户登录后才能发表评论。


网站导航: