Java,从桌面应用程序过渡到Web应用程序

3

我打算写我的第一个基于Java的Web应用程序,但我有点迷茫如何开始。

首先,我想要一个Web应用程序和一个桌面应用程序,它们可以做类似的事情,而不需要使用将Web浏览器嵌入到桌面应用程序中的hackish方法,因为这样做不容易在不影响Web应用程序和桌面应用程序的情况下轻松更改桌面应用程序。

现在,这里是我的问题。

  • 目前,我有一堆POJOs,并且它们与一个单独的类通信,该类当前使用一个平面文件作为“数据库”,当然,在生产中,我将使用合法的数据库并只更改那个单独的类。这是个好主意吗?我能够从POJOs转换为Web应用程序吗?

  • 我应该使用框架吗?我想尽快编写此应用程序,因为所有业务逻辑都在那里,我只需要包装它使其可用,所以我不想花费过多时间学习Spring(据我所知,它很庞大),但是我也不想在整个应用程序中不停地重复发明轮子。我总是可以使用JSP和脚本语句……

  • 如果您对上述问题的回答是肯定的,那么您建议使用哪个框架?请注意,我想要一个框架,我可以在学习3-4周后开始使用。

  • 我是否必须从头开始使用我编写的POJOs?它们已经超过30k LOC了,所以如果是这样,我会犹豫不决。

4个回答

5
你需要:
  1. 一个网络框架。由于你有Swing背景,JSF 2将是你最好的选择(当然一切都会很痛苦,但JSF能让你快速上手并帮助你避免最悲惨的错误)。此外,将业务pojos包装成web guis是JSF的主要用例和重点。

  2. “粘合框架”。与桌面应用程序相比,Web应用程序有很大的不同之处,即您无法自己创建视图组件 - 它们必须在浏览器请求页面时创建。因此,您必须找到一种方法来创建视图对象并传递所有引用到代表逻辑的pojos,其中一些可能具有非常不同的生命周期(这在桌面上不是问题,但在Web上,您必须区分沿着整个应用程序、沿着单个用户会话、沿着单个请求等生存的pojos)。

“粘合框架”还可以提供管理事务的附加好处。您有三个选择:

  • Spring。它并不像您想象的那么复杂;您只需要学习一些基本知识。
  • EJB。您需要一个真正的应用服务器,如Glassfish或JBoss
  • 裸JSF具有很好的依赖注入支持,唯一的缺点是缺乏自动事务管理。

如果我处于您的位置,我会选择裸JSF 2.0 - 这样您只需要学习一种新技术。首先,尽量避免使用PrimeFaces等库 - 它们通常效果不如广告宣传的那么好。

编辑-补充说明

或者 - 什么是“依赖注入”(简化和简化)

当请求到达Web应用程序时,将在新线程中启动一个新任务(好吧,线程可能已经被回收了,但这并不重要)。

应用程序已经运行了一段时间,你需要的大部分对象已经构建完成,不应再次创建:您有数据库连接池,可能还有业务层的某些部分;还有可能请求只是在一个会话期间发出的众多请求之一,用户正在处理一堆POJO。问题是 - 如何获取对这些对象的引用?

  • 你可以将应用程序设置为通过一些静态字段提供资源。它们本身可能是单例,或者可以通过单例定位器获取。这种方法通常有效,但已经过时(难以测试、难以重构、难以重用、生命周期在应用程序中硬编码)。实际代码可能如下所示:

  •  public void doSomething() {
         Customer Service cs = AppManager.getInstance().getCustomerService();
         System.out.println(cs.getVersion());
     }
    
  • 如果需要集群和会话管理,则可以构建一种特殊类型的代理程序,该代理程序将知道并向任何人提供所需的所有对象。每种类型的对象都将注册为不同名称下的工厂。这也有效,并且在Java中实现为JNDI。实际客户端代码可能如下所示:

  • public void doSomething() throws Exception {
         CustomerService cs = (CustomerService)new InitialContext().lookup("some_fancy_looking_name_in_reality_just_string");
         System.out.println(cs.getVersion());
     }
    

  • 最后一种方式是最好的。由于您的初始对象不是由您创建的,而是在http请求到达后由服务器创建(细节取决于您选择的技术,但您的入口点可能是JSF托管bean或某种操作控制器),因此您只需广告您需要的引用,让服务器为您寻找它们。这称为“依赖注入”。在您的代码启动之前,您就像一切都已经处理好了。Spring或EJB容器、CDI或JSF会照顾剩下的事情。代码可能如下所示(仅作为示例):

    @EJB
    CustomerService cs;

public void doSomething() {
     System.out.println(cs.getVersion());
}

注意:

  • 当你使用 DI 时,它实际上在幕后使用了前两种方法之一。好处是:你不必知道哪一个,并且在某些情况下,甚至可以在不改变代码的情况下切换它们;
  • 注册组件以进行注入的确切方式因框架而异。它可能是一段 Java 代码(例如 Guice),一个 XML 文件(经典 Spring)或一个注释(经典 EJB 3)。大多数提到的技术都支持不同类型的配置。

依赖注入的确切含义是什么? - Dhaivat Pandya
啊啊啊。这个问题,委婉地说,太过宽泛了。我会尝试编辑一下答案,但如果你想理解它(如果你只是想使用它-不要费心),你必须更多地了解DI。 - fdreger
@fdreger,您是否仍然建议避免使用Primefaces? - Sarz
@Sarz,现在已经过去了六年,情况有所不同。但我仍然坚信,在你的第一个JSF项目中使用Primefaces是一个糟糕的想法。 - fdreger

2

如果你不使用框架,迟早会编写自己的框架,所以你一定要使用框架。

如果你使用maven,只需输入mvn archetype:generate,就会给你提供一个庞大的框架列表,它将为你设置所有的脚手架,因此你可以尝试几个框架,直到找到适合你的框架。

Spring文档很好,而且入门非常容易。不要被那些文档页数吓到!你可以使用JPA来存储数据库中的内容。理论上,你只需要注释现有的POJO对象来表示主键等,它就应该可以正常工作。你也可以在Spring中使用JSP,这样会更加方便。


1
我有一堆POJO,它们与一个单独的类通信,该类目前使用平面文件作为“数据库”,当然,在生产中,我将使用合法的数据库并更改该单个类。这是个好主意吗?我能从POJO转换成Web应用程序吗?
合格的答案是肯定的。如果POJO是健全的,你不应该遇到太多问题。许多人使用Hibernate。
我应该使用框架吗?我想很快编写这个应用程序,因为所有业务逻辑都在那里,我只需要包装它使其可用,所以我不想花费大量时间学习Spring(据我所知,它很庞大),但是,我也不想在整个应用程序中不断重复发明轮子。我总是可以使用JSP和脚本语言...
可能会用到。Spring很庞大,但像Grails或Roo这样的东西可以帮助。

如果你想要一个响应式的 Web 应用程序,你需要做一些富客户端(AJAX)的工作。这可能需要你的代码的很多客户端上运行。这意味着编写大量的 JavaScript 或使用 GWT。这将是一件痛苦的事情。可能不那么容易“包装”它。如果你已经编写了一个 Swing 应用程序,那么基本上该代码需要在客户端上运行。

如果你对上述内容表示赞同,你会推荐哪些框架?请注意,我希望能够在学习 3-4 周后开始使用框架。

我喜欢 Groovy 和 Grails - Grails 使用 Spring-MVC、Spring 和 Hibernate。但也有 Roo、Play 等其他框架。

我是否必须从头开始编写已编写的 POJO?它们超过了 30k LOC,所以如果是这样的话,我会犹豫。

在服务器上运行的代码可能可以基本保持不变。必须在客户端上运行的代码需要用 JavaScript 重写,或者也许你可以通过使用 GWT 来重复使用该代码。


0

Play框架正在做着伟大的事情,我强烈推荐它。 与EJB应用程序和Tomcat / Servlet / Spring应用程序一起工作后,它是一股清新的空气。 框架安装后,您可以在几秒钟内获得一个工作应用程序。 让我想起Ruby on Rails或Node.js,但具有Java的类型安全性。

比以前的Java Web应用程序框架更快的启动时间,更快的开发周期和更清晰的配置模型。

http://www.playframework.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接