首页 > 解决方案 > 在struts2中选择下拉,从struts1迁移到struts2

问题描述

下面是来自 jsp 的 Struts1 代码片段

<logic:notEmpty name="user" property="myLanguages" scope="session">
                       <html:select name="user" property="defaultLanguage">
                         <html:optionsCollection label="languageName" name="user" property="myLanguages" value="languageCode"/>
                       </html:select>
</logic:notEmpty>

下面是来自 jsp 的 Struts2(2.5.16 版本)代码片段,它不起作用

<s:if test="%{#session.user.myLanguages != null && #session.user.myLanguages != ''}">
                          <s:select list="{#session.user.myLanguages}"
                                      listKey="languageCode" listValue="languageName"
                                      name="user"  value="defaultLanguage"/>
</s:if>

下面是来自jsp的脚本代码

<%
User user = (User) session.getAttribute("user");
Vector vMyLang = user.getMyLanguages();
        System.out.println("logon.jsp:vMyLang--- "+vMyLang);
        if(null != vMyLang){
            System.out.println("logon.jsp:vMyLang-----  "+vMyLang.size());//here output(i.e size) is 20
        }
%>

所以值存在于会话中,但我无法使用 strut2 标记,日志中没有错误/异常

Struts1 代码工作正常,Struts2 代码不工作(我的意思是 UI 中不显示下拉菜单)

请帮我看看我犯了什么错误。

标签: struts2struts-1struts1

解决方案


JSP 和 scriptlet 不是等价的。

在您的 scriptlet 中,您正在调用一个名为myLanguages().

在您的<s:if />标签中,您尝试调用名为getMyLanguages().

由于您没有遵循 JavaBean 命名约定,因此您不能使用 OGNL 提供的语法糖,您需要实际调用该方法。

注意:您应该遵循 JavaBean 命名约定;他们是一个约定是有原因的。任何依赖反射的 Java,比如 OGNL,都需要它。


推荐阅读