使用Tiles + Spring MVC的表达式语言

时间:2013-07-01 22:25:28

标签: spring-mvc el tiles tiles2

如果我在控制器内设置

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

我想把它放在这样的tile laytou.jsp上:

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

我该怎么办?

  1. 写一个编制者?

    到preparer de put-attribute定义并不重要,所以看起来没有意义。

  2. 只需添加&lt; put-attribute name =“page-title”value =“$ {page-title}”/&gt; 进入定义?

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

  3. 那么请问,什么是最佳实践以及如何使其发挥作用?

    瓦片-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>
    

4 个答案:

答案 0 :(得分:2)

只使用没有瓷砖的纯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。

答案 1 :(得分:1)

Pavei是对的,在你的使用案例中,为什么你需要将请求属性作为一个tile属性,这并不明显。

如果您确实需要它作为tiles属性,那么就像

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

答案 2 :(得分:1)

我的英语很差。我没有在我的项目中使用tiles2.x,我使用tiles3.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>

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

答案 3 :(得分:0)

回顾一下:

  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>