更新Web应用
在开发期间,经常需要对Web应用进行修改。在修改servlet之后,必须:
1.重新编译servlet类。
2.更新服务器上的应用。
3.重新在客户端装载URL。
更新JSP页面时,无需重新编译或重新装载应用,因为Tomcat会自动完成这些事情。
为了尝试这一特征,修改Hello应用的servlet版本。例如,你可以将GreetingServlet返回的问候信息修改为:
<h2>Hi, my name is Duke. What's yours?</h2>
更新文件的过程为:
1. 编辑在源码目录<JWSDP_HOME>/docs/tutorial/examples/web/hello1/src中的GreetingServlet.java文件。
2. 运行ant build任务。该任务将servlet重新编译到build目录中。
更新服务器中的应用这一过程取决于你是否使用Ant
install任务来安装或者使用Ant deploy任务来部署这个应用。
重新装载Web应用
如果你已经使用Ant install命令安装了应用,就可以使用Ant
reload任务来更新服务器中的应用:
<reload url="url" path="mywebapp"
username="username" password="password" />
示例build文件包含一个 Ant remove目标,该目标调用
Ant remove任务。从而更新服务器中的Hello1应用,执行ant reload。为了观察经过更新的应用,重新装载客户端的Hello1的URL。注意,reload任务只改变Java类,而不会改变Web.xml文件。为了重新装载web.xml,需要将应用删除
(参见移除Web应用)并重新安装。
在浏览器上你可以看到如图4-3所示的屏幕:
图4-3 新的问候信息
为了在该实例的JSP版本上尝试这一特性,首先建立和部署JSP版的Hello应用:
1. 在终端窗口中,转到
<JWSDP_HOME>/docs/tutorial/examples/web/hello2.
2. 运行ant build。build目标将产生所有必需的编译并且拷贝文件到
<JWSDP_HOME>/docs/tutorial/examples/web/hello2/build
目录。
3. 运行ant install。install目标将build目录拷贝到<JWSDP_HOME>/webappsbuild并通知Tomcat有新的应用。
修改某一个JSP文件。然后运行ant
build将经过修改的文件拷贝到docs/tutorial/examples/web/hello2/build。记住,这里无需重新装载服务器中的应用,因为当某个JSP文件被修改时,Tomcat会自动检测到这一情况。要查看经过修改的应用,
需重新装载客户端的Hello2的URL。
重新部署Web应用
如果已经通过使用Ant deploy任务部署了应用,就可以通过接连使用Ant
undeploy任务(见解除部署Web应用)和Ant deploy任务来更新这个应用。
移除Web应用
如果想从服务中移除已安装的Web应用,可以调用
Ant remove任务:
<remove url="url" path="mywebapp"
username="username" password="password" />
示例build文件包含一个 Ant remove目标,该目标调用
Ant remove任务。
解除部署Web应用
如果想移除一个已部署的Web应用,可以使用Ant
undeploy任务:
<undeploy url="url" path="mywebapp"
username="username" password="password" />
一些实例build文件包含一个Ant undeploy目标,该目标调用Ant
undeploy任务。
Web应用的国际化和本地化
所谓的国际化是指使得应用能够支持各种语言和数据格式的过程。所谓本地化,是指使得一个国际化的应用能够支持某种特定的或者本地的语言的过程。虽然所有客户端用户接口都应该被国际化和本地化,但是国际化和本地化对于Web应用来说尤其重要,因为Web本身就是无所不及的。如果想要很好地鸟瞰一下国际化与本地化问题,参见
http://java.sun.com/docs/books/tutorial/i18n/index.html
有两种方法可以用于对Web应用进行国际化:
· 在每个目标位置中提供一个JSP页面,并且使用一个控制器servlet来发送请求到适当的页面上(取决于被请求的位置)。如果需要对一个页面或者一个完整的Web应用的数据进行国际化,这种方法比较有用。
· 将页面上所有的本地敏感的数据 (例如错误信息,串字符或按钮标签) 分离到资源束内,然后访问这些数据,来获取响应的翻译过来的信息并将其插入到页面当中。这样一来,就不是在代码中直接创建字符串,而是创建一个包含了翻译过来的信息的资源束,然后使用相应的关键字从该资源束中读出翻译过来的信息。资源束可以由一个文本文件(属性资源束)或一个包含了映像的类(列表资源束)来支持。
在下面的关于Web技术的几章中,Duke's
Bookstore实例被分别国际化和本地化成英语和西班牙语。关键字-值对包含在名为message.BookMessage_*.class的列表资源束。为了了解在资源束中的关键字-值对是怎样的,请看在文件messages.BookMessages.java中添加的几行:
{"TitleCashier",
"Cashier"},
{"TitleBookDescription",
"Book Description"},
{"Visitor",
"You are visitor number "},
{"What",
"What We"re Reading"},
{"Talk",
" talks about how Web components can transform the
way
you develop applications
for the Web. This is a must read for
any self respecting
Web developer!"},
{"Start",
"Start Shopping"},
为了获得对应于某个给定用户的正确字符串,Web组件从请求中获取位置(由浏览器的语言首选项设定),为那个位置打开资源束,然后将该资源束作为会话属性保存:
ResourceBundle messages
= (ResourceBundle)session.
getAttribute("messages");
if (messages
== null) {
Locale
locale=request.getLocale();
messages
= ResourceBundle.getBundle("WebMessages",
locale);
session.setAttribute("messages",
messages);
}
Web组件从会话中获取资源束:
ResourceBundle messages
=
(ResourceBundle)session.getAttribute("messages");
然后用下面的语句查找与关键字TitleCashier相关的字符串:
messages.getString("TitleCashier");
上面对国际化Web应用的介绍非常简要。如果要了解更多该主题的相关信息,参见Java
BluePrints:
http://java.sun.com/blueprints
在Web应用中访问数据库
在一个Web应用的调用中维持的、供各Web组件共享的数据,是通过一个数据库来维护的。Web应用使用JDBC2.0API来访问关系数据库。想了解关于该API的信息,参见
http://java.sun.com/docs/books/tutorial/jdbc
实例
在第14、 15、16和17章讨论的实例都要求有一个数据库。对于当前版本,我们已经测试了使用PointBase
4.5作为数据库的例子,并且提供了一个Ant build文件来创建数据库表,然后填充该数据库。本节余下的部分将讨论如何:
· 安装并启动PointBase数据库服务器。
· 填充实例数据库表。
· 配置Web应用,使其可以引用数据源。
· 定义Tomcat上的数据源。
· 配置Tomcat,使其将引用映像到数据源。
安装并启动数据库服务器
可以通过以下网址下载PointBase4.5数据库的评估版本:
http://www.pointbase.com
确认选择了特定于平台(UNIX 或 Windows)的安装包。安装客户端和服务器组件。在下载并安装了PointBase之后,执行下列步骤:
1. 添加pb.home属性到build.properties文件, 该文件指向PointBase的安装目录。在Windows中,进入该文件的语法为:
pb.home=drive:\\<PB_HOME>
2. 将<PB_HOME>/lib/pbclient45.jar拷贝到<JWSDP_HOME>/common/lib,使得PointBase客户端库可以被示例应用使用。如果Tomcat正在运行,请重新启动,以便加载客户端库。
3. 在终端窗口内,转到 <pb_HOME>/tools/server。
4.启动PointBase服务器,对于UNIX,输入start_server,对于Windows,则输入startserver。
填充数据库
1.在终端窗口内,转到<JWSDP_HOME>/docs/tutorial/examples/web。
2.执行ant。缺省的Ant任务create-book-db使用PointBase控制台工具执行book.sql中的SQL语句。在处理结束时,可以见到如下输出:
[java] ID
[java] ----------
[java] 201
[java] 202
[java] 203
[java] 204
[java] 205
[java] 206
[java] 207
[java]
[java] 7 Rows Selected.
[java]
[java] SQL>
[java]
[java] COMMIT;
[java] OK
配置Web应用,使其可以引用数据源
为了在Web应用中访问数据库,必须在Web应用的部署描述文件中声明资源引用。资源引用声明了一个JNDI名、数据源的类型以及访问资源时使用的验证类型。
<resource-ref>
<res-ref-name>jdbc/BookDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
JNDI名用于在本指南实例中用到的数据库帮助类database.BookDB中创建一个数据源对象。Res-suth元素规定容器将管理对该数据库的登录。
定义Tomcat中的数据源
为了使用数据库,必须在Tomcat上创建数据源。数据源包含了关于驱动类和用于连接数据库的URL以及数据库的登录参数的方面的信息。为定义Tomcat中的数据源,
可以使用管理工具 ,步骤如下:
1.通过打开一个浏览器启动管理工具,URL如下:
http://localhost:8080/admin/index.jsp
2.使用在安装Java WSDP时指定的用户名和密码登录。
3.在Resources下选择Data Sources条目。
4.依次选择Available Actions Create New Data Source。
5.在JNDI Name字段输入pointbase。
6.在Data Source URL字段输入jdbc:pointbase:server://localhost/sample。
7.在JDBC Driver Class字段输入com.pointbase.jdbc.jdbcUniversalDriver。
8.在User Name和 Password字段输入public。
9.点击Save按钮。
10.点击Commit按钮。
配置Tomcat,将JNDI名映射到数据源
既然Web应用的部署描述文件中的资源引用声明使用一个JNDI名来引用数据源,那么就必须将JNDI名与一个数据源连接起来,方法是在Tomcat的配置中提供一个资源链接条目。下面就是在Web技术相关章节中讨论到的应用所使用的条目:
<Context path="/bookstore1"
docBase="../docs/tutorial/examples/web/bookstore1/build"
debug="0">
<ResourceLink name="jdbc/BookDB" global="pointbase"/>
</Context>
既然资源链接是安装Web应用和部署Web应用中描述的上下文条目的一个子条目,那么就可以像添加上下文条目一样将该条目添加到Tomcat配置文件中:通过将包含该条目的配置文件的文件名传递给config
Ant install任务的config属性,或者通过将包含该上下文条目的名为mywebapp.xml的配置文件拷贝到<JWSP_HOME>/webapps中。
如果你是使用Ant deploy任务来部署应用,那么就必须将包含了该上下文条目的名为context.xml的配置文件打包到WAR的META-INF目录内。
第14、15、 16和17章中讨论到的实例展示了怎样使用Ant deploy任务机制来部署应用。
更多的信息
要了解关于Web应用和Tomcat的更多信息,参见
· Java Servlet 2.3规范,其中有关于配置Web应用的详细信息。
· 随Java WSDP一起发布的关于Tomcat的参考文档,在<JWSDP_HOME>/docs/tomcat/index.html上。
|