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

Dha*_*dya 3 java desktop-application

我将编写我的第一个基于Java的Web应用程序,而我却迷失了如何开始。

首先,我希望一个Web应用程序和一个桌面应用程序具有几乎相同的功能,而又没有将Web浏览器嵌入到桌面应用程序中的顽强想法,因为这不允许在不影响网络的情况下轻松地对桌面进行更改应用,反之亦然。

现在,这里是我的问题。

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

  • 我应该使用框架吗?我希望很快就能编写出这个应用程序,因为看到了所有的商务逻辑,我只需要包装它以便其可用,所以,我不想花太多时间学习,比如说Spring( (AFAIK巨大)),但是,我也不想在整个应用程序中不断重复开发轮子。我总是可以只使用JSP和scriptlet ...

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

  • 我必须从头开始编写的POJO吗?它们的LOC超过30k,所以,如果那样,我会犹豫。

fdr*_*ger 5

你会需要:

  1. 网络框架。由于您具有Swing背景,因此JSF 2将是您最好的选择(当然,一切都会很痛苦,但是JSF将使您起床并快速上手,并将帮助您避免最悲惨的错误)。另外,将业务Pojos打包到Web GUI中是JSF的主要用例,也是最大的关注点。

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

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

  • 弹簧。它不像您那么复杂。您只需要学习一些基本知识。
  • EJB。您将需要一个真实的应用程序服务器,例如Glassfish或JBoss
  • 裸JSF对依赖项注入有很好的支持,唯一的缺点是缺乏自动事务管理。

如果我能担任您的职务,那么我将使用裸JSF 2.0-这样,您只需学习一种新技术。首先,请尽量避免使用PrimeFaces之类的库-它们通常比宣传的要差。

编辑-和附录

或-什么是“依赖注入”(经过简化)

当请求到Web应用程序时,新任务从新线程开始(嗯,线程可能被回收了,但这并不重要)。

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

  • 您可以安排应用程序,以便可以通过某些静态字段使用资源。它们本身可以是单例,也可以通过单例定位器获取。这倾向于工作,但已过时(难以测试,难以重构,难以重用,生命周期在应用程序中很难编码)。实际的代码如下所示:

     public void doSomething() {
         Customer Service cs = AppManager.getInstance().getCustomerService();
         System.out.println(cs.getVersion());
     }
    
    Run Code Online (Sandbox Code Playgroud)

  • 如果您需要集群和会话管理,则可以构建一种特殊的代理,该代理可以知道并提供任何种类的所需对象。每种类型的对象都将以不同的名称注册为工厂。这也可以工作,并且在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());
     }
    
    Run Code Online (Sandbox Code Playgroud)

  • 最后一种方法是最好的。由于最初的对象不是由您而是由服务器创建的,而是在http请求到达后由服务器创建的(详细信息取决于您选择的技术,但是您的入口点可能是JSF托管的bean或某种动作控制器),因此您可以发布您需要的参考,并让服务器照顾您。这称为“依赖注入”。您的行为就像启动代码之前就已经做好了一切。Spring,EJB容器,CDI或JSF负责其余的工作。代码看起来像这样(只是一个例子):

    @EJB
    CustomerService cs;

public void doSomething() {
     System.out.println(cs.getVersion());
}
Run Code Online (Sandbox Code Playgroud)

Run Code Online (Sandbox Code Playgroud)

注意:

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