Java应用程序的Web用户界面

时间:2009-08-16 04:53:00

标签: java jsp tomcat jetty application-server

我正在尝试为Java应用程序创建Web用户界面。用户界面非常简单,包括一个页面,其中包含一个供用户提出查询的表单,以及一个结果页面 - 有点像Google的搜索引擎或Ask.com。

我对Java的基本API非常熟悉,但是我没有太多使用Java进行Web环境的经验(尽管我使用过ASP.NET),所以我正在寻找一些建议:< / p>

  • 我应该使用什么 Web应用程序服务器请注意,我的界面非常轻,我只想要一些快速,易于启动/重置的东西/停止并(重新)部署我的应用程序。此外,我需要它在多个环境上工作,即GNU / Linux,Mac OS X和Windows XP / Vista。另外,我正在使用antEclipse,因此如果我可以轻松地为服务器管理添加一些ant目标和/或使用IDE管理服务器,那将会很棒。我查看过 Tomcat Jetty ,后者看起来非常简单,易于安装和部署。这是理想的,因为GUI仅用于演示目的,我可能需要将其部署在不同的计算机中。但是,Tomcat已经存在了很长时间,而且似乎更成熟。

  • 对于网页,Java Server Pages看起来非常合适,因为它们看起来非常简单,我正在努力完成(处理表单并输出结果) ,但我全都听取了建议。

  • 我还有另一个要求,这需要我解释应用程序的“基本”工作流程:基本上,我有一个类Engine,它有一个方法run(String),它将处理用户的输入和返回显示结果。此类是应用程序的核心。现在,我想实例化这个类一次,因为它需要很多的内存,并且需要很长时间才能启动,所以我想在应用程序/服务器启动时创建它,并为应用程序的整个范围存储该引用(即,直到我停止服务器)。然后,对于每个用户请求,我只需调用run实例的Engine方法,并显示其结果。 如何用Java实现?

7 个答案:

答案 0 :(得分:10)

  1. App Server。您认为Tomcat在运行时占用空间,学习量或......方面都很重要?我倾向于选择与IDE完全集成的东西。所以Eclipse + Tomcat或者Apache Geronimo,也许是它的WebSphere Community Edition伪装就可以了。从我所看到的,这些足以满足你的需求,学习曲线非常易于管理。
  2. 是JSP。您可能会发现您的演示文稿需求变得更加复杂。进入JSF的额外努力可能会得到回报 - 像日期选择器这样的小工具。
  3. 在您的处理过程中,您将拥有一个servlet(如果您使用的是JSF,则为动作类),该类可以在启动时初始化Engine类型的成员变量,然后用于每个请求。要记住的是,许多用户将同时击中该servlet,从而击中该引擎。您的引擎是否可以安全地同时使用多个线程?
  4. 在这一点上进行扩展。在实现JSP时,有两种模型称为模型1和模型2(具有一些创造性)。请参阅this explanation

    在模型1的情况下,您倾向于将代码直接放入JSP中,它扮演控制器角色。 Persoanlly,即使在处理小型,快速开发的应用程序时,我也不是这样。我总是使用Model 2.但是如果你选择的话,你可以把一些Java放到你的JSP中。

    <%  MyWorker theWorker = MyWorkerFactory.getWorker();
        // theWorker.work();
    %>
    

    我赞成拥有这样的工厂,这样你就可以控制工人的创造。工厂会有类似的东西(举一个非常简单的例子)

    private static MyWorker s_worker = new MyWorker();
    public static synchronized getWorker() {
           return s_worker;
    }
    

    或者,您可以在首次调用该方法时创建worker。

    在模型2的情况下,你自然会有一个servlet,你要在其中放入一些代码,所以你可以拥有

    private MyWorker m_worker = MyWorkerFactory.getWorker();
    

    这将在加载servlet时初始化。无需担心将其设置为在启动时加载,您只需知道它将在第一个请求运行之前初始化。 更好的是,使用servlet的init()方法。保证在处理任何请求之前调用它,并且这是用于此类工作的servlet API架构位置。

    public class EngineServlet extends HttpServlet {
    
    private Engine engine;
    
    // init is the "official" place for initialisation
    public void init(ServletConfig config) throws ServletException {
         super.init(config);
         engine = new Engine();
    } 
    

答案 1 :(得分:3)

您需要学习的技术是Sun Java Servlet规范,因为这是所有非平凡的Java Web服务器实现的。这使您可以编写servlet,它可以完成服务器端所需的所有操作。然后,您可以针对任何与iDe配合良好的容器进行开发,并部署在生产中运行良好的任何其他容器上。

您还需要学习基本的HTML,因为您需要学习JavaServer Faces或类似的东西,这对于创建HTML表单中其他条目所需的提交按钮来说相当大。

要使您的Engine工作,您可以在web.xml中创建一个带有单例的servlet,然后可以调用它。绝对肯定它是线程安全的,否则你会有很多痛苦。对于初学者,您可以声明调用的servlet是同步的,以确保最多一次run()调用在任何时候都是活动的。

答案 2 :(得分:3)

编辑:到目前为止,我已经决定了以下内容:

  • Web应用程序服务器: Jetty ;
  • 视图的
  • Java Server Pages ;
  • 根据@djna的建议,我读了几篇关于 Model 2 的文章,我想出了这个解决方案(我还没有测试过,因为我需要在进入界面之前完成我的应用程序):

<强> form.jsp

<form action="/servlet/EngineServlet" method="GET">
  <input type="text" name="text" />
</form>

<强> EngineServlet.java

public class EngineServlet extends HttpServlet {
  private Engine engine = new Engine(); 
  // does this make sure engine only gets instantiated one time in the entire lifespan of the web application; from what I've read from the servlet lifecycle, it seems like it, but I'd like to hear opinions

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response) {
    String text = request.getParameter("text");
    ResultBean result = engine.run(text);
    request.setAttribute("result", result);
    RequestDispatcher dispatcher = request.getRequestDispatcher("result.jsp");
    dispatcher.forward(request, response); 
    // what's the difference between forward, and request.sendRedirect() ?
  }    
}

<强> result.jsp中

<div>The result was: ${result.text}</div>

您如何看待这个解决方案?对于来自J2SE背景的人来说,这些问题可能并不明显吗?我还在代码中写了一些疑问,作为评论。感谢。

答案 3 :(得分:1)

假设这不是一个一次性的应用程序,将来不需要任何更新/维护,我建议您使用Apache Wicket执行视图层,原因如下(首先从主页上阅读短信息):

  • 由于Wicket以清晰的方式分离视图层并在MVC的模型层中工作,因此可以很容易地解释视图与应用程序的其余部分完全分离,并且Wicket的IModel interface用于链接数据从控制器层到视图层以可靠的方式。因此,只要您以这种方式使用它,您的控制器层就可以是单个应用程序单例。
  • Wicket代码非常易于维护,因为它是OOP框架而不是与其他表达代码的标记混合的标记,因此可以非常轻松地扩展Web应用程序的功能。

答案 4 :(得分:1)

  1. Jetty是一个非常轻量级的容器,非常适合您的开发场景。

  2. 您可能希望查看Wicket的渲染方面;与直接用户界面相比,你似乎更喜欢做类似代码的任务。

  3. 您描述的模式是Singleton模式。请查看singleton in java的Google搜索结果。

答案 5 :(得分:0)

这是一个非常开放的问题,根据您的要求,有大量可能的答案。编写Web应用程序的标准方法是使用Java EE平台,这意味着业务逻辑的JSP,servlet和EJB。但是,有很多流行和有效的替代品,如Spring,Seam,GWT,甚至更激进的替代品,如JRuby on Rails。听起来你的需求非常简单,所以你可能想要使用像Jetty + Servlets + JSP这样的简单解决方案。

我假设您的引擎可以同时处理多个请求?如果没有,您可能想要找出一种方法来排队请求,例如JMS。

答案 6 :(得分:0)

  1. app server:tomcat
  2. 网页:jsp
  3. 您需要一个使用静态方法的Singleton类或类。 注意事项:谨防竞争状况。对于涉及更新/修改操作的方法,您可能需要使用 synchronized 关键字。