15

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

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

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

  • 至于网页,Java Server Pages 看起来很合适,因为它们对于我想要完成的工作(处理表单并输出结果)来说似乎足够简单,但我很乐意听取建议。

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

4

7 回答 7

10
  1. 应用服务器。您认为 Tomcat 在运行时占用空间、学习量或...方面很重?我倾向于选择与 IDE 集成良好的东西。所以 Eclipse + Tomcat 或 Apache Geronimo,也许在它的WebSphere Community Edition伪装下可以完成这项工作。从我所见,这些足以满足您的需求,并且学习曲线非常易于管理。
  2. 是的 JSP。您可能会发现您的演示需求变得有点复杂。转到 JSF 的额外努力可能还没有回报 - 不错的小部件,例如日期选择器。
  3. 在您的处理中,您将拥有一个 servlet(如果您使用 JSF,则为一个动作类),该类可以具有一个 Engine 类型的成员变量,该变量在启动时初始化,然后用于每个请求。要记住的是,许多用户将同时访问该 servlet,因此也访问该引擎。您的引擎是否可以安全地同时从多个线程中使用?

在这一点上展开。在实现 JSP 时,有两个模型(具有一定的创造性)称为模型 1 和模型 2。请参阅此说明

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

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

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

private static MyWorker s_worker = new MyWorker();
public static synchronized getWorker() {
       return s_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();
} 
于 2009-08-16T05:17:13.087 回答
3

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

您还需要学习基本的 HTML,否则您将需要学习 JavaServer Faces 或类似的东西,这是一个相当大的内容,以创建您需要的提交按钮以及 HTML 表单中的其他条目。

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

于 2009-08-16T09:42:15.867 回答
3

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

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

表单.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() ?
  }    
}

结果.jsp

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

你觉得这个解决方案怎么样?对于来自 J2SE 背景的人来说可能不明显的任何问题?我还写了一些我在代码中的疑问作为注释。谢谢。

于 2009-08-17T23:57:38.360 回答
1

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

  • 由于 Wicket 将视图层分离并以干净的方式工作在 MVC 的模型层中,因此可以很容易地解释,视图与应用程序的其余部分完全分离,并且使用 Wicket 的IModel 接口将数据从控制器层链接到视图以可靠的方式分层。因此,您的控制器层可能是单个应用程序单例,只要您以这种方式使用它。
  • Wicket 代码非常易于维护,而且您的 Web 应用程序的扩展功能也可以非常轻松地完成,因为它是 OOP 框架,而不是与其他类型的表达代码的标记混合的标记。
于 2009-08-16T07:59:24.960 回答
1
  1. Jetty 是一个非常轻量级的容器,非常适合您的开发场景。

  2. 您可能希望查看Wicket的渲染方面;与直接 UI 相比,您似乎更愿意执行类似代码的任务。

  3. 您描述的模式是单例模式。看一下java 中单例的谷歌结果。

于 2009-08-16T13:39:25.893 回答
0

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

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

于 2009-08-16T05:04:41.103 回答
0
  1. 应用服务器:tomcat
  2. 网页:jsp
  3. 您需要一个单例类或具有静态方法的类。警告:当心比赛条件。对于那些涉及更新/修改操作的方法,您可能需要使用同步关键字。
于 2009-08-16T13:29:15.543 回答