【问题标题】:reading values from XML and displaying them in JSP从 XML 读取值并在 JSP 中显示它们
【发布时间】:2013-05-20 08:14:30
【问题描述】:

我对 JSF 有一些经验,但我现在想学习一些 Spring MVC。我希望向用户显示选项以更改我的网站显示的语言。为此,我想在 XML 中定义语言并将它们设置在 bean 中,然后在 JSP 中遍历该列表以显示语言选项给用户。

这就是我的 XML 的样子:

<bean id="languagesSupportedBean" class="be.maxcorp.Util.LanguageBean">
    <property name="languagesSupported">
        <array>
            <value>en</value>
            <value>nl</value>
        </array>
    </property>
</bean>

这是我的LanguagesSupportedBean 班级:

@Component
public class LanguageBean {
    public String[] languagesSupported;

    public String[] getLanguagesSupported() {
        return languagesSupported;
    }

    public void setLanguagesSupported(String[] languagesSupported) {
        this.languagesSupported = languagesSupported;
    }
}

在我的 JSP 中,我想做这样的事情:

<c:forEach items="${languageBean.LanguagesSupported}" var="language">
    ${language}
</c:forEach>

因为 Spring MVC 是基于请求的而不是基于组件的,我想这种方法将不起作用,除非我将 LanguageBean 作为属性添加到每个控制器方法中的每个 Model 参数中?

我非常感谢任何有关完成此操作的提示。

【问题讨论】:

    标签: spring jsp spring-mvc


    【解决方案1】:

    如果您使用InternalResourceViewResolver,您应该能够设置一个名为exposeContextBeansAsAttributes 的属性,它将您的bean 作为JSP 可以直接访问的属性公开:

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="exposeContextBeansAsAttributes" value="true"/>
    </bean>
    

    因此,如果您的 LanguageBean 在您的 XML 中指定为 id="languagesSupportedBean",您可以使用它的 id 在您的 JSP 中直接引用它:

    <c:forEach items="${languagesSupportedBean.languagesSupported}" var="language">
        ${language}
    </c:forEach>
    

    因此无需修改控制器或模型。

    如果你在 XML 中声明你的 LanguageBean,那么你不需要注释它@Component

    或者,如果您不使用InternalResourceViewResolver,您可以将LanguageBean 注入您的控制器,然后使用注释@ModelAttribute 的方法公开它:

    @ModelAttribute("languagesSupportedBean")
    public LanguageBean getLanguageBean() {
        return languageBean;
    }
    

    然后可以在您的 JSP 中使用名称 languagesSupportedBean 进行访问,并减少在每个控制器方法中为每个模型设置 bean 的需要。

    【讨论】:

    • 我正在使用TilesViewResolver,所以我认为我无法设置该属性。
    • 我将接受这个作为答案,因为我没有在问题中指定我正在使用 Tiles3,如果我使用 InternalViewResolver,这个答案将有效。 Tiles3 的答案可以在这里找到stackoverflow.com/questions/2848415/…
    • @Mekswoll - 很高兴你找到了答案。我也用另一种可能的替代方法更新了这个问题。
    【解决方案2】:

    将 bean 存储在会话中。您可以从 JSP 以相同的方式访问它。否则你可以扩展 Model 和 @Autowire 你去过那里(不确定它会起作用)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多