Java,从桌面应用程序转移到Web应用程序

时间:2011-06-01 23:07:03

标签: java desktop-application

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

首先,我想要一个Web应用程序和一个桌面应用程序完全相同的事情,没有将网络浏览器嵌入桌面应用程序的愚蠢想法,因为这不允许轻松地更改桌面影响网络应用程序,反之亦然。

现在,我的问题在这里。

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

  • 我应该使用框架吗?我希望很快就能写出这个应用程序,看到所有的商务逻辑都在那里,我只需要将它包装起来以便它可用,所以,我不想花太多时间学习,比如,Spring(哪个AFAIK很大),但是,我不想继续在我的应用程序中重新发明轮子。我总是可以使用JSP和scriptlet ...

  • 如果您对上述内容表示肯定,您建议使用哪些框架?请注意,我想要一个框架,我可以在3-4周的学习中开始使用。

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

4 个答案:

答案 0 :(得分:4)

您将需要:

  1. 一个Web框架。由于你有Swing背景,JSF 2将是你最好的选择(当然,一切都会很痛苦,但JSF会让你快速上手,并帮助你避免最悲惨的错误)。此外,将商业pojos包装成web guis是JSF的主要用例,也是最受关注的焦点。

  2. “胶水框架”。与桌面应用程序相比,Web应用程序的另一个不同之处在于您无法自己创建视图组件 - 它们必须在浏览器请求页面时创建。所以你必须找到一种方法来创建视图对象并提供对代表逻辑的pojos的所有引用,其中一些可能具有非常不同的生命周期(这在桌面上不是问题,但在Web上你必须区分pojos与整个应用程序一起生活,以及单个用户会话,以及单个请求等等。

  3. “胶水框架”还可以提供管理交易的额外好处。你有三个选择:

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

答案 1 :(得分:2)

你绝对应该使用一个框架,否则你最终会自己编写自己的框架。

如果您使用maven,那么只需输入mvn archetype:generate就会为您提供一个庞大的框架列表供您选择,它会为您设置所有脚手架,这样您就可以玩一些框架,直到找到适合你的那个。

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

答案 2 :(得分:1)

  
    

...我是一堆POJO,他们与单个类进行通信,现在,使用平面文件作为“数据库”,当然,在生产中,我会使用合法的数据库,只需更改单个类。这是一个好主意吗?我能从POJO转到网络应用程序吗?

  

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

  
    

我应该使用框架吗?我希望很快就能写出这个应用程序,看到所有的商务逻辑都在那里,我只需要将它包装起来以便它可用,所以,我不想花太多时间学习,比如,Spring(哪个AFAIK很大),但是,我不想继续在我的应用程序中重新发明轮子。我总是可以使用JSP和scriptlet ......

  

可能。春天是巨大的,但像grails或roo这样的东西可以帮助。

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

  
    

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

  

我喜欢groovy和grails - grails使用spring-mvc,spring,hibernate。但是有roo,play和其他。

  
    

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

  

将在服务器上运行的代码可能大部分都是孤立的。必须在javascript中重写必须在客户端上运行的代码,或者你可以通过使用gwt从代码中重用一些代码,

答案 3 :(得分:0)

Play Framework正在做很棒的事情。我会高度推荐它。在使用EJB应用程序和Tomcat / Servlet / Spring应用程序之后,它呼吸了新鲜空气。在框架安装之后,您将在几秒钟内获得一个可用的应用程序让我想起Ruby on Rails或具有Java类型安全性的Node.js。

与以前的Java Web应用程序框架相比,入门更快,开发周期更快,配置模型更清晰。

http://www.playframework.com/