Java应用程序的Web用户界面

Java应用程序的Web用户界面,java,jsp,tomcat,jetty,application-server,Java,Jsp,Tomcat,Jetty,Application Server,我正在尝试为Java应用程序创建一个web用户界面。用户界面将非常简单,包括一个带有表单的页面,供用户提出查询,以及一个结果页面——有点像谷歌的搜索引擎或Ask.com 我非常熟悉Java的基本API,但我在Web环境中使用Java方面没有太多经验(尽管我使用过ASP.NET),因此我想寻求一些建议: 我应该使用什么web应用程序服务器?请注意,我的界面非常轻巧,我只想要一些快速、易于启动/重置/停止和(重新)部署我的应用程序的东西。此外,我需要它在多个环境下工作,即GNU/Linux、Mac

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

我非常熟悉Java的基本API,但我在Web环境中使用Java方面没有太多经验(尽管我使用过ASP.NET),因此我想寻求一些建议:

  • 我应该使用什么web应用程序服务器?请注意,我的界面非常轻巧,我只想要一些快速、易于启动/重置/停止和(重新)部署我的应用程序的东西。此外,我需要它在多个环境下工作,即GNU/Linux、Mac OS X和Windows XP/Vista。此外,我正在使用
    ant
    Eclipse
    ,因此如果我可以轻松地添加一些
    ant
    目标来进行服务器管理,和/或使用IDE管理服务器,那就太好了。我研究了TomcatJetty,后者似乎非常轻便,易于安装和部署。这很理想,因为GUI只是为了演示,我可能需要在不同的计算机上部署它。然而,Tomcat已经存在很长一段时间了,它似乎更成熟了

  • 至于网页,Java服务器页面看起来很适合,因为它们对于我试图完成的任务(处理表单并输出结果)来说似乎足够简单,但我会全神贯注地听取建议

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


这是一个非常开放的问题,根据您的需求,有大量可能的答案。编写web应用程序的标准方法是使用JavaEE平台,这意味着业务逻辑的JSP、servlet和EJB。然而,有相当多的流行且有效的替代方案,如Spring、Seam、GWT,甚至还有更激进的替代方案,如JRuby on Rails。听起来您的需求非常简单,所以您可能希望使用一个简单的解决方案,如Jetty+Servlets+JSP

我假设您的引擎可以同时处理多个请求?如果没有,您可能希望找到一种将请求排队的方法,例如JMS

  • 应用服务器。您认为Tomcat在运行时占用空间、学习量或。。。?我倾向于选择与IDE集成良好的产品。因此,Eclipse+Tomcat或ApacheGeronimo(可能以它的名义)可以完成这项工作。据我所见,这些都足以满足您的需求,而且学习曲线非常容易管理
  • 是的,JSP。您可能会发现您的演示需求变得更加复杂。使用JSF所付出的额外努力可能会得到回报——比如日期选择器之类的漂亮小部件
  • 在处理过程中,您将拥有一个servlet(或者一个action类,如果您使用的是JSF),该类可以在启动时初始化Engine类型的成员变量,然后用于每个请求。需要记住的是,许多用户将同时访问该servlet,从而访问该引擎。同时从多个线程使用发动机是否安全 在这一点上展开。在实现JSP时,有两个模型被称为模型1和模型2(具有一定的创造性)。看

    在模型1中,您倾向于将代码直接放入JSP中,它以控制器角色运行。就个人而言,即使是在处理小型、快速开发的应用程序时,我也不这么认为。我总是使用模型2。然而,如果您选择,您可以将一些Java放入JSP中

    <%  MyWorker theWorker = MyWorkerFactory.getWorker();
        // theWorker.work();
    %>
    
    或者,您可以在第一次调用该方法时创建辅助对象

    在模型2中,您自然有一个servlet,您将在其中放入一些代码,因此您可以

    private MyWorker m_worker = MyWorkerFactory.getWorker();
    
    这将在加载servlet时初始化。无需担心将其设置为启动时加载,您只需知道它将在运行第一个请求之前进行初始化。 更好的方法是使用servlet的init()方法。它保证在处理任何请求之前被调用,并且是用于此类工作的ServletAPI体系结构

    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();
    } 
    

    假设这不是一个一次性应用程序,将来不需要任何类型的更新/维护,我建议您使用查看层,原因如下(请先阅读主页上的简短信息简介):

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

    您需要学习的技术是Sun Java Se
    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();
    } 
    
    <form action="/servlet/EngineServlet" method="GET">
      <input type="text" name="text" />
    </form>
    
    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() ?
      }    
    }
    
    <div>The result was: ${result.text}</div>