支持Apache Tiles中的动态和翻译标题

时间:2015-04-07 12:15:26

标签: spring el tiles apache-tiles

我有一个使用Apache Tiles的Spring MVC项目。我已经实现了这样的标题可以从这样的消息源中读取:

<tiles-definitions>    
    <definition name="some-definition" extends="public.base">
        <put-attribute name="title" value="some-definition.title" cascade="true" />
    </definition>
</tiles-definitions>

在我的模板文件(由public.base定义)中,我执行以下操作:

<title><spring:message text="" code="${title}" /></title>

现在这适用于静态翻译标题,但我也想支持动态标题,例如用于显示公司名称。我可以这样做:

<tiles-definitions>    
    <definition name="some-definition" extends="public.base">
        <put-attribute name="title" expression="${company.name}" />
    </definition>
</tiles-definitions>

然后只需在我的模板中输出标题:<c:out value="${title}" />。但是,问题在于我的代码中断了,因为title属性的值不再是消息键。我希望能够支持以下场景:

  1. 静态标题,例如&#34;关于我们&#34;
  2. 纯粹动态的标题,例如&#34; $ {company.name}&#34;
  3. 带有翻译内容的动态标题,例如&#34;欢迎来到$ {company.name}&#34;
  4. 理想情况下,我可以在我的消息源中使用表达式语言,但我无法使用它。我已经尝试了很多种解决方案,但我似乎找不到合适的解决方案。如果我可以在我的消息源中使用表达式语言,那么这将很容易。例如,是否有可能以某种方式执行以下操作?

    some-definition.title = Hello there, ${company.name}
    

    在我的模板中:

    <spring:message text="" code="some-definition.title" var="test" />
    <c:out value="${test}" />
    

    以上不起作用,因为它输出${company.name}而不是变量的实际内容。有没有办法让这样的工作?或者还有其他方法可以支持我上面列出的方案吗?

    我考虑创建一个自定义JSTL标记,我将在纯Java代码中解析字符串表达式(已翻译的字符串),但我意识到我可能必须明确指定&#34的根对象;变量替换&#34;工作,as documented here。然后它似乎不是一个动态的解决方案。

    我有什么方法可以完成这项任务吗?非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

瓷砖定义的本地化有帮助吗?  ref http://tiles.apache.org/framework/tutorial/advanced/l10n.html

否则我会调查一个ViewPreparer,它会为你扩展spring消息。

答案 1 :(得分:0)

图块定义可以定义名为&#39; controllerClass&#39;的属性。此类应实现org.apache.struts.tiles.Controller接口,并在呈现切片定义之前调用其重写的execute()方法。

execute方法对tiles属性名称 - 值对以及HttpServletRequest对象具有读/写访问权限。您可以查找属性并动态更改值,或者使用属性文件中的半静态值替换它。

<definition name="some-definition" extends="public.base" controllerClass="pkgName.CustomController">
        <put-attribute name="title" expression="${company.name}" />
    </definition>

然后在CustomController类中,您可以更改属性

public class CustomController implements Controller{
       public void execute(ComponentContext tileContext,
            HttpServletRequest request, HttpServletResponse response,
            ServletContext servletContext) throws ServletException, IOException {       
          String attrName = (String)tileContext.getAttribute("title");
          String attrVal = request.getAttribute("pageTitle"); //get a dynamic value or else retrieve from a resource bundle
          tileContext.putAttribute(attrName,attrVal);
    }

    public void perform(ComponentContext tileContext,
            HttpServletRequest request, HttpServletResponse response,
            ServletContext servletContext) throws ServletException, IOException {
        execute(tileContext, request, response, servletContext);
    }
}

答案 2 :(得分:0)

你可能不会使用Tiles,这就是你的Spring-Model:

在控制器中:

@RequestMapping(value = { "/page1" }, method = RequestMethod.GET)
public String page1() {
    model.addAttribute("titre_page", messageSource.getMessage("home.hello", null,null)
}

在layout.jsp中:

...
<title>${titre_page}</title>
...
<tiles:insertAttribute name="body" />
....