锁定老帖子 主题:WebWork2中i18n的怪异表现??
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-08-10
但是,WW2的所有资源文件的载入都必须通过一个Aciton??也就是说一个jsp页面直接浏览的时候,页面中的<ww:text/>标签根本不起作用??必须通过一个Action的返回success或input之类页面中,这些标签的才能起到作用。 为什么要设计成这样?还是我的配置问题。有人遇到这样的问题吗?一起讨论一下!!! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-08-12
没有遇到你这样的问题, 查文档看看:
http://wiki.opensymphony.com/display/WW/UI+Tags#UI+Tags-i18n |
|
返回顶楼 | |
发表时间:2004-08-12
用<ww:i18n/>
例: <ww:i18n name="'com.opensymphony.webwork.example.i18n.Shop'"> <ww:text name="'main.title'"/> </ww:i18n> |
|
返回顶楼 | |
发表时间:2004-08-12
对,用了i18n标签后当然是可以了。只是这样写一是比较麻烦,二是资源文件的位置将不可配置,还是不太方便。
而且我用了WW2文档推荐的方法,将资源文件绑定的统一放在listener中,我只想用一个text标签搞定多语言文字输出问题,就像在struts中使用bean:message一样! public class WebworkGlobalMessagesListener implements ServletContextListener { private static Logger log = Logger.getLogger(WebworkGlobalMessagesListener.class);; private static final String DEFAULT_RESOURCE = "global-messages"; /** * Uses the LocalizedTextUtil to load messages from the global message bundle. * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.Servle tContextEvent); */ public void contextInitialized(ServletContextEvent arg0); { log.info("Loading global messages from " + DEFAULT_RESOURCE);; LocalizedTextUtil.addDefaultResourceBundle(DEFAULT_RESOURCE);; log.info("Global messages loaded.");; } /** * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent); */ public void contextDestroyed(ServletContextEvent arg0); { // do nothing } } |
|
返回顶楼 | |
发表时间:2004-08-16
问题出在WW的文档中。文档中描述textfield标签使用国际化资源的时候是使用text('key')。其实是通过OGNL去访问ActionSupport的getText(String key)方法。如下:
<ww:textfield /> In this example, a text control is rendered. The label is retrieved from a ResourceBundle by calling ActionSupport's getText(); method. <ww:textfield label="text('user_name');" name="'user'"/> 但是,文档中写的这个方法其实是错误的,正确使用OGNL访问有参数method的方法是,方法的全称,getText('key')。上面这个实例应该是这样: <ww:textfield label="getText('user_name');" name="'user'"/> 竟然是WW的文档错了!不知道我的理解对吗? |
|
返回顶楼 | |
发表时间:2004-08-26
还没有用ww。
但是对于ognl,如果getText()这个方法存在,且返回的是map,那么text('user_name')这个用法是正确的。 而getText则相当于直接调用一个带参数的方法了,它返回的一般直接是string了。 |
|
返回顶楼 | |
发表时间:2004-10-18
今晚也遇到这个问题,看看源码就知道了
ActionSupport.java public String getText(String aTextName); { return textProvider.getText(aTextName);; } ... private final transient TextProvider textProvider = new TextProviderSupport(getClass();, this);; I18nTag.java public int doStartTag(); throws JspException { // Get bundle try { String name = this.findString(nameAttr);; ResourceBundle bundle = (ResourceBundle); findValue("texts('" + name + "');");; if (bundle == null); { bundle = LocalizedTextUtil.findResourceBundle(name, (Locale); getStack();.getContext();.get(ActionContext.LOCALE););; } if (bundle != null); { final Locale locale = (Locale); getStack();.getContext();.get(ActionContext.LOCALE);; getStack();.push(new TextProviderSupport(bundle, new LocaleProvider(); { public Locale getLocale(); { return locale; } }););; } } catch (Exception e); { LogFactory.getLog(getClass(););.error("Could not find the bundle " + nameAttr, e);; throw new JspException("Could not find the bundle " + nameAttr);; } return EVAL_BODY_INCLUDE; } TextProviderSupport.java public TextProviderSupport(Class clazz, LocaleProvider provider); { this.clazz = clazz; localeProvider = provider; } public TextProviderSupport(ResourceBundle bundle, LocaleProvider provider); { this.bundle = bundle; localeProvider = provider; } public String getText(String aTextName); { if(clazz != null); return LocalizedTextUtil.findText(clazz, aTextName, getLocale(););; else return LocalizedTextUtil.findText(bundle, aTextName, getLocale(););; } 自己的改进: MyProjectActionSupport extends ActionSupport public String getText(String aTextName); { String text = super.getText(aTextName);; if (text == null || text.length(); == 0); { text = textProvider.getText(aTextName);; } return text; } 这里面的textProvider就是自己创建的,当然使用bundle创建了,灵活点都可以把这个全局的resourcebundle写到配置文件中 |
|
返回顶楼 | |
发表时间:2004-10-23
刚才实际使用了一下,才发现<ww:text name="aaa" />调用的是getText(String aTextName, String defaultValue, List args)的方法所以改getText(String aTextName) 只对java文件有效,那么为了实现原来的想法,我又修改了一下,已测试通过
MyProjectActionSupport extends ActionSupport // for <ww:text name="xxx" /> public String getText(String key, String defaultValue, List values); { String text = super.getText(key, defaultValue, values);; if (text.equals(defaultValue);); { text = getTextProvider();.getText(key);; if(values != null && text != null && text.length(); != 0 ); { text = MessageFormat.format(text, values.toArray(););; } } return text; } // for calling getText method in action public String getText(String key); { String text = super.getText(key);; if (text == null || text.length(); == 0 || text.equals(key);); { text = getTextProvider();.getText(key);; } return text; } // get my bundle, you should have yours private ResourceBundle getBundle(); { if (bundle == null); { bundle = LocalizedTextUtil.findResourceBundle(CaryoSetup.getInstance();.getProperty( "default.i18n.filename");, getLocale(););; } return bundle; } private TextProvider getTextProvider(); { if (textProvider == null); { textProvider = new TextProviderSupport(getBundle();, new LocaleProvider(); { public Locale getLocale(); { return CaryoSetup.getInstance();.getLocale();; } });; } return textProvider; } private static ResourceBundle bundle; private static transient TextProvider textProvider; |
|
返回顶楼 | |
发表时间:2004-10-25
刚看了ww代码,太古怪了
资源文件在action里是用class,在tag里用bundle,so strange! |
|
返回顶楼 | |
发表时间:2004-10-25
youcai 写道 还没有用ww。
但是对于ognl,如果getText()这个方法存在,且返回的是map,那么text('user_name')这个用法是正确的。 而getText则相当于直接调用一个带参数的方法了,它返回的一般直接是string了。 text('user_name')不正确吧 public void test2(); { OgnlValueStack stack = new OgnlValueStack();; stack.push(this);; System.out.println("text('1'); = " + stack.findValue("text('1');"););; System.out.println("getText('1'); = " + stack.findValue("getText('1');"););; System.out.println("text = " + stack.findValue("text"););; System.out.println("text(); = " + stack.findValue("text();"););; System.out.println("getText(); = " + stack.findValue("getText();"););; } public String getText(String name); { return "带参数的返回值"; } public String getText();{ return "不带参数的返回值"; } 运行test2后,返回结果为: text('1'); = null getText('1'); = 带参数的返回值 text = 不带参数的返回值 text(); = null getText(); = 不带参数的返回值 |
|
返回顶楼 | |