【问题标题】:Java, moving from desktop app to web appJava,从桌面应用程序迁移到 Web 应用程序
【发布时间】:2011-06-01 23:07:02
【问题描述】:

我要编写我的第一个基于 Java 的 Web 应用程序,但我有点不知如何开始。

首先,我想要一个网络应用程序和一个桌面应用程序,它们做的事情几乎相同,没有将网络浏览器嵌入桌面应用程序的骇人听闻的想法,因为这样无法轻松更改桌面而不需要影响网络应用,反之亦然。

现在,这里是我的问题。

  • 现在,我有一堆 POJO,它们与一个类进行通信,该类现在使用平面文件作为“数据库”,当然,在生产中,我会使用合法的数据库和只是改变那个单一的班级。这是一个好主意吗?我可以从 POJO 转到 Web 应用吗?

  • 我应该使用框架吗?我想尽快写出这个应用程序,看到所有的业务逻辑都在那里,我只需要包装它以使其可用,所以,我不想花大量时间学习,比如 Spring( AFAIK 是巨大的),但是,我也不想在我的应用程序中不断地重新发明轮子。我总是可以只使用 JSP 和 scriptlet...

  • 如果您对上述内容说“是”,您建议使用什么框架?请注意,我想要一个可以在 3-4 周的学习后开始使用的框架。

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

【问题讨论】:

    标签: java desktop-application


    【解决方案1】:

    你需要:

    1. 一个网络框架。由于您有 Swing 背景,JSF 2 将是您最好的选择(当然,一切都会很痛苦,但 JSF 会让您快速上手,并帮助您避免最悲惨的错误)。此外,将业务 pojo 包装到 Web gui 中是 JSF 的主要用例,也是最大的焦点。

    2. “胶水框架”。 Web 应用程序与桌面应用程序有很大不同的是,您不能自己创建视图组件——它们必须在浏览器请求页面时创建。所以你必须找到一种方法来创建视图对象,并将所有的引用传递给代表逻辑的 pojo,其中一些可能有非常不同的生命周期(这在桌面上不是问题,但在 web 上你必须区分 pojo与整个应用程序、单个用户会话、单个请求一起存在,等等)。

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

    • 春天。它不像你的东西那么复杂;你只需要学习一些基本的东西。
    • 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)。上述大多数技术都支持不同类型的配置。

    【讨论】:

    • 依赖注入到底是什么意思?
    • 啊啊啊。这个问题,微妙地说,太宽泛了。我会尝试稍微修改一下答案,但如果你想理解它,你将不得不阅读更多关于 DI 的内容(如果你只是想使用它 - 不要打扰)。
    • @fdreger 你还建议避免使用 Primefaces 吗?
    • @Sarz 六年后,情况“有点”不同。但我仍然坚信在您的第一个 JSF 项目中使用 Primefaces 是个坏主意。
    【解决方案2】:

    您绝对应该使用框架,否则您迟早会编写自己的框架。

    如果您使用maven,那么只需输入mvn archetype:generate 即可为您提供大量可供选择的框架,它会为您设置所有的脚手架,因此您可以只使用一些框架,直到找到适合您的。

    Spring 有很好的文档并且非常容易上手。不要被文档的页面推迟!您可以使用JPA 将内容存储在数据库中。您应该(理论上)能够注释您现有的 POJO 以表示主键等等,它应该可以正常工作。如果这样可以让生活更轻松,您还可以在 Spring 中使用 JSP。

    【讨论】:

      【解决方案3】:

      ...我是一堆 POJO,它们与一个类进行通信,该类现在使用一个平面文件作为“数据库”,当然,在生产中,我会使用一个合法的数据库并只更改那个班级。这是一个好主意吗?我可以从 POJO 转到 Web 应用吗?

      合格是的。如果 pojo 是理智的,你不应该有很多问题。很多人使用hiberbate。

      我应该使用框架吗?我想尽快写出这个应用程序,看到所有的业务逻辑都在那里,我只需要包装它以便它可用,所以,我不想花大量时间学习,比如 Spring( AFAIK 是巨大的),但是,我也不想在我的应用程序中不断地重新发明轮子。我总是可以只使用 JSP 和 scriptlet...

      大概吧。 spring 很大,但 grails 或 roo 之类的东西可以提供帮助。

      如果您想拥有一个响应式 Web 应用程序,则需要使用某种富客户端 (AJAX)。这可能需要很多代码在客户端上运行。这意味着要编写大量 javascript 或使用 gwt。这将是一种痛苦。仅仅“包装它”可能不会那么容易。如果你写了一个 Swing 应用程序,那么基本上该代码将需要在客户端上运行。

      如果您对上述内容表示同意,您建议使用什么框架?请注意,我想要一个可以在 3-4 周的学习后开始使用的框架。

      我喜欢 groovy 和 grails - grails 使用 spring-mvc、spring、hibernate。但也有 roo、play 等。

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

      将在服务器上运行的代码可能大部分都可以单独使用。必须在客户端上运行的代码需要用 javascript 重写,或者您可以通过使用 gwt 从该代码中获得一些重用,

      【讨论】:

        【解决方案4】:

        Play 框架做得很好。我强烈推荐它。与 EJB 应用程序和 Tomcat/Servlet/Spring 应用程序一起工作后,感觉呼吸新鲜空气。框架安装后,您将在几秒钟内获得一个工作应用程序。让我想起 Ruby on Rails 或具有 Java 类型安全性的 Node.js。

        比以前的 Java Web 应用框架更快的上手、更快的开发周期和更清晰的配置模型。

        http://www.playframework.com/

        【讨论】:

          猜你喜欢
          • 2017-06-03
          • 1970-01-01
          • 1970-01-01
          • 2011-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多