0

如果在我设置的控制器内

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

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

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

我应该怎么办?

  1. 写一个preparer?

    对于准备者而言,放置属性定义无关紧要,因此看起来没有任何意义。

  2. 只需将<put-attribute name="page-title" value="${page-title}"/> 添加到定义中?

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

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

瓷砖-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>

布局.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

4 回答 4

2

只需使用没有 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。

于 2013-07-02T06:39:28.877 回答
1

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

如果您确实需要它作为图块属性,那么就这样做

<put-attribute name="page-title" expression="${page-title}"/>
于 2013-07-02T09:42:48.837 回答
1

我的英语很差。而且我的项目中没有使用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>

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

于 2013-12-05T16:40:10.610 回答
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>
于 2020-02-09T14:11:48.867 回答