【问题标题】:Java Web application architecture discussionJava Web 应用程序架构讨论
【发布时间】:2014-07-05 07:08:18
【问题描述】:

我拥有 Java 背景,并在 Web 开发领域工作了几年。因为我没有从头开始学习 Web 开发,所以我的技能有所提高,但并不那么干净和扎实。我正在谈论的 Java Web 应用程序大约有 8 年的历史,并且是由非 Web 开发专家的开发人员创建的。结果:他们/我们做了很多你不应该做的事情。因为我们想在未来几年更新我们的应用程序,所以我想尝试找到一个干净的策略/架构。

我们的系统是这样工作的:服务器(不是 Web 服务器)存储了许多具有完全不同结构的不同对象,并基于数据仓库系统进行了大量数据分析。客户端通过套接字连接到服务器。一个客户端是 j2ee Web 客户端。我们有 Servlet、Actions、JSP、Beans……我们在客户端中有很多业务逻辑,它们将被移动到服务器上。我们的软件是高度可配置的,并且变得相当大。因为视图可以通过计算的数据发生巨大的变化,它的状态等等我们的 JSP 在太多的 scriptlet 中非常复杂 - 不好。

我的想法:

  • 每个控制操作/业务逻辑都将移至服务器。
  • 服务器发回带有元数据的数据,这样客户端就可以快速管理视图,而无需自己进行验证等类似操作。 (例如元标记“无效”)
  • servlet 和服务器之间的客户端在 Freemarker 或 Mustache.java 等模板引擎的帮助下创建 HTML 代码。
  • 将响应此 HTML 代码以替换、填充或添加 DOM 节点。
  • 我们将使用 Ajax 请求。

您如何看待这种方法?关于弱点或缺陷的任何提示?使用 web 服务而不是 servlet 有意义吗?

所以现在我不是在寻找一个框架(但如果有你必须提到的,请不要退缩),而是我想在未来使用的通用架构。

提前感谢您的建议和提示。


我对我们当前结构的描述似乎有点混乱。第二次尝试: 我们的软件最初是一个非 Web 应用程序。我们有一个服务器来管理数据、计算……连接的客户端呈现视图并获取用户交互。大约 8 年前,我的公司决定为客户开发一个 Web 应用程序。我们客户端的一个实例(它持有与服务器的连接)存储在会话中,并且可以被 servlet、jsps 等访问。因此,Web 服务器实际上是我们系统中客户端的一部分。

我希望这会有所帮助。

【问题讨论】:

  • “servlet 和服务器之间的客户端”? “我们的系统是这样工作的:服务器(不是网络服务器)......”?这个服务器不是需要你在网络服务器和服务器之间有一个“客户端”的网络服务器是什么?你真的需要解释一下。
  • 我编辑了帖子,希望不再那么混乱。

标签: ajax jakarta-ee servlets web-applications architecture


【解决方案1】:

我可能有四种方法,具体取决于您自己开发的 TCP/IP 服务器实际返回的内容以及要处理的麻烦程度。如果不知道所有细节,很难知道哪个是最好的。

选项 1(不理会 TCP/IP 服务器,只重新开发 Web 应用程序):

  1. 将自制的 TCP/IP 服务器视为或多或少的临时数据库服务器,并保持原样。也就是说,我根本不会碰它。

  2. 我会将应用程序逻辑留在 Web 应用程序中,但将其从 JSP 移出到 Servlet 中。基本上,重写 web 应用程序部分以将视图 (JSP) 与逻辑 (Servlet) 分开。

  3. 我会为 HTML 模板使用 JSP,并用 Ajax 请求填充到逻辑所在的 Servlet。 (或者,将 Servlet 用作设置请求属性并转发到 JSP 的控制器,而用户永远不会在地址栏中看到 .jsp。) Servlet 将依次以与普通 Servlet 大致相同的方式访问本地 TCP/IP 服务器将访问数据库服务器。

选项 2(将系统统一为一个,将其重新设计为一个 Web 应用程序):

  1. 将所有代码从本地 TCP/IP 服务器移动到 Web 应用程序中的 Servlet,并摆脱本地 TCP/IP 服务器。拥有两台服务器毫无意义。如果你要花时间重写这个烂摊子,那就把它重写为一个系统。

  2. 我会将应用程序逻辑留在 Web 应用程序中,但将其从 JSP 移出到 Servlet 中。基本上,重写 web 应用程序部分以将视图 (JSP) 与逻辑 (Servlet) 分开。

  3. 我会为 HTML 模板使用 JSP,并用 Ajax 请求填充到逻辑所在的 Servlet。 (或者,使用 Servlet 作为控制器来设置请求属性并转发到 JSP,而用户永远不会在地址栏中看到 .jsp。)

或者,选项 3(用 cronjobs 替换 TCP/IP 服务器,以填充数据库以驱动 Web 应用程序):

  1. 将本地 TCP/IP 服务器更改为在服务器后台持续运行的东西(而不是必须由客户端调用的东西)。它可能类似于用 C#.net 编写的 Windows 服务,或者是使用 cronjobs 在 Linux 中调度的一组 Java 控制台程序。它将填充某种数据库以供 Web 应用程序使用。

  2. 使 web 应用程序只读取该数据库。不再需要它访问服务器的东西了。

  3. 关于视图和逻辑分离等的相同内容。

选项 4(将 TCP/IP 服务器替换为 Web 服务):

  1. 将本地 TCP/IP 服务器替换为一个 Web 服务或一组 Web 服务。

  2. 与选项 1 相同。

  3. 与选项 1 相同,但现在您从 Servlet 而非老式 TCP/IP 服务器访问 Web 服务。

【讨论】:

  • 哇。非常感谢您的详细解答。
  • 我们肯定会选择选项 1,因为服务器太大了,三个开发人员需要大约 2 年的时间来重写它。现在我更专注于未来将包含更少逻辑的 Web 应用程序端。它基本上是服务器的接口。我的问题是,我看到了我们的 JSP 并看到了它们将我们引向何方。它们塞满了 if/els、开关……所以我们的应用程序中有大约 100 个不同的 JSP。我想摆脱 JSP 中的这种复杂性。那么我的方法(Servlets 中的 HTML)愚蠢吗?
  • 如果你在 Servlet 中输出整个页面,那是个坏主意。它会比 JSP 更混乱,特别是如果你必须包含 Javascript。你最终会得到一堆让你眼花缭乱的转义引号。但对我来说,对于 HTML 的小 sn-p 来说是有意义的,就像如果你有一个 Servlet 将 HTML 的 sn-p 返回到 Ajax 请求以填充 DIV。
  • 是的,我很担心,这就是我问这个问题的原因。嗯,这就是我的想法:使用像 FreeMarker 这样的模板引擎来创建模板/sn-ps(类似于 jsp),根据需要将它们组合到 servlet 中,然后用 Ajax 重新发送它们。因此,不要使用会在 jsps 中造成混乱的 jsp:includes,因为我必须检查(在 jsps 中)哪个 jsp 必须包含哪些参数,我会移动这段代码(决定使用哪个模板)哪个参数)到 servlet 或实用程序类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2012-12-30
  • 2011-01-02
  • 2011-01-01
  • 2010-12-23
  • 2016-03-26
  • 1970-01-01
相关资源
最近更新 更多