1

有一个业务问题需要解决。显而易见的解决方案是企业 Web 应用程序——提供所需功能的本地托管网站。

我想构建这个 Web 应用程序,但是构建它是这样的 -

  • 它更像是一种产品,而不是一次性解决方案;这样就可以为不同的客户定制
  • 可以为此 Web 应用程序提供“修复”,以便可以在对操作影响最小的情况下删除错误并添加增强功能
  • Web 应用程序应该能够使用不同的数据库和现有的身份验证系统

这甚至可能吗?这是一种足够普遍的方法吗?有一种已知的方法可以解决这个问题吗?使用像 Spring 这样的应用程序框架会更好,还是尽量减少对框架的依赖?

此外,将不胜感激任何可以指导我的书籍链接或参考资料。

在此先感谢 StackOverflow!

(我觉得在开始这个项目之前我不知道我需要知道的所有事情,请随时指出我没有考虑的事情)

4

3 回答 3

2

开发软件,特别是。对于可重用性,需要分析用例之间哪些部分/功能是通用的,哪些不是,在可重用(库)和定制/专用代码之间划清界限。

如果您知道将来期望或希望支持哪些用例,这可能是可行的。
如果你不这样做,你不应该首先尝试概括任意功能,因为你不知道将来会需要什么。

Java 为各种功能提供了一些很好的抽象,例如通过 JDBC 提供的通用 DB 支持。

如果您还没有,请查看 JBoss 或 Glassfish 等应用服务器。它们为 Web 应用程序提供了大量的基本功能,支持组件之间非常松散的耦合,并且高度可配置。例如,要从一个 DBMS 切换到另一个 DBMS,只需更改一行配置(假设支持的 SQL 足够相似)。部署应用程序或部件通常可以即时完成(“热部署”),甚至无需停止服务器。
另外:有大量的支持库和框架可以帮助您标准化您的应用程序设计。

于 2011-10-31T09:47:21.633 回答
2

我已经在一个可以部署在多个位置的 webapp 上工作了一段时间:它被设计为在许多主机上实例化。完全可以做到这一点,但很难。编写代码以使其能够以这种方式工作需要非常小心。

这样做的关键是使您对事物的所有依赖关系都明确,并且您的所有配置都由可以在安装期间设置的属性驱动。春天让这变得容易多了!特别是,org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer该类允许您使用 servlet 上下文作为值的来源,然后您可以将其注入到您的 bean 中(例如,通过@Value注释)。自己做这一切要困难得多。这是我使用的(简化版本):

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="contextOverride" value="true" />
    <property name="location" value="/WEB-INF/default.properties" />
</bean>

这会将 servlet 上下文的属性合并到您在 web 应用程序中作为默认值提供的属性之上(如果大多数事情大部分时间都不需要修改,这绝对是一个好习惯),然后使用它们来定义属性。foo.bar然后我使用占位符将配置属性(例如, )应用于 bean 属性,如下所示:

@Value("${foo.bar}")
public void setFoobar(String foobar) { ... }

以这种方式配置的内容包括数据库配置、包含无法在 webapp 中打包的内容的文件的绝对位置等。您必须使用您对应用程序域的技能和知识来确定需要做什么列出。

其他关键原则是尽可能多地保留在 webapp 内部(从而减少部署者搞砸它的机会),非常小心地记录所有内容,并尝试使用多个 servlet 容器。请记住,部署您的 web 应用程序的人无法访问您的想法内容:您必须将其写下来并准确告诉他们要做什么。(太多的说明处于“点击这个,点击那个,奇迹发生”的级别,但这些说明很糟糕,因为确切的方法会随着时间的推移而变化:说明为什么会更有帮助,因为它更便携。)

于 2011-10-31T10:54:55.877 回答
1

我们目前正在开发一种可以在内部为多个客户部署的产品,也可以作为公共门户解决方案。这是我们的经验。

正如其他人指出的那样,需要牢记不同的因素。

  • 安全
  • 与您的产品相关联的安全性,以及您将如何管理外部安全角色的产品功能需求。
  • 安全性、身份验证和授权不应作为基础产品的一部分。一旦获得授权,就需要将角色映射到产品角色以实现所述功能。
  • 需要自定义的图像和徽标。
  • 国际化。
  • 对于使用多个数据库,假设一个产品通常有两个不同的视图,持久性和查询。我们的经验是使用hibernate来支持多个数据库,但理论上我们过去只使用了两个数据库。db2 和 mysql。
  • 为您的产品的每个版本测试多个数据库是一件很痛苦的事情。您的测试用例偶尔会增加 3 倍或至少一次以支持多个数据库。
  • 使用自定义数据库和函数是一个很大的问题,您可以使用一些通用函数,但在查询中自定义数据库特定函数将是一件痛苦的事情,并且必须非常努力地避免它们。
  • 您的产品中支持的浏览器。
  • 第三方 jar 的许可证可能不兼容/不被所有机构接受,因此您必须小心谨慎。
  • 尽可能启用属性或配置来自定义所有变量。
  • 缓存策略和属性初始化策略。

框架帮助团队保持在同一页面上,而不是内部框架。在性能和其他考虑方面,使用像 Spring 这样完善的框架有很多优点。

干杯!

于 2011-11-14T16:50:23.453 回答