【问题标题】:Using Expression Language with Tiles + Spring MVC将表达式语言与 Tiles + Spring MVC 一起使用
【发布时间】:2013-07-01 22:25:27
【问题描述】:

如果在我设置的控制器内部

model.addAttribute("page-title", "Home");

我想把它放在一个像这样的瓷砖laytou.jsp上:

<title><tiles:getAsString name="page-title"/></title>

我该怎么办?

  1. 写一个preparer?

    对于准备者而言,put-attribute 定义无关紧要,因此看起来毫无意义。

  2. 只需添加一个 定义?

    当我这样做时,我只会得到“${page-title} - 我的网站”作为输出。 EL 没有被评估。

请问,最佳做法是什么以及如何使其发挥作用?

tiles-defs.xml:

<tiles-definitions>

  <definition name="baseLayout" template="/WEB-INF/pages/common/layout.jsp">
    <put-attribute name="website-title" value="My Website"/>
    <put-attribute name="page-title" expression="Default Title"/>
    <put-attribute name="header" value="/WEB-INF/pages/common/header.jsp"/>
    <put-attribute name="body" value=""/>
    <put-attribute name="footer" value="/WEB-INF/pages/common/footer.jsp"/>
  </definition>

    <definition name="*" extends="baseLayout">
        <put-attribute name="page-title" value="${page-title}"/>
        <put-attribute name="body" value="/WEB-INF/pages/{1}.jsp"/>
    </definition>

</tiles-definitions>

layout.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <meta name="language" content="English" />  
        <title><tiles:getAsString name="page-title"/> - <tiles:getAsString name="website-title"/></title>
        <link rel="stylesheet" type="text/css" href="<c:url value="/resources/css/style.css" />" media="all"/>
    </head>

    <body>

        <div id="container">

            <!--  header -->
            <tiles:insertAttribute name="header"/>

            <!-- main central container -->
            <tiles:insertAttribute name="body"/>

            <!-- footer -->
            <tiles:insertAttribute name="footer"/>

        </div>

    </body>
</html>

homeController.java:

@Controller
public class HomeController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView home(Locale locale, Model model) {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("home");
        model.addAttribute("page-title", "Home");
        return mav;
    }

}

servlet-context.xml:

<beans:bean id="tilesviewResolver" class="org.springframework.web.servlet.view.tiles2.TilesViewResolver" p:order="0"/>
<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <beans:property name="definitions" value="/WEB-INF/tiles/tiles-defs.xml"/>
</beans:bean>

pom.xml:

<!-- Tiles -->
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-jsp</artifactId>
    <version>2.2.2</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>       

<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-el</artifactId>
    <version>2.2.2</version>
</dependency>

【问题讨论】:

    标签: spring-mvc el tiles tiles2


    【解决方案1】:

    只需使用没有 Tiles 的纯 EL。模型属性根据请求作为属性 (HttpServletRequest#getAttribute) 放置在其名称下。这可以通过requestScope['page-title'] 或仅通过属性名称本身访问:

    <title><c:out value="${page-title}" /></title>
    <title>${page-title} - without HTML escaping provided by c:out</title>
    

    这与 Tiles 无关。使用模型/请求属性时不需要考虑 Tiles。

    【讨论】:

      【解决方案2】:

      Pavei 是对的,在您的用例中,为什么需要将请求属性作为磁贴属性放入并不明显。

      如果你真的需要它作为一个tiles属性,那么就这样做

      <put-attribute name="page-title" expression="${page-title}"/>
      

      【讨论】:

      • 这确实适用于瓷砖 3。我需要配置什么
      【解决方案3】:

      我的英语很差。而且我的项目中没有使用tiles2.x,我使用的是tile3.x。如果要使用表达式语言支持,首先应该启用 CompleteAutoloadTilesContainerFactory。

       <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
          <property name="definitions">
              <list>
                  <value>/WEB-INF/tiles/tiles-defs.xml</value>
              </list>
          </property>
         <!--enable CompleteAutoloadTilesContainerFactory -->
          <property name="completeAutoload" value="true"></property>
      </bean>
      

      那么你必须像这样配置定义。

      <definitions name="*" extends="baseLayout">
          <put-attribute name="page-title" expression="${page-title}" />
          <put-attribute name="body" value="/WEB-INF/pages/{1}.jsp" />
      </definitions>
      

      瓷砖文档https://tiles.apache.org/framework/tutorial/advanced/el-support.html 祝你好运。

      【讨论】:

        【解决方案4】:

        让我们回顾一下:

        1. 自 Tiles 2.1 起支持 EL 语言,无需额外配置。
        2. 如果我们使用 Tiles 3.x,我们应该:
          • 在 pom 中添加这个依赖:
        <dependency>
                <groupId>org.apache.tiles</groupId>
                <artifactId>tiles-extras</artifactId>
                <version>3.0.5</version>
            </dependency>
        
        • 启用 CompleteAutoloadTilesContainerFactory:
         <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
            <property name="definitions">
                <list>
                    <value>/WEB-INF/tiles/tiles-defs.xml</value>
                </list>
            </property>
           <!--enable CompleteAutoloadTilesContainerFactory -->
            <property name="completeAutoload" value="true"></property>
        </bean>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多