第1页:ToDoTasks: Web激活的Java应用程序 第2页:ToDoTasks: Web激活的Java应用程序
现在需要添加下部构造运行它。我们使用Jetty,这是个轻量级但很灵活的HTTP服务器和servlet容器。有很多方法设置Jetty;显然最简单的是仅仅设置servlet的支持功能。在Controller的构造器上,我们添加了Jetty服务器的初始化代码:首先创建一个HttpServer,然后告诉它侦听8000端口,然后获得服务器和我们能够添加处理机的所有HttpContext。
HttpServer server=new HttpServer();
server.addListener(":8000");
HttpContext context=server.getContext("/");
然后创建一个ServletHandler,它能将来自URL的请求映射到指定的servlet。接下来,我们将servlet添加到处理机上,再将此处理机添加到内容(context)上。
ServletHandler handler=new ServletHandler();
handler.addServlet("Report","/report",
"com.builder.uk.todotasks.servlets.Report");
context.addHandler(handler);
addServlet方法给servlet命名,包含了servlet被调用的路径和servlet的类名。路径与我们用到的getContext的路径是相关的。这样,当我们访问http://localhost:8000/report时,servlet将被调用。如果我们获得内容“/fred/”,而不是“/”,servlet将会出现在http://localhost:8000/fred/report上。
ServletContext sc=handler.getServletContext();
sc.setAttribute("tasks",tasks);
打开服务器。
try {
server.start();
} catch (Exception ex) { ex.printStackTrace(); }
为了建立一个示例,我们需要org.mortbay.jetty.jar, javax.servlet.jar和commons-logging.jar这几个Jetty库,他们都可以在网站Jetty web site 上得到。运行这一版本,将得到在8000端口运行的Web服务器,然后在http://localhost:8000/repor给出我们的报告。
但是,如果到另外一个页面,本地服务器将产生错误,并且如果我们添加图像或其他资源则需要添加另外的处理机,并且所有的servlet都很难编码。除非你的要求很简单,不然它不是很灵活,很快就失去控制了。这里有更好的方法:Web-app打包。关于web-app的办法是将所要供应的所有文件打包到一个路径下。为了达到此目的,我们将所有web-app都放在webapp路径下。在此路径下有个WEB-INF文件夹,里面保留有配置文件并且有一个web.xml的文件,它用于配置服务器。这里给出了web.xml文件,它用于配置我们的servlet:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>ToDoTasks</display-name>
<servlet>
<servlet-name>Report</servlet-name>
<servlet-class>com.builder.uk.todotasks.servlets.Report</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Report</servlet-name>
<url-pattern>/report</url-pattern>
</servlet-mapping>
</web-app>
<servlet>部分用于定义servlet的名字和与此名字相关联的servlet的类名。<servlet-mapping>部分将以命名的servlet与url模式相关联。这些部分与我们上面提到的handler.addHandler是等价的。为了初始化web程序,我们替换了HTTPServer,并且采用下面的代码添加了一个处理机:
Server server=new Server();
server.addListener(":8000");
WebApplicationContext context=server.addWebApplication("/","./webapp/");
context.setAttribute("tasks",tasks);
打开一个普通Jetty服务器,告诉它侦听8000端口。然后创建带根符号“/”的WebApplicationContext告诉服务器它能在webapp路径下找到web程序。我们直接在WebApplicationContext下设置“tasks”参考,在servlet下通过Tasks实例。
现在有个Web程序支持JSP,所以我们需要添加库:Jasper JSP编译器和运行时,即jasper-compiler.jar和jasper-runtime.jar,然后还需要ant.jar和commons-el.jar;这些在Jetty中都能找到。它们各就各位后,重新运行ToDoTasks,发现我们能到达http://localhost:8000/report页面并且获得报告内容,与前面运行的结果没有区别。你可能对这个没什么印象;我们替换了启动代码中的几行,添加了XML文件。这是因为我们很少用到Web程序。
回到webapp路径下,我们可以添加一个index.html文件指导人们获得报告。这个文件就位以后,我们可以浏览http://localhost:8000/并且看到一个没有任何代码的欢迎页面。也可以加入JSP页面,虽然它经过了我们的配置,但是你可以在示例中使用基本点 JSP;另外,你可以在webapp路径下找到与JSP一样的report servlet的一个简单版本jspreport.jsp。它能提供webapp路径下与WEB-INF路径分开的任何东西;人们不需要清楚了解其配置。当你构建一个应用程序时,记住与Jar文件一起取得webapp路径,你可以将webapp路径存档到.WAR文件中,并且在addWebApplication调用中指定.WAR文件而不是指定路径,像这样:
WebApplicationContext context=server.addWebApplication("/","./webapp.war");
为了创建WAR文件,可以使用标准jar工具,war文件是以.war为扩展名的jar文件。在本工程中,我们在项目目录下,运行:
jar cvf webapp. war -C webapp .
创建war文件。“-C”标记在开始存档之间改变路径到webapp;如果只运行“ar cvf webapp.war webapp”命令,将会在webapp文件夹中的war文件中创建包含所有内容的档案文件,并且在加载时不能正确工作。
现在对嵌入了web服务器和web-app的ToDoTasks应用程序有些感觉了吧,但是web接口还不稳健,还有一些没有整理没有过滤的报告。在下文中,我们将对此进行阐述。
可以下载源码指南 。
DJ Walker-Morgan 是个有顾问资格的开发员,专门研究 Java 和用户对用户的通讯和会议。
责任编辑:张琎
查看本文的国际来源