我正在尝试为Java应用程序创建Web用户界面。用户界面非常简单,包括一个页面,其中包含一个供用户提出查询的表单,以及一个结果页面 - 有点像Google的搜索引擎或Ask.com。
我对Java的基本API非常熟悉,但是我没有太多使用Java进行Web环境的经验(尽管我使用过ASP.NET),所以我正在寻找一些建议:< / p>
我应该使用什么 Web应用程序服务器?请注意,我的界面非常轻,我只想要一些快速,易于启动/重置的东西/停止并(重新)部署我的应用程序。此外,我需要它在多个环境上工作,即GNU / Linux,Mac OS X和Windows XP / Vista。另外,我正在使用ant
和Eclipse
,因此如果我可以轻松地为服务器管理添加一些ant
目标和/或使用IDE管理服务器,那将会很棒。我查看过 Tomcat 和 Jetty ,后者看起来非常简单,易于安装和部署。这是理想的,因为GUI仅用于演示目的,我可能需要将其部署在不同的计算机中。但是,Tomcat已经存在了很长时间,而且似乎更成熟。
对于网页,Java Server Pages看起来非常合适,因为它们看起来非常简单,我正在努力完成(处理表单并输出结果) ,但我全都听取了建议。
Engine
,它有一个方法run(String)
,它将处理用户的输入和返回显示结果。此类是应用程序的核心。现在,我想实例化这个类一次,因为它需要很多的内存,并且需要很长时间才能启动,所以我想在应用程序/服务器启动时创建它,并为应用程序的整个范围存储该引用(即,直到我停止服务器)。然后,对于每个用户请求,我只需调用run
实例的Engine
方法,并显示其结果。 如何用Java实现? 答案 0 :(得分:10)
在这一点上进行扩展。在实现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)
编辑:到目前为止,我已经决定了以下内容:
<强> 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执行视图层,原因如下(首先从主页上阅读短信息):
答案 4 :(得分:1)
Jetty是一个非常轻量级的容器,非常适合您的开发场景。
您可能希望查看Wicket的渲染方面;与直接用户界面相比,你似乎更喜欢做类似代码的任务。
您描述的模式是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)