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

 Struts 2为大家提供了不少常用的很酷的表单标志,简化了我们程序员的工作。不过,由于这些都是新标志,大家可能在使用上还存在不少疑问。本文将就朋友们的回复、留言或Email上的问题,分别对这些酷标志进行讲述。

表单标志使用小技巧

Struts 2的表单标志在输出(render)HTML时,使用了模板的概念,增加了复杂性(因为它不像Struts 1.x的表单标志,它通常都是一个标志对应HTML的一个元素),因此大家在使用时,需要一些技巧:

  1. Struts 2的UI标志的表单标志默认是以表格布局,按钮是右对齐的。如果你不喜欢此风格,你可以简单地将<s:form />标志的“theme”属性设为“simple”,然后用以往的做法自已布局表单元素(注意:此法有利有弊,弊就是当你将“theme”属性设为“simple”时,表单标志以最简单方式输出HTML,所以你可能失去一些默认输出提供的便利,如:友好的错误信息的显示,或客户端的表单验证等)。当然更好的做法是通过CSS或自定义主题(theme)然后应用到整个应用程序,这样可以获得一致的页面风格,加强用户体验(我会在以后的文章对此进行讲解);
  2. 当你在页面上加入某些标志(如:<s:doubleselect />等)时,应该通过action来访问页面,而不是通过*.jsp的URL直接访问。

下面我将分别对这些标志进行讲述:

1、<s:checkboxlist />

大家对<s:checkboxlist />的最大的疑问可能是:“如何在默认情况下,选中某些checkbox?”

答案其实很简单,只需要将其“value”属性设为你的要选中的值,如以代码所示:

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   
<title>Struts 2 Cool Tags - &lt;s:checkboxlist/ &gt;</title>
   
<s:head />
</head>
<body>    
   
<h2>&lt;s:checkboxlist/&gt;</h2>
   
<s:form action="Store" >
       
<s:checkboxlist name="skills1" 
                        label
="Skills 1" 
                        list
="{ 'Java', '.Net', 'RoR', 'PHP' }" 
                        value
="{ 'Java', '.Net' }" />
       
<s:checkboxlist name="skills2" 
                        label
="Skills 2" 
                        list
="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }" 
                        listKey
="key" 
                        listValue
="value" 
                        value
="{ 1, 2, 3 }"/>
   
</s:form>
</body>
</html>
清单1 WebContent/checkboxlist.jsp

分布运行应用程序,在浏览器中键入:http://localhost:8080/Struts2_CoolTags/checkboxlist.jsp,出现如下图所示页面:

checkboxlist.jsp页面
清单2 checkboxlist.jsp页面

2、<s:doubleselect />

大家看Struts 2的showcase的例子,<s:doubleselect />的用法如下所示:

    <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" />
清单3 Showcase中<s:doubleselect />

很多朋友问:“上面的‘list’属性只有两个值,如果我有三个或更多的值,‘doublelist’属性应该如何设定呢?”

我建议的做法是先定义一个Map类型的对象,键为“list”的集合,值则为“doubleList”的集合,然后“doubleList”的OGNL写成“#myMap[top]”,如以下代码所示:

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   
<title>Struts 2 Cool Tags - &lt;s:doubeselect/ &gt;</title>
   
<s:head />
</head>
<body>    
   
<h2>&lt;s:doubleselect/&gt;</h2>
   
<s:form action="Store" >
       
<s:set name="foobar" 
               value
="#{'Java': {'Spring', 'Hibernate', 'Struts 2'}, '.Net': {'Linq', ' ASP.NET 2.0'}, 'Database': {'Oracle', 'SQL Server', 'DB2', 'MySQL'}}" />
       
<s:doubleselect list="#foobar.keySet()"
                          doubleName
="technology" 
                          doubleList
="#foobar[top]" 
                          label
="Technology" />
   
</s:form>
</body>
</html>
清单4 WebContent/doubleselect.jsp

分布运行应用程序,在浏览器中键入:http://localhost:8080/Struts2_CoolTags/doubleselect.action,出现如下图所示页面:

doubleselect.jsp页面
清单5 doubleselect.jsp页面

3、<s: token />

这个标志可能大家不常用,不过本人认为它还是挺有用的。在使用Struts 1.x时,因为跳转通常是用Forward(而不是Redirect)实现的,所以当用户完成请求后,按“F5”刷新页面时,就会重新提交上次的请求,这样经常会出错。要解决这个问题,<s:token />可以帮你忙。

实现原理

在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏输入框如:

<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
清单6 <s:token />的HTML输出

同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,如果两者相同,则将会话中的token删除并往下执行,否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个token就会不同。

具体实现

首先看一下Action的代码:

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

public class CoolTagAction extends ActionSupport {    
   
private static final long serialVersionUID = 6820659617470261780L;
   
   
private String message;
       
   
public String getMessage() {
       
return message;
   }


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

   
   @Override
   
public String execute() {
       System.out.println(
"Executing action, your message is " + message);
       
return SUCCESS;
   }
   
}
清单7 src/tutorial/CoolTagAction.java

以上代码一目了然,再看看JSP的写法:

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   
<title>Struts 2 Cool Tags - &lt;s:token/ &gt;</title>
   
<s:head />
</head>
<body>    
   
<h2>&lt;s:token/&gt;</h2>
   
<s:actionerror />
   
<s:form action="Token" >
       
<s:textfield name="message" label="Message" />
       
<s:token />
       
<s:submit />
   
</s:form>
</body>
</html>
清单8 WebContent/token.jsp

JSP也很简单,就是加入<s:token />标志。接下来是Actoin配置的XML片段:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>

<struts>
   
<package name="Struts2_COOL_TAGS_DEMO" extends="struts-default">
       
<action name="Token" class="tutorial.CoolTagAction">
           
<interceptor-ref name="defaultStack" />
           
<interceptor-ref name="token" />
           
<result name="invalid.token">/token.jsp</result>                        
           
<result>/token.jsp</result>
       
</action>
       
<action name="*">
           
<result>/{1}.jsp</result>
       
</action>
   
</package>
</struts>
清单9 src/struts.xml

以上XML片段值注意的是加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话token与请求token不一致时,将会直接返回“invalid.token”结果。

发布运行应用程序,在浏览器中键入:http://localhost:8080/Struts2_CoolTags/token.jsp,出现如下图所示页面:

正常显示的token.jsp页面
清单10 正常显示的token.jsp页面

随便填点东西并提交页面,一切正常返回以上页面,然后按“F5”刷新页面,在弹出的对话框中点击“Retry”,出现如下图所示页面:

重复提交出错显示
清单11 重复提交出错显示

4、<s:datetimepicker />、<s:optiontransferselect />和<s:updownselect />

这几个标志的使用相对简单,所以我想小举一例即可,以下是JSP的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   
<title>Struts 2 Cool Tags - Others</title>
   
<s:head />
</head>
<body>    
   
<h2>Others</h2>
   
<s:form action="Store" >
       
<s:datetimepicker name="birthday" label="Birthday" />
       
<s:updownselect
           
label = "Favourite Countries"
            list
="#{'england':'England', 'america':'America', 'germany':'Germany'}"
            name
="prioritisedFavouriteCountries"
            headerKey
="-1"
            headerValue
="--- Please Order Them Accordingly ---"
            emptyOption
="true" />
       
<s:optiontransferselect            
           
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:form>
</body>
</html>
清单12 WebContent\others.jsp页面

发布运行应用程序,在浏览器中键入:http://localhost:8080/Struts2_CoolTags/others.jsp,出现如下图所示页面:

点击查看大图
清单13 其它表单标志页面

总结

Struts 2在标志上的确比Struts 1.x丰富了许多,同时模板机制也给程序员带来不少方便(如果你不太喜欢个性化的风格)。另外,Struts 2还有一些AJAX(如<s: autocompleter />等)的标志和非表单的UI标志(如<s: tree />等),我会在以后的文章中讲述其使用。

posted on 2007-05-18 19:34 Max 阅读(36767) 评论(86)  编辑  收藏 所属分类: Struts 2.0系列

评论:
# re: Strus 2的新表单标志的使用 2007-05-19 08:26 | ec
好,支持,一会儿再尝试一下,哈哈~~  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-19 11:44 | zy
您的文章很好,很新鲜。  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-19 22:23 | Max
@ec
@zy
谢谢大家的支持:-)  回复  更多评论
  
# mailreader实例有点问题[未登录] 2007-05-20 13:11 | Jeff
Max 你在struts的造诣,我实在佩服。看到你的大作,我获益匪浅。

我下载了struts 2.0.6,部署并运行其中的范例,发现MailReader的这个实例,有个bug,不能正常显示图片。如在主页中的图片struts-power.gif,就不能正常显示。
请问:这是什么原因,应如何解决。

Max ,你如果能在百忙中,抽空帮忙解决,这个问题,就实在太感谢了。  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-21 17:29 | javaman
真是太好了,我正想问你datetimepicker的用法呢,非常感谢!~  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-21 17:31 | javaman
小弟最近在学struts2 在datetimepicker 遇到一个问题?
class:

public class myclass1 extends ActionSupport{
private Date birthday;

public Date getBirthday() {
return birthday;
}

public void setBirthday(Date birthday) {
this.birthday= birthday;
}

public String execute(){
return SUCCESS;
}

}



index.jsp:
<s:form action="myaction1">
<s:datetimepicker name="birthday" label="生日"/></<br>
<s:submit/>
</s:form>


问题:在index.jsp页面上始终不能显示时间的选择框,请问是怎么回事呢??
  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-21 17:44 | javaman
我把你做的这个例子,粘贴过来,其他的都能运行就是datetimepicker不能显示????
  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-22 09:24 | Max
@javaman
页面没有什么提示信息吗?这个例子应该很简单的。  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-22 09:34 | terry
datetimepicker不能显示,你在头部加上<%@ taglib prefix="s" uri="/struts-tags" %>试试  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-22 10:03 | EricaseJang
@Jeff
我也注意到了。我估计应该是text里边径符“/”的关系。
你看他官网上的mailreader也是看不到图片。  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-22 10:09 | javaman
myeclipse的控制台没有报错,在浏览器的状态栏有个错误提示:找不到dojo??


网页头部肯定加了<%@ taglib prefix="s" uri="/struts-tags" %>的  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-22 10:27 | javaman
哈哈,问题终于解决了!~
<head><s:head/></head> OK了

解释:


Renders parts of the HEAD section for an HTML file. This is useful as some themes require certain CSS and JavaScript includes.

If, for example, your page has ajax components integrated, without having the default theme set to ajax, you might want to use the head tag with theme="ajax" so that the typical ajax header setup will be included in the page.

The tag also includes the option to set a custom datepicker theme if needed. See calendarcss parameter for description for details.

If you use the ajax theme you can turn a debug flag on by setting the debug parameter to true.

  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-22 10:32 | orchlon
@Jeff

我记得IE上不显示图片,
但是firefox上能够正常显示。  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-22 10:48 | javaman
datetimepicker 的样式很不好看,而且还看不清楚,有什么办法可以改哈他的样式?  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-22 11:36 | terry
强烈建议Max建个QQ群,大家方便交流struts2.0里东西,呵呵  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-22 13:05 | javaman
支持!~  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-22 18:49 | Max
@javaman
最简单的方法用“查看源代码”方式,查看日历的样式,再作相应修改。  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-22 18:51 | Max
@terry
@javaman
我觉得QQ群太滥了,大家认为Google论坛如何?
  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-22 22:07 | jezz
我在测试哪个token的时候tomcat控制台报错:
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Err
or setting expression 'struts.token' with value '[Ljava.lang.String;@13576a2'
2007-5-22 21:36:17 com.opensymphony.xwork2.interceptor.ParametersInterceptor set
Parameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Err
or setting expression 'struts.token.name' with value '[Ljava.lang.String;@ff8c74
'
2007-5-22 21:36:17 com.opensymphony.xwork2.validator.ActionValidatorManagerFacto
ry <clinit>
信息: Detected AnnotationActionValidatorManager, initializing it...
Executing action, your message is 23566
2007-5-22 21:36:25 com.opensymphony.xwork2.interceptor.ParametersInterceptor set
Parameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Err
or setting expression 'struts.token' with value '[Ljava.lang.String;@c68a98'
2007-5-22 21:36:25 com.opensymphony.xwork2.interceptor.ParametersInterceptor set
Parameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Err
or setting expression 'struts.token.name' with value '[Ljava.lang.String;@354749
'
2007-5-22 21:36:25 org.apache.struts2.util.TokenHelper validToken
警告: Form token LNTDZ5OTANEM6E0Y0ZDGJSPA7WOXLI4 does not match the session toke
n GA8LF6M6WO4PY7YZ0PBXQLTVP3R6ZQS5.
请MAX帮我看下!以后我会经常来的!我也在学struts2  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-23 16:46 | terry
Max QQ群的即时消息快点,交流起来的效率是不是要高点的,要不我建个,5804258,我也初学struts2.0,希望大家多赐教了,呵呵  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-23 17:50 | javaman
问个问题哈
我要取得session 或者request的值
<s:property value="#session.name"/>这样取肯定没有问题。

如果我要把取得的值放在文本框中
<s:textfield name="name" value="#session.name"/>就不能取到,是怎么回事呢? 不用<%%> 怎么样才能把session中的值取到文本框中呢?

  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-24 10:08 | Max
@jezz
你可以尝试一下设一下<s:token />的name属性,如<s:token name="MyToken" />.  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-24 10:19 | Max
@javaman
这样写就可以了:
<s:textfield name="name" value="%{#session.name}"/>  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-24 10:23 | Max
@terry
感谢您的努力,有空大家可以进去看看:-)  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-24 11:14 | javaman

谢谢!  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-25 11:50 | john
最近正在看struts2-showcase这个例子.
看了你的文章很受启发..谢谢了.  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-26 11:06 | TEA
怎么修改日历前输入框的样式啊?  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-05-30 17:56 | jim
刚开始研究struts2 ,有幸看到你文章,收获不小 ,改日能否当面请教  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-30 21:23 | Max
@TEA
用“查看源代码”的方式,检查对应的CSS类名并加修改。  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-05-30 21:25 | Max
@jim
当然可以,如果有机会的话。  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-06-01 13:53 | kyo
为什么我一用到list="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }" 的时候IDE会报错?(expression expected)不能动态的构建MAP?

<s:checkboxlist name="skills2"
label="Skills 2"
list="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }"
listKey="key"
listValue="value"
value="{ 1, 2, 3 }"/>
  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-06-04 23:30 | Max
@kyo
IDE出错提示,有的不用理,知道是怎么一回事就可以了。
现在的JavaEE的IDE应该还没有支持OGNL的。  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-06-05 10:20 | javaman
期待你struts2的ajax标签,最近遇到很多问题都需要局部刷新!~  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-06-05 16:36 | javaman
批量封装对象
这个在我的项目中正好用到,谢谢MAX,但是我的项目中需要动态增加记录,意思是增加的对象个数不定,我看你的是只有3条,要是对象个数不定是怎么作呢?
如何动态的添加和删除记录数呢??  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-06-07 21:58 | Oliver
强烈支持博主建Google讨论区,大家共同学习,共同进步!QQ群太烂了,查看历史讨论信息也不方便。  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-06-08 09:12 | Max
@Oliver
@javaman
I'm working on it  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-06-16 09:53 | Oliver
好啊,建好后通知一声  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-06-19 13:15 | zzq19850814
@kyo

<s:checkboxlist name="skills2"
label="Skills 2"
list="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }"
listKey="key"
listValue="value"
value="{ 1, 2, 3 }"/>


这个list怎样动态的构建,如从数据库中查出
  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-06-19 22:38 | Max
@zzq19850814
通过Action执行DAO操作。  回复  更多评论
  
# re: Strus 2的新表單標誌的使用 2007-07-09 02:01 | JJ
請問如果使用標準
html tag的select multiple的寫法
在action
要如何取得值???
用List去取值
都是null
有其他解嗎???  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-10 13:36 | yiwuyun
清单4怎么会出现这种情况:
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]
----------

  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-11 12:05 | jessen
有的实例不是很明白  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-11 22:55 | Max
@JJ
可以将其绑定集合或数组如:
<s:select list="{ 'JSP', 'ASP.net', 'RoR', 'PHP' }" name="mySelector" multiple="true" />
代码为:
private List<String> mySelector;

public List<String> getMySelector() {
return mySelector;
}

public void setMySelector(List<String> mySelector) {
this.mySelector = mySelector;
}  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-11 22:56 | Max
@yiwuyun
你是否通过下*.action访问页面?
-----------------------------------------------------------------
在浏览器中键入:http://localhost:8080/Struts2_CoolTags/doubleselect.action  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-15 21:31 | 蛋白质
<s:optiontransferselect name="admin" list="loves" doubleName="admin2" doubleList="gl" leftTitle="左边的窗口" rightTitle="右边的窗口" label="从左到右,从右到左" headerKey="headerKey" headerValue="---请选择---" doubleHeaderKey="doubleHeaderKey" doubleHeaderValue="---已选择---"></s:optiontransferselect>

教我下,接收有问题啊,name="admin" doubleName="admin2" 要接受这两个东西,action里要定义什么类型?String[] admin; Object[] admin; List admin = new ArraryList();都不行,怎么搞啊  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-16 07:35 | 蛋白质
还是我,用list接收到了name的值,有个问题,一定要用鼠标去点一下啊?也就是说,要用鼠标去选择下选择项,把选择项变成兰色,激活了,才能把鼠标选到的项的值得到,这样一来是非常麻烦的一个事啊。有什么办法解决吗  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-17 11:16 | caofengnan
org.apache.jasper.JasperException: /outhers.jsp(13,20) #{..} is not allowed in template text
这个是什么原因呢? 楼主  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-22 15:13 | mango
运行doubleselect的问题
在浏览器中输入
http://localhost:8080/Struts2_CoolTags/doubleselect.action

这里需要在struts.xml中配置Action="doubleselect"吗
我没有配置,出错信息There is no Action mapped for namespace / and action name doubleselect.

需要的话,class是什么呢

  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-07-22 16:12 | mango
我在struts.xml中加入
<action name="*">
<result>/{1}.jsp</result>
</action>

OK了!  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2007-08-01 09:47 | Allen
关于doubleselect的问题:
我直接Copy过来就出现了错误:我同事机器上运行也有同样的错误,能帮忙给解决下么?谢谢

freemarker.log.JDK14LoggerFactory$JDK14Logger error


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]
----------  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-08-02 23:33 | Max
@Allen
1、面上加入某些标志(如:<s:doubleselect />等)时,应该通过action来访问页面,而不是通过*.jsp的URL直接访问。

2、或者<s:form />标签中添加name属性,如<s:form name="myForm" />  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-08-21 15:45 | Feijf
运行清单4时,为什么当list选择java时,doubleList和List中间回空一行,而list选择.Net或Database时,没有空行。  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-09-03 09:43 | gdm

<s:radio label="Sex" name="sex" list="#{ 1: '男',2: '女' }" value=" ????"/> 在这个标签中如何获得一默认值呢?谢谢  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-09-05 00:36 | Max
@gdm
试一下这样:
<s:radio label="Sex" name="sex" list="#{ 1: '男',2: '女' }" value="1"/>  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-09-05 08:23 | gdm
我调试出来了,<s:radio label="Sex" name="user.sex" list="#{ 1: '男', 2: '女' }"value='1' /> 用单引号 不过挺感谢max的回答
  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-10-30 16:35 | sgwood
按照max的做法:直接访问JSP文件不成功,错误提示:
System Runtime Error:
An exception occurred processing JSP page /token.jsp at line 8 5: 6: 7: 8: 9: 10: 11:
<s:token/>
Stacktrace:
5: <html xmlns="http://www.w3.org/1999/xhtml">
6: <head>
7: <title>Struts 2 Cool Tags - &lt;s:token/ &gt;</title>
8: <s:head />
9: </head>
10: <body>
11: <h2>&lt;s:token/&gt;</h2>
Stacktrace:>
org.apache.jasper.JasperException: An exception occurred processing JSP page /token.jsp at line 8(省略)

进而用Action去访问,而用http://localhost:8080/myweb/token.action运行可以访问(指向/token.jsp)但提交数据后,显示:16:22:13,109 INFO [STDOUT] 2007-10-30 16:22:13,109 ERROR [com.opensymphony.xwork2.interceptor.ParametersInterceptor] - <ParametersInterceptor - [setParameters]: Unexpected Exception caught setting 'MyToken' on 'class tutorial.CoolTagAction: Error setting expression 'MyToken' with value '[Ljava.lang.String;@1af2a9c'>
16:22:13,109 INFO [STDOUT] 2007-10-30 16:22:13,109 ERROR [com.opensymphony.xwork2.interceptor.ParametersInterceptor] - <ParametersInterceptor - [setParameters]: Unexpected Exception caught setting 'struts.token.name' on 'class tutorial.CoolTagAction: Error setting expression 'struts.token.name' with value '[Ljava.lang.String;@11674f0'>
提交后刷新能够提示是重复提交,但后台显示:
WARN [org.apache.struts2.util.TokenHelper] - <Form token DU5UW3PLUZ17I9PHCB1V7AUUKEMI3V52 does not match the session token 1M148DM2DXLCXDP9SNSBZ828P3B8CX2L.>
上面有位兄弟有相同的错误,max建议改名但还是传报两个ParametersInterceptor (只是其中一个改为MyToken),希望Max能解答下,我初步怀疑是我的项目中的配置(web.xml等)和您的不一样了。  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-10-30 16:39 | sgwood
对了,我的问题是:JSP为什么直接调用不成功/token为什么不正常?谢谢  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-11-09 17:19 | huazihun
我和sgwood的问题一样,期望max大哥抽时间给我们解决一下!谢谢  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-11-12 11:51 | 高山流水
使用 :<s:doubleselect > 怎样将这两个下拉的选择框放到下一个表格的一行的两列中呢。。。??  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-11-12 14:01 | 高山流水
Struts 2 怎样实现三级联动呢。。?  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-11-19 16:06 | gill
这个没想过。。。  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-11-23 11:12 | sspanzer
@MAX
请教一个问题:
在作doubleselect例子时.copy了doubleselect.jsp,用action来访问.出现如下错误:
Messages: There is no Action mapped for namespace / and action name doubleselect.
......
You are seeing this page because development mode is enabled. Development mode, or devMode, enables extra debugging behaviors and reports to assist developers. To disable this mode, set:

struts.devMode=false

in your WEB-INF/classes/struts.properties file.
用JSP方式来访问则是和上面兄弟一样的错:
==> ${parameters.formName} [on line 98, column 41 in template/simple/doubleselect.ftl]
in include "/${parameters.templateDir}/simple/doubleselect.ftl" [on line 25, column 1 in template/xhtml/doubleselect.ftl]

在struts.properties 中加入struts.devMode=false后.action访问出现
HTTP Status 404 - There is no Action mapped for namespace / and action name doubleselect.
意识到是在struts.xml中少了action
加入
<action name="doubleselect" >
<result>/doubleselect.jsp</result>
</action>
修改doubleselect.jsp为:
<s:form action="doubleselect" >

action访问成功,后又试JSP方式也可,还请教MAX这是为何?
试着去掉struts.devMode = false后.访问一样可以
google得知struts.devMode = false指定Struts 2处于开发状态
还请解释struts.devMode=false或true有什么区别?对开发有什么影响
谢谢!  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2007-12-01 13:36 | Donson
期待Max的后续文章,如自定义等等,因为我是用xhtml+css布局,发现struts2自带的生成table,不好控制。。。。  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2008-01-09 14:51 | michael
不知道Max 有没有遇到过这个问题。
[14:45:40.753] Expression parameters.doubleId is undefined on line 56, column 108 in template/simple/optiontransferselect.ftl.
[14:45:40.753] The problematic instruction:
[14:45:40.753] ----------
[14:45:40.753] ==> ${parameters.doubleId?html} [on line 56, column 106 in template/simple/optiontransferselect.ftl]
[14:45:40.753] in include "/${parameters.templateDir}/simple/optiontransferselect.ftl" [on line 2, column 1 in template/xhtml/optiontransferselect.ftl]
[14:45:40.753] ----------
[14:45:40.753]
  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2008-01-09 15:58 | michael
我使用utf-8的编码格式。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
这时使用s:datetimepicker这个标签提交的时候就会出乱码。这是怎么回事呢?  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2008-01-22 14:06 | LING
为什么在 几个下拉列表中,都会有一个空的选项 ,怎么去掉这个空的选项呢????  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2008-01-23 15:41 | kaka
Max对你的敬佩如黄河泛滥一发不可收拾  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-01-31 11:16 | 无名小卒
请问楼主:struts2的日期控件怎么使用?我想在页面上判断输入是否正确,还有就是通过js给它赋值怎么办啊?我始终得不到这个日期控制这个对象?  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-02-28 09:13 | itanyang
<s:set name="foobar"
value="#{'Java': {'Spring', 'Hibernate', 'Struts 2'}, '.Net': {'Linq', ' ASP.NET 2.0'}, 'Database': {'Oracle', 'SQL Server', 'DB2', 'MySQL'}}" />
<s:doubleselect list="#foobar.keySet()"
doubleName="technology"
doubleList="#foobar[top]"
label="Technology" />
</s:form>
在doubleselect中怎样实现如果选择Java 提交的是1 ,选择 Spring 提交 11 这样的功能呢。
请教MAX 谢谢
itanyang120@163.com  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-03-02 03:46 | fds
@sspanzer
fds  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-03-11 15:34 | lastsweetop
十二章struts 2.0 三天看完,调试成功所有示例,累死我了

感谢Max 和struts 2.0的开发者 很好很强大  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-03-19 00:25 | ercerc
感谢max的详细讲解,通俗易懂,但有两个问题,麻烦帮忙看看,谢谢:
1)datetimepicker reset的时候变成空
edit页面,里面有一个datetimepicker本来是有值的,但form reset的时候变成了空,请问怎样保持以前的值?
2)能不能让datetimepicker只能选择,不能手工输入?  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-03-25 09:35 | laci
checkboxlist 输出结果是横的,我想输出纵向的.就是一行只有一条数据那种,怎么办?  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-04-25 06:55 | helen
请教一个郁闷的问题:struts2

我再userAction里得到User对象,User对象的属性都在domain包里,我在UserAction后返回jsp页面怎么得到User的属性呢 ?

<s:property value="%{user.name}"> 不行么?555,高手快现身救我!  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-04-26 15:11 | 彪彪
@蛋白质
struts.ui.theme=xhtml 即可 如为 ajax 好象不行  回复  更多评论
  
# 使用 2008-05-14 14:29 | 金昌
试一试  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-06-20 10:51 | kaig
@helen
<s:property value="user.name"> 应该就可以了  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-06-20 23:07 | zirantian
在strust2里面,超连接传的参数始终为空,这倒底是为什么啊?怎么解决啊?  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-06-21 15:06 | 淘声依旧
加入<s:head/>或者是使用IE7无法显示,这些控件在ie7里不支持  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2008-11-14 13:29 | 心梦帆影
谢谢,你的文章真的很有用!谢谢!  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2008-11-20 01:36 | 康康
@javaman
我也这样做了,还是不行

我打开others.jsp还是看不见datetimepicker,网页错误说dojo未定义。

查看网页源文件发现有这么一句
src="/Struts2_OGNL/struts/dojo/dojo.js

直接在ie中输入地址
http://localhost:8080/Struts2_OGNL/struts/dojo/dojo.js
出现如下错误信息:

type Status report

message

description The requested resource () is not available.

看来这个js文件是找不到了,各位老大帮帮忙啊  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2008-11-21 13:37 | javaman
@康康
struts2新版本引入标签的方式,跟之前的版本不太一样了,你查以下官方的api文档  回复  更多评论
  
# re: Strus 2的新表单标志的使用[未登录] 2008-11-21 13:39 | javaman
@helen
这样试试
<s:property value="user.name">   回复  更多评论
  
# re: Strus 2的新表单标志的使用 2009-01-20 09:13 | shuzigui
Help!
我在运行你的例子的时候,只要碰到有list="#{}"这不能通过调试,页面报错如下According to TLD or attribute directive in tag file, attribute list does not accept any expressions,我已经查过你的ognl语言中#的用法,其中的构造Map这个用途我一直都没有用上,麻烦你解答一下。
最真诚的感谢!  回复  更多评论
  
# re: Strus 2的新表单标志的使用 2009-03-12 16:55 | 王银龙
恩,不错的,很好,我就是有一个小问题呢?就是我每次刷新页面都会跳到同一个页面,但我想指定到一个页面应该怎么搞呢?  回复  更多评论
  
# re: Strus 2的新表单标 2014-03-13 14:03 | dsa
sdfa  回复  更多评论
  

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


网站导航: