Java应用程序的Web用户界面
我正在尝试为Java应用程序创建一个web用户界面。用户界面将非常简单,包括一个带有表单的页面,供用户提出查询,以及一个结果页面——有点像谷歌的搜索引擎或Ask.com 我非常熟悉Java的基本API,但我在Web环境中使用Java方面没有太多经验(尽管我使用过ASP.NET),因此我想寻求一些建议: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
- 我应该使用什么web应用程序服务器?请注意,我的界面非常轻巧,我只想要一些快速、易于启动/重置/停止和(重新)部署我的应用程序的东西。此外,我需要它在多个环境下工作,即GNU/Linux、Mac OS X和Windows XP/Vista。此外,我正在使用
和ant
,因此如果我可以轻松地添加一些Eclipse
目标来进行服务器管理,和/或使用IDE管理服务器,那就太好了。我研究了Tomcat和Jetty,后者似乎非常轻便,易于安装和部署。这很理想,因为GUI只是为了演示,我可能需要在不同的计算机上部署它。然而,Tomcat已经存在很长一段时间了,它似乎更成熟了ant
- 至于网页,Java服务器页面看起来很适合,因为它们对于我试图完成的任务(处理表单并输出结果)来说似乎足够简单,但我会全神贯注地听取建议
- 我还有另一个要求,这要求我解释应用程序的“基本”工作流:基本上,我有一个类
,它有一个方法引擎
,该方法将处理用户的输入并返回结果以供显示。这个类是应用程序的核心。现在,我只想实例化这个类一次,因为它需要大量的内存,启动需要很长时间,所以我想在应用程序/服务器启动时创建它,并在整个应用程序范围内存储该引用(即,直到我停止服务器)。然后,对于每个用户请求,我只需调用运行(字符串)
实例的Engine
方法,并显示其结果。如何在Java中实现这一点run
这是一个非常开放的问题,根据您的需求,有大量可能的答案。编写web应用程序的标准方法是使用JavaEE平台,这意味着业务逻辑的JSP、servlet和EJB。然而,有相当多的流行且有效的替代方案,如Spring、Seam、GWT,甚至还有更激进的替代方案,如JRuby on Rails。听起来您的需求非常简单,所以您可能希望使用一个简单的解决方案,如Jetty+Servlets+JSP 我假设您的引擎可以同时处理多个请求?如果没有,您可能希望找到一种将请求排队的方法,例如JMS
<% 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框架,而不是与其他表示代码的标记混合的标记
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>