装饰多客户端 webapp

Posted

技术标签:

【中文标题】装饰多客户端 webapp【英文标题】:Decorating a multi-client webapp 【发布时间】:2012-05-15 20:02:02 【问题描述】:

我有一个使用 Java、Spring、Struts 2 和 Hibernate 编写的 Web 应用程序,它为多个客户端提供服务。每个客户端都有多个用户。为了为每个客户创造个人感觉,我想为每个客户定制标题。 我正在使用 sitemesh 作为装饰器,并且正在寻找提示或示例或可以为我指明正确方向的人,以了解如何在最佳实践中实现这一目标。

你会怎么想?我应该直接在 header.jsp 中对其进行编码吗?提取有关登录用户的信息并从中通过代码创建自定义标头?还是有更聪明的解决方案?

谢谢!

更新:

为了进一步明确我想要什么: 每个客户端的不同属性文件不是一个选项。我们正在寻找潜在的数百个客户。它需要是数据库驱动的。但这是容易的部分。将信息存储在db中并在需要时提取它是没有问题的。

我想弄清楚是否有某种标准的方法可以做到这一点。在站点网格装饰器之前运行的某种过滤器或操作将为装饰器提供正确的信息?

【问题讨论】:

如何区分客户端? 按客户 ID。我从登录用户那里得到它。 【参考方案1】:

Struts2 为应用程序的全局变量提供应用程序范围。

将所有客户特定的字符串加载到#application 范围内(我会在应用程序启动时使用 spring 来执行此操作)。从那里引用字符串将非常明显:#application.greeting 我不喜欢使用拦截器的想法,因为没有什么可以拦截的。我会说你正在做的应用范围是完美的地方。如果它是一个单一的客户端系统,我看不出任何东西会存储在应用程序范围内的理由。

旁白:Tiles 使用与站点网格不同的模板范例,它们的用途也略有不同。因此,两者可以互补。依赖于 XML 定义的图块可以将其定义存储在数据库中,并且计算密集度肯定较低,但是在不同 UI 组件之间存在相互作用的情况下......或出现在页面上的不同元素需要使用 sitemesh。因此,对于基本模板需求,tile 可以做所有事情,而且很容易理解,但是说你想在页面中间添加一个依赖于 JS 的小部件,它需要添加到标题中,这样做会很棘手Tiles(尽管显而易见的解决方案是将 JS 功能整合到一个 JS 文件中,以供站点特定部分的所有可能用途使用)。

旁白2:通过结合使用velocity 或freemarker 等视图技术,可以将整个视图层移动到数据库中。我只是想我会提到一些可能非常有益的维护问题。

【讨论】:

谢谢,但它需要由数据库驱动。请看我更新的描述。 重写了答案。您只想加载这些字符串一次(或者从管理页面重新加载,但不是整个应用程序中的每个页面!)这不是一个过早的优化,因为它应该很容易做到,而且非常易于使用。 再次感谢您。我现在很好地实现了这一点。我在启动时将 HashMap 放在上下文中。这可以在 jsp 中访问。现在我只需要通过传入 clientId 从地图中获取正确的属性。我在这里摸不着头脑,所以任何关于如何在 jsp 中正确访问的提示都会非常有帮助! 每个客户端都有自己的应用服务器还是一个应用服务多个客户端?如果每个客户都是独立的,则不需要地图。【参考方案2】:

Sitemesh 根据请求的 URL 字符串决定使用什么装饰,因此除非您在每个 url 中都有对客户端的引用 - 作为主 url 字符串的一部分或作为已知参数,否则 Sitemesh盒子没用。

这留下了一些实现你想要的可能性;

1) 编写一个在 Sitemesh 之前运行的过滤器,例如,将“&clientId="xx" 添加到每个传入请求中。

2) 深入研究 Sitemesh 的源代码并寻找 Sitemesh 最终决定使用哪些装饰器并覆盖它的地方。我从来没有尝试过,所以我不知道这有多实用。

3) 使您的 jsp 页面中的样式表定义成为 OGNL 表达式,并在您的所有操作都扩展的基本操作类中提供该信息。通过这种方式,您最终(可能)为每个客户端使用不同的 CSS 文件,并通过 CSS 提供您的自定义。

希望这会有所帮助。

【讨论】:

以上是关于装饰多客户端 webapp的主要内容,如果未能解决你的问题,请参考以下文章

web app与常见的PHP框架怎么配合

Webapp2 请求应用程序/八位字节流文件上传

设计模式简介

客户端与WebApp技术能力对比

客户端与WebApp技术能力对比

同步 webapp 客户端(IIS 并发请求)