Java应用程序的Web用户界面

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

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

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

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

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

  1. App Server。 您认为Tomcat在运行时占用空间,学习量或……方面都很重要? 我倾向于选择与IDE完全集成的东西。 所以Eclipse + Tomcat或者Apache Geronimo,也许在它的WebSphere Community Edition中就可以了。 从我所看到的,这些足以满足您的需求,学习曲线非常易于管理。
  2. 是JSPs。 您可能会发现您的演示文稿需求变得更加复杂。 转到JSF的额外努力可能会有所回报 – 很好的小部件,例如日期选择器。
  3. 在您的处理过程中,您将拥有一个servlet(如果您使用的是JSF,则为动作类),该类可以在启动时初始化Engine类型的成员变量,然后用于每个请求。 要记住的是,许多用户会同时点击该servlet,从而触及该引擎。 您的引擎是否可以安全地同时使用多个线程?

在这一点上进行扩展。 在实现JSP时,有两种模型被称为模型1和模型2(具有一些创造性)。请参阅此解释 。

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

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

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

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

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

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

form.jsp

 

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中

 
The result was: ${result.text}

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

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

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

  2. 你可能想看看Wicket的渲染方面; 你似乎更喜欢做类似代码的任务,而不是直接的UI。

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

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

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

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