eclipse-项目打包与发行

更新时间:2024-05-28 19:56:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

项目打包与发行

当项目完成后接下来的就是打包发行了,应用程序(Application)项目和Eclipse插件项目(plugin)的打包是不同的,本章将分别介绍两者的打包方法,并给出实际的打包例子。

7.1 应用程序项目的打包与发行 7.1.1 简介

Java应用程序项目完成后是可以脱离Eclipse运行的,要运行程序先要打它打成一个JAR包,它打包的大部份方法和标准Java的AWT/SWING的打包方法一样,主要有以下几个要点

? MANIFEST.MF - 打包清单。它是打包的关键性文件,主要是设置执行入口类和支持库的路径,在运行Java应用程序时是要根据此文件中给出的信息来查找入口类和支持库。

? 支持包 -如果Java应用程序用到了一些Eclipse包,那么就必须将这些包也复制到程序运行目录,否则程序将无法运行。如swt组件支持包swt.jar,jface组件支持包jface.jar。这些包都要在MANIFEST.MF文件中设置好。

? 本地化文件 - 如果用到了SWT组件,则还需要将SWT的本地化文件

swt-win32-3063.dll(3063是版本号)复制到程序运行目录,否则程序将无法运行。 7.1.2 打包的具体操作步骤

本节将用前几章开发的SWT/JFace项目“myswt”的打包为例,来介绍打包应用程序项目的方法。

1、编辑清单MANIFEST.MF

(1)Eclipse提供了用于打包项目的“导出”向导,但本例运行此向导之前先需要创建一个MANIFEST.MF清单文件,其内容如下: Manifest-Version: 1.0

Main-Class: book.chapter_4.wizard_dialog.WizardDialog1 Class-Path: ./lib/swt.jar ./lib/jface.jar ./lib/runtime.jar 说明:

? Manifest-Version - 指定清单文件的版本号

? Main-Class - 指定程序运行的入口类。本例设为运行4.5.2节开发的向导式对话框。注意:类名后不要加class扩展名

? Class-Path - 指定支持库的路径。“.”指程序运行目录,即导出的JAR包所在目录。程序运行时依据Class-Path项的设置路径来查找支持库。每一个支持库之间用空格隔开。在这里jface.jar需要用到runtime.jar包,所以runtime.jar包也要加入到Class-Path中。

? 除了入口类的包名和类名之外,其他设置项都不分大小写,比如:Class-Path写成class-path或CLASS-PATH也可以,swt.jar写成SWT.JAR也行。

(2)将清单文件保存下来,建议放在myswt项目的根目录下。它的文件名可以任意取,本例取名为manifes.txt,Eclipse向导在打包时会自动的将manifes.txt的内容复制到JAR包的META-INF目录下的MANIFEST.MF文件中。 2、使用Eclipse“导出”向导来打包项目

(1)右键单击myswt项目的项目名,在弹出菜单中选择“导出”。在弹出的如下图7.1所示的对话框中,选择“JAR文件”,单击“下一步”。

图7.1 导出对话框

(2)如下图7.2所示,将右边不需要的文件都取消勾选。在“选择导出目标”项文本框中设置JAR包的输出路径和包名(可以任意取名)为“D:\\myswt_application\\myswt.jar”。接受其他的默认设置不变,单击“下一步”。

附注:左边虽然选择了src目录,但源文件并不会导出到包中,除非勾选了“导出Java源代码文件和资源”项。

图7.2 选择导入文件

(3)如下图7.3所示,接受默认设置不变,单击“下一步”。

图7.3 导出类的选项

(4)这一步较关键。如下图7.4所示,选择“从工作空间中使用现有清单”项,将创建的清单文件输入,也可以通过旁边的“浏览”按钮来选择清单文件。输入清单文件后,单击“完成”,Eclipse开始将项目打包。

图7.4 清单文件设置

经过以上四步后,在“D:\\myswt_application”路径下生成了一个名为“myswt.jar”的文件。myswt.jar是一个ZIP格式的压缩文件,可以用WinRAR或WinZip软件打开,也就是说用这两个软件也可以替代Eclipse向导来打包文件。如果用WinRAR来打包文件,则压缩格式要选择ZIP格式而非RAR格式,压缩率倒可以任意选。

用WinRAR打开myswt.jar文件后其内部的目录结构如下图7.5所示:

图7.5 myswt.jar文件的内部目录结构

在myswt.jar文件的内部目录META-INF中仅一个文件:MANIFEST.MF,它和以前创建的清单文件manifest.txt的内容是一样的,如下: Manifest-Version: 1.0

Class-Path: ./lib/swt.jar ./lib/jface.jar ./lib/runtime.jar Main-Class: book.chapter_4.wizard_dialog.WizardDialog1 3、复制Java应用程序的支持包及本地化文件

在MANIFEST.MF文件中的Class-Path项设置了三个包,从Eclipse的plugins目录中将此三个支持包复制到D:\\myswt_application\\lib目录,本地化文件swt-win32-3063.dll复制到D:\\myswt_application目录中。此三个文件在Eclipse中的路径为: plugins\\org.eclipse.swt.win32_3.0.1\\ws\\win32\\swt.jar plugins\\org.eclipse.jface_3.0.0\\jface.jar

plugins\\org.eclipse.core.runtime_3.0.1\\runtime.jar

plugins\\org.eclipse.swt.win32_3.0.1\\os\\win32\\x86\\swt-win32-3063.dll

复制完成后的目录结构如下图7.6所示:

图7.6 目录结构图

4、编写运行myswt.jar包的批处理程序“run.bat”

在myswt_application目录下创建一个批处理程序run.bat(名字任取,扩展名必须是bat),其内容仅一句语句,如下: javaw -jar myswt.jar

说明:

? javaw对应c:\\jdk\\jre\\bin\\javaw.exe文件,如果windows提示命令未发现,则需要将c:\\jdk\\jre\\bin路径加入到windows环境变量path中。

? 在运行程序的时候有一个讨厌的黑色命令行窗口,要去掉它,可以将run.bat内容更改如下:“start javaw -jar myswt.jar”,start是指调用了windows的“运行”命令。 ? 如果想将swt-win32-3063.dll也放在单独的目录中,如

“D:\\myswt_application\\native”目录,则需将run.bat内容更改为: start javaw -Djava.library.path=./native/ -jar myswt.jar 5、运行程序

双击run.bat文件,得到如下图7.7所示的程序界面。

图7.7 程序运行效果图 6、注意事项

本例只需要三个支持包,但你的程序也许会需要更多的支持包才能运行。如果你想一次到位,则可以将“Java构建路径”的“库”选项卡中所有引用的包都复制到lib目录中。如果你喜欢用到什么包才加入什么包,希望维持打包文件的简洁,则需要自己一步步的去试:如果缺少某支持包,运行程序时会输出的未找到类的错误信息,从信息中的包名可得知程序缺少哪一个支持包。比如“Exception in thread \org/eclipse/jface/wizard/IWizard”,从错误信息中很明显的就能知道程序缺少jface包 7.1.3 其他得到JAR包的方式

要得到JAR包除了以上所说的用Eclipse“导出”向导、用WinZip和WinRAR,另外还能用Java自带的命令行式打包软件jar.exe(位于c:\\jdk\\bin目录),其打包命令为: c:\\jdk\\bin\\jar cvfm myswt.jar

C:\\eclipse3.0.1\\eclipse\\workspace\\myswt\\manifest.txt -C C:\\eclipse3.0.1\\eclipse\\workspace\\myswt\\bin .

说明:

? c:\\jdk\\bin\\jar - 由于本书没有把c:\\jdk\\bin加入到windows环境变量path中,所以手工指定jar.exe的路径

? cvfm - jar.exe的参数,“c”创建新的jar包;“v”将调试信息打印在屏幕上;“f”指定生成的jar文件名;“m”使用清单文件。注意它们都是小写 ? myswt.jar - 打包后的JAR包名

? 在前面是把清单文件manifest.txt放在

C:\\eclipse3.0.1\\eclipse\\workspace\\myswt\\目录下。如果将它和批处理文件放在一个目录就不必指定长长的路径了。

? “-C 路径 . ”指将路径下(包括子目录)的所有文件打包,由于class文件是输出在项目的bin目录下,所以路径指定到项目的bin目录,注意三者之间是用空格隔开,并且最后一个字符是小数点。

这种方式的优点是没有Eclipse导出向导的操作那么麻烦,适合经常需要导出JAR包的情况。

7.1.4 使用第三方插件对项目打包

开源组织(http://sourceforge.net/)中有一款可将Eclipse支持包和项目编译文件一起打到一个包中的插件,叫“Fat Jar”,它的下载地址是“http://fjep.sourceforge.net/”,具体下载不再说明,安装步骤参阅第1章SWT Designer的安装。 Fat Jar的使用步骤如下:

(1)右键单击myswt项目的项目名,可见菜单中多了一项“Build Fat Jar”,如下图7.8所示,选择“Build Fat Jar”项。

图7.8 右键菜单

(2)在下图7.9所示的对话框中,“Jar-Name”项填入JAR包的输出路径。文件清单“Manifest”项不用填,默认会自动创建一个。“Main-Class”项填入程序的入口类。其他都接受默认值,单击“下一步”。

图7.9 输出配置

(3)如下图7.10所示,窗口中将myswt项目所用到的支持包都列了出来。我们仅勾选图中runtime.jar、swt.jar、jface.jar这三项即可,当然全选也并尝不可,只是最后得到的JAR包会更大一些,因为Fat Jar会将所有支持包合并在一个JAR包中。

图7.10 选择要打包的文件

单击图7.10的“完成”按钮后, JAR包myswt.jar将输出到D:\\myswt_applicationh目录中。和以前一样,要运行此JAR包需要一个批处理文件以及本地化文件swt-win32-3063.dll,唯一不同的是不再需要Eclipse支持包,其目录结构如下图7.11所示:

图7.11 目录结构

为什么不需要Eclipse支持包了呢?那是因为支持包已经在myswt.jar文件中了,从下图7.12可以看到swt.jar等都被拆散成目录,并包含在myswt.jar包中。

图7.12 myswt.jar的内部目录结构

其中META-INF目录的MANIFEST.MF文件内容如下,可以发现和以前不同的地方是:Class-Path项没有了。 Manifest-Version: 1.0

Created-By: Fat Jar Eclipse Plug-In

Main-Class: book.chapter_4.wizard_dialog.WizardDialog1 7.1.4 让用户电脑不必安装JRE环境

通常运行Java程序有个前提条件:用户电脑必须先安装JRE环境。虽然安装JRE环境非常简单,但毕竟多了一步,算是有一点点的瑕疵。这里给出一个不必让用户安装JRE环境的方法,其实现步骤如下:

(1)将原JDK中的“jre”目录复制到“D:\\myswt_application\\java1.4.2”目录下(java1.4.2也可换成其他名称)。

(2)将JDK和JRE从本机卸载掉,这样表示本机没有安装JAVA运行环境。 (3)修改批处理文件run.bat中的命令为“start java1.4.2\\jre\\bin\\javaw -jar myswt.jar”,仅仅是在javaw前加上了一个相对应路径。

双击run.bat即可在不安装JRE环境的电脑运行此Java应用程序。 7.1.5 更进一步的完善 1、抛弃批处理文件(*.bat)

用批处理文件运行程序似乎不够专业,虽然它足以完成运行任务。但习惯就象一种毒药一旦染上就很难摆脱它的影响,Windows统治下的人们早已经习惯运行扩展名是EXE的程序,用*.bat他们就会感觉别扭。

我们可以用一个叫JavaLauncher的免费小程序来代替批处理文件去运行Java程序。JavaLauncher的下载网址是:

http://www.rolemaker.dk/nonRoleMaker/javalauncher/marner_java_launcher.htm 下载下来的文件是一个名JavaLauncher.zip的压缩包,解压后的目录结构如下图7.13所示:

图7.13 JavaLauncher.zip目录结构 在上图的目录中

? source目录包含了JavaLauncher的源程序,是用C语言写的 ? changes.txt是新版的修改说明 ? launch.exe是主程序

? launcher.cfg是配置文件 ? readme.txt是一些说明和示例

我们只需要launch.exe、launcher.cfg两个文件,将这两个文件复制到打包文件所在的目录。launcher.cfg是一个仅三行内容的文本文件,将它修改如下: .

.\\java1.4.2\\jre\\bin\\javaw.exe -jar myswt.jar

? 第一行设置指向JAR包myswt.jar的目录,由于launch.exe和myswt.jar同在一个目录,所以用“.”即当前目录。

? 第二行设置指向jre\\bin\\javaw.exe的路径。在上一小节(7.1.4节)已将jre目录复制到了java1.4.2子目录中

配置好launcher.cfg后,双击launch.exe即可运行java应用程序。

如果仔佃研究eclipse的启动方式,发现eclipse和JavaLauncher的原理一样:eclipse.exe相当于launch.exe,startup.jar相当于myswt.jar。只不过eclipse.exe不象launch.exe要具有通用性,所以它没有*.cfg这样的配置文件,而是将启动信息固化在eclipse.exe中。 2、美化图标

launch.exe文件的图标太单调了,让我们给它换个好看点的。换程序的图标需要用到一个免费的软件:Resource Hacker,它有中文版,下载网址是: http://www.users.on.net/johnson/resourcehacker/ 用Resource Hacker来替换launch.exe的图标的步骤如下: (1)运行Resource Hacker,得到如下图7.14所示的窗口。

图7.14 Resource Hacker的主界面

(2)单击主菜单“文件→打开”,将launch.exe载入到程序中,结果如下图7.15所示。

图7.15 载入Lanunch.exe之后的界面

(3)如上图,选择左边的“图标→1→1030”,然后右键单击“1030”项,选择“替换资源?”。如下图7.16所示,在弹出窗口中单击“打开新图标文件”,选择一个满意的图标,然后单击“替换”按钮。

附注:图标文件可以是exe、dll、res、ico,该软件可以从exe、dll、res抽取出图标,本例选择的是java的一个图标文件JavaCup.ico。

图7.16 选择图标文件

(4)如下图7.17所示,选择“文件→另存为”,取名myswt.exe。

附注:按理说选择“保存”也是可以的,这时Resource Hacker会将老的launch.exe备份成launch_original.exe。但也许是刷新上有问题,用“保存”方式有时launch.exe无法显示出新图标,但有时又可以。

图7.17 保存修改

(5)最后的目录如下图7.18所示,可见myswt.exe(也就是launch.exe改了个名称)的图标换成了Java的图标。双击myswt.exe即可运行Java应用程序。

图7.18 最后的效果

3、最后的打包

发送给用户之前,通常要用WinZip或WinRAR将所有的文件全部打成一个压缩包,然后用户得到这个压缩包后,将其解压缩后即可运行程序,Eclipse软件就是这种方式。

另一种方式是用InstallShield、InstallAnyWhere这样的安装程序制作软件来创建一个单一的setup.exe文件,它具有向导式的安装界面,而且还可以往windows的程序栏插入菜单项,关于这些安装程序制作软件的具体使用请参阅相关书籍。

第9章 Eclipse的J2EE开发

Eclipse默认安装是没有J2EE开发支持的,它需要安装第三方插件,本章的主要介绍的J2EE开发插件是Lomboz,主要开发环境是Tomcat + Lomboz + Struts + Hibernate,这是当前比较流行的一种选择。其中Tomcat充当WEB服务器;Lomboz是J2EE开发的工具;Struts提供强大的MVC模式支持;Hibernate替代笨重的EJB来充当数据库的持久层。 以上所有的工具和软件包不仅流行、功能强大、而且是免费的,是J2EE开发典型搭配。本章将分三个层次来渐进式的展开讲解: ? Lomboz下的纯J2EE开发 ? 融合Struts的J2EE开发

? 融合Struts和Hibernate后的J2EE开发

由于篇幅有限,本章以开发环境的安装和配置为重点,并辅以一个典型而有深度的实例来演示具体的开发操作,最后给出一个扩展知识的资料索引。

本章和第8章一样也使用CVS来管理所有例程,在每一节的标题后会用括号显示这一节的版本号。本章具体的环境为:WindowsXP + JDK1.4.2_06 + Eclipse3.1M4 + cvsnt2.0.58d + Tomcat5.0.28 + Lomboz3.1.0 + Struts 1.2.4。 9.1 WEB环境的搭建(V0010) 9.1.1 下载CVS版本注意事项

由于V0010版,存在一些空目录,而这些空目录也是必须要的,否则项目会出错。这需要修改一个CVS的配置,如下图9.1所示,打开Eclipse的首选项→小组→CVS→将“修剪空目录”项取消勾选。

图9.1 修改CVS配置 9.1.2 Tomcat的下载与安装

这一节先搭建好Tomcat环境,Tomcat的下载安装和Eclipse、Lomboz都没有直接关系,它是完全独立的。 1、下载Tomcat

(1)用IE打开Tomcat的下载页面:http://jakarta.apache.org/tomcat/index.html,选择页面左边的链接“Binaries”,转到下图9.2所示的页面:

图9.2 Tomcat项目选择

(3)单击上图中标识的“Tomcat”项,出现如下图9.3所示的页面

图9.3 具体下载项

(4)下载上图9.3所示的“5.0.28.exe”项,下载后的文件名为:jakarta-tomcat-5.0.28.exe ? 注意:

? (1)不要下载Tomcat5.5.*版,因为那需要JDK5.0的支持;也不要下载4.1.*版,它的功能太弱了。因为不同版本之间的安装和配置都会有所不同,为了和本教程同步,一定要下载5.0.28版。

? (2)如果用FlashGet等多线程下载工具无法下载,则改用原始的IE右键菜单的“另存为…”项来下载。 2、安装Tomcat

安装Tomcat的过程比较简单,双击得到的下载文件:jakarta-tomcat-5.0.28.exe,开始安装。

(1)选择安装组件。接受默认的勾选即可,如下图9.4所示。

图9.4 选择组件

(2)选择Tomcat安装目录。也一样接受默认值,将安装到C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0目录下,如下图9.5所示:

图9.5 Tomcat的安装目录

(3)选择HTTP监听端口(Port),如下图9.6所示。默认端口是8080,如果8080端口已被你电脑上的其他软件所占用(如IIS、JBoss等),则可以另选择一个空闲的端口。最后,给Tomcat的超级管理员admin设为一个密码(本书设为123456)。

图9.6 设置端口和密码

(4)设置Tomcat使用的JVM,本书的默认值为“C:\\Program

Files\\Java\\j2re1.4.2_06”,如下图9.7所示。很多资料都指出,在安装JDK时要设置设置

classpath、JAVA_HOME、path等环境变量,但本书从第一章开始就从没有设置过这些环境变量,一样可以运行通畅,也许是新版的JDK1.4.2_06很好的解决了这些问题。从这一步也可以看到,Tomcat已经在安装时定位好了JVM的位置,不必再手工设置了。 设置好JVM后,单击“install”按钮,开始安装。

图9.7 定位JVM的位置

(5)安装完成之后,在Windows的“控制面板”→“管理工具”→“服务”窗口中,可以看到Tomcat已经注册为windows的一项服务,如下图9.8所示。请确定它是“手动”方式,这一点在开发时很重要,因为我们以后要通过Eclipse来启动Tomcat。

图9.8 windows“服务”窗口 3、启动Tomcat

虽然以后在开发时,是要通过Eclipse来启动Tomcat,但现在为了测试Tomcat是否安装成功,暂时先启动Tomcat。

(1)可以通过Windows的“开始”菜单→“Apache Tomcat5.0”组→“Configure Tomcat”项来运行Tomcat的配置界面(如下图9.10所示),这个界面包含了Tomcat的一些参数设置,这些设置一般都不用去改动它。直接“单击”按钮,即可启动Tomcat。

图9.10 Tomcat的配置界面

(2)在IE浏览器中输入“http://localhost:8080”或“http://127.0.0.1:8080”,其中8080为安装时设置的端口号。如果启动成功,则会出现如下图9.11所示的页面;反之,如果没有出现此页面,则表示启动未成功,这时你需要检查前面的安装步骤是否和本书的一致。

图9.11 验证Tomcat是否安装及启动成功

附注:在上图页面的左部有两个链接:Tomcat Administration、Tomcat Manager,它们是用于管理Tomcat的,登录密码都是在安装Tomcat时设置的用户名admin和密码

123456。其中,Tomcat Adiministration项可以设置数据库连接池、管理用户及权限、以及其他一些Tomcat服务器相关设置;Tomcat Manager项主要用来发布网页管理,通过它可以轻松的将一个WAR包发布到Tomcat中。 关于Tomcat中文问题的解决,请参阅9.4.6节。 9.1.3 Lomboz的下载与安装

下载Lomboz时一定要针对Eclipse的版本来选择相应的Lomboz版本下载,否则对应版本不同,很有可能会导致Lomboz无法正常使用。本章由于依然要使用CVS,所以还是用Eclipse3.1M4版,Lomboz选择相应的3.1.0版。 1、下载Lomboz

Lomboz的下载地址是:

http://forge.objectweb.org/project/showfiles.php?group_id=97 ,下载页面如下图9.12所示,请选择for Eclipse3.1.x的Lomboz来下载,而且还需要同时下载emf包(如图中箭头所示)。 下载后的文件名为:

? org.objectweb.lomboz_3.1.0.N20050106.zip ? emf-sdo-runtime-I200412160800.zip

图9.12 Lomboz的下载页面 2、安装Lomboz

(1)因为Lomboz、emf是Eclipse的插件,所以它和其他Eclipse插件的安装方法一样,本书采用Links式的插件安装方法,具体步骤不再重复,请参阅1.2节的安装步骤。 下图9.13是安装完成后的目录结构:

图9.13 lomboz、emf的安装目录结构

其中图9.13中的links目录有新创建的两个文本文件:

? 文件lomboz.link,内容仅一句:path=lomboz_3.1.0.N20050106 ? 文件emf.link,内容也仅一句:path=emf-sdo-runtime-I200412160800 (2)验证Lomboz是否安装成功

启动Eclipse。如果安装成功,选择“文件”→“新建”→“项目”会出现如下图9.14所示的Lomboz项目。

图9.14 验证Lomboz是否安装成功

(3)如果未能出现上图画面,请做如下检查和尝试:

? 删除eclipse目录下的子目录configuration,再启动Eclipse试一试。 ? 检查Lomboz的版本是否和Eclipse的一致。 ? Links文件中的path项是否设置正确。

? Lomboz的目录结构是否正

确:..\\lomboz_3.1.0.N20050106\\eclipse\\plugins,注意

lomboz_3.1.0.N20050106和plugins的中间还有个elcipse目录。 9.1.4 Lomboz的环境设置

安装完Lomboz之后,还需要针对Tomcat做一些设置才能用于开发WEB,具体操作步骤如下: (1)打开Eclipse的首选项,设定JDK的tools.jar包的位置,本书是“C:\\jdk\\lib\\tools.jar”,如下图9.15所示:

图9.15 设定JDK的tools.jar包的位置

(2)如下图9.16所示,注意,在Server types项的下拉框中,要选择和当前所用Tomcat版本相对应的项;Application Server Directory和Classpath Variable两项都是指向Tomcat的安装目录:C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0。

图9.16 Tomcat在Lomboz中的设置

(3)Tomcat5.0.28版本在Lomboz中无法启动,必须还要做一些小修改。到Lomboz插件的“..\\lomboz_3.1.0.N20050106\\eclipse\\plugins\\com.objectlearn.jdt.j2ee_3.0.1\\servers”目录中,可以看到各种Web服务器的配置文件,它们都会显示在上图9.16的server types下拉框中,除了tomcat50x.server文件外,其他都不需要,把它们都删除掉或者备份到其他地方。最后,用记事本打开tomcat50x.server,并将所有

“${serverRootDirectory}/bin;${serverRootDirectory}/common/endorsed”项替换成“${serverRootDirectory}/common/endorsed”,共有两处,约在文件中的35、39行位置。 9.1.5 JSP的HelloWorld

本小节将写一个JSP的HelloWorld,用来验证以上Tomcat和Lomboz的环境是否安装成功。 1、设置Java的构建路径

打开Eclipse首选项,如下图9.17所示,选择“java”→“构建路径”→选择“文件夹”项。经过此步设置之后,新建的Java项目(包括J2EE项目)就会默认以bin为输出目录。 ? 注意:这一步相当重要,因为用Lomboz创建J2EE项目时,是无法象创建普通Java项目那样选择“项目布局”的,此时J2EE项目的输出目录将会是在项目根目录下,以后JavaBean的java文件也会和class文件混在一块,非常不便。更关键的是,在后面会要重新定位JavaBean的输出路径,如果不经过这一步,则定位JavaBean的输出路径时,整个项目的输出路径也会自动定位到bin目录下,但此时项目结构都会调整,容易导致混乱。总之,此步一定不能省略。

图9.17 设置Java项目的构建路径 2、创建一个J2EE项目

(1)重启Eclipse。选择“文件”→“新建”→“项目”,选择如下图9.18所示的“Lomboz J2EE Project”项目,然后单击“下一步”。

图9.18 选择“Lomboz J2EE Project”项目 (2)输入项目名称myweb,然后单击“下一步”。

(3)在接下的“定义Java构建设置”页中不做任何改变,直接单击“下一步”。

(4)最后一个页面是J2EE的设置,如下图9.19、9.20所示。共有三步:创建一个名为hello的Web Modules(WEB模块);在Targeted Servers选项卡中,选择“Apache Tomcat v5.0.x”项并单击“Add”加入;单击“完成”按钮,开始生成一个J2EE项目。

图9.19 创建一个Web Modules

图9.20 设置Targeted Servers

(5)完成以上操作之后,“包资源管理器”视图中会出现如下图9.21所示的项目结构。

图9.21 myweb项目的项目结构 3、在Lomboz中启动Tomcat

右键单击“hello模块”,弹出如下图9.22所示的右键菜单,选择Run Server来启动Tomcat(启动前确保Tomcat还是停止状态)。在这个菜单中还有其他常用的菜单项: ? Stop Server - 停止Tomcat

? Debug Server - 用调试方式启动Tomcat。在WEB开发中,它比Run Server更常用。 ? Check All JSP Syntax - 检查项目中所有JSP文件的语法是否符合规范 ? Undeploy Module - 删除已经发布在Tomcat上的WEB模块 ? Deploy Module - 发布WEB模块到Tomcat上 ? Show in Browser - 在IE中预览本WEB模块的效果。

图9.22 hello模块的右键菜单

如果启动Tomcat成功,在控制台会显示如下图9.23所示的字符串。

图9.23 控制台的输出显示 4、发布hello模块

右键单击hello模块,打开如上图9.22所示的右键菜单,选择Deploy Module项,将hello模块发布到Tomcat。

从下图9.24的控制台输出,可以看出Lomboz使用Ant来发布网页,每一行都显示出hello模块的打包发布过程,下面给出一些关键词解释: ? mkdir - 创建目录 ? copy - 复制文件

? jar - 用JDK的jar来打包(这里是打包成hello.war) ? delete - 删除文件

图9.24 发布hello模块时的控制台输出

再次调出hello模块的右键菜单,选择Show in Browser项。Lomboz将打开IE浏览器,得到如下图9.25所示的效果,也可以直接打开IE浏览器,输入地址

“http://127.0.0.1:8080/hello/”来查看效果。这个页面显示的是index.jsp文件。

图9.25 用IE来查看网页效果 5、修改index.jsp

如下图9.26所示,修改index.jsp来显示一个HelloWorld字符串。

图9.26 修改index.jsp

保存好之后,还要再用“Deploy Module” 菜单项重新发布hello模块,然后才能在IE中看到修改后的效果。 6、一些相关问题

(1)如果看不到修改效果,有可能是IE的页面缓存的原因,可以尝试如下解决办法:关掉IE,然后再打开,进入“工具”→“Internate选项”,单击下图9.27中的“删除文件”按钮来删除IE的网页缓存。

图9.27 删除IE页面缓存

(2)同样是因为缓存原因,在停止Tomcat服务后,即使刷新网页却依然能正常显示。将IE关掉重启,页面即会无法访问。

(3)如果是在Eclipse中启动Tomcat的,则关闭Eclipse,Tomcat服务也随之停止。但建议还是使用“Stop Server”菜单项来正常停止Tomcat服务。 9.1.6 如何不必发布就可以在IE上显示WEB修改效果

经过前面设置后,虽然可以开发WEB了,但每一次修改都要重新发布hello模块,才能在IE上显示修改后的效果,这无疑是开发时无法接受的,照这样,开发的时间进度至少要增加一倍。本小节将给出不必不发布就可以在IE上显示修改效果的方法。 首先,解决的办法是基于以下知识的:

? 在发布hello模块时,Lomboz是将hello模块打成一个WAR压缩包,然后复制到Tomcat的webapps目录,在IE上显示的网页就是来自于这个目录下的WAR压缩包中,所以不能直接显示修改后的JSP文件也是可以理解的了。 ? Tomcat要发布网页,不是必须得打成WAR包,也可以发布未经压缩的文件目录。实际项目中,直接发布零散文件的方式居多,因为这样更新JSP文件比较方便。 ? 在Tomcat安装目录下的conf子目录里有一个名为server.xml的文件,它可以用来定义一个新的WEB应用。 由上面的知识,可以得出以下解决思路:通过修改server.xml文件,定义一个新的WEB应用,将这个WEB应用定位到Eclipse的workspace目录中的myweb项目。这样设置以后,IE显示的文件就是Eclipse中正在编写的JSP文件了,也就是说,不必再经过打包成WAR发布这一步。

具体操作步骤如下:

(1)为了避免干扰,先将原来发布的hello模块删除。

打开Tomcat主页面:http://127.0.0.1:8080/。选择链接“Tomcat Manager”,输入用户名密码(admin、123456),得到如下图9.28所示页面。单击hello模块右侧的“Undeploy”将hello模块从Tomcat上的撤消发布。

图9.28 撤消Tomcat上的hello模块 (2)修改server.xml,定义一个新的WEB应用

server.xml此文件的具体路径如下:C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\conf\\server.xml。此server.xml文件最未尾的项之前插入一项的设置,的具体代码如下:

reloadable=\

docBase=\ workDir=\

代码说明:

? 注意一定要将以上代码加在紧靠项之前,的几个属性可以分行写,也可以写成一行。 ? path - 是指WEB模块的名称hello,这样其访问地址为:http://127.0.0.1:8080/hello/

? docBase - 定义jsp文件位置。本处指向Eclipse中hello模块的路径 ? workDir - 在IE显示之前,JSP要先编译成servlet,这个属性就是定义hello模块输出的servlet的所在位置。如下图9.29所示,因为所建的myweb项目默认的输出路径为myweb\\bin目录,所以这里的workDir也定位到此myweb\\bin目录。

图9.29 myweb项目的默认输出文件夹

(4)右键单击“hello”模块→选择Lomboz J2EE→选择Debug Server(或Run Server)。然后,在IE浏览器中输入“http://127.0.0.1:8080/hello/”来查看效果。最后,随便修改一下index.jsp文件,直接刷新一下IE,如果可以看到修改后的效果,表示以上所有设置成功。

如下图9.30所示的“导航器”视图(注意:不是“包资源管理器”视图),index.jsp在经过IE显示之后生成几个新文件和目录(可能需要先刷新一下myweb项目):

图9.30 myweb项目结构 9.1.7 配置Tomcat的数据库连接池

在WEB开发中,有没有数据库连接池对WEB性能的影响非常大,Tomcat有自带的连接池,这一节就来配置Tomcat的连接池。 1、复制JDBC连接包

将第8章使用的JDBC连接包mysql-connector-java-3.0.16-ga-bin.jar复制到C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\common\\lib目录下,common\\lib是Tomcat的全局引用库的所在目录,Tomcat在启动时会自动加载这个目录中的所有JAR包。 有些网上的文章说也可以将数据库连接包复制到WEB应用的WEB-INF\\lib中(本例的

myweb\\hello\\WEB-INF\\lib目录),这个目录是hello模块发布时会自动加载的一个包目录。但经笔者实验,如果连接包将放在此目录中,不用数据库连接池方式来访问数据库,则连接包可以正常使用;如果使用Tomcat连接池,则会出错误,连接包无法使用。 2、进入Tomcat的配置页面

用IE浏览器输入地址:http://127.0.0.1:8080/admin/ ,打开Tomcat服务器配置的登录页面,再输入用户名admin、密码123456,进入Tomcat的配置页面,如下图9.31所示:

图9.31 连接池设置

单击左边的树结点“Data Source”→选择右上角的下拉框的“Create New Data Source”项,然后在表格中输入相应的连接池配置信息:

? JNDI Name:jdbc/mysql - 设置连接池的JNDI名,在Java程序会用到此名。 ? Data Source URL:jdbc:mysql://localhost/sms - 数据库连接字串,sms是数据库。 ? JDBC Driver Class:com.mysql.jdbc.Driver - JDBC连接类。 ? User Name:root - 数据库登录用户名。

? Password:****** - 数据库登录密码。本例为123456。

? Max. Active Connections:4 - 最大连接数。实际应用时,应该根据WEB使用情况设置得大一些;开发时,4个连接足够了。 ? Max. Idle Connections:2 - 最大空闲连接数。

? Max. Wait for Connection:5000 - 最大等待连接限制。 ? Validation Query:验证用的查询语句,可以不填。

填写完以上信息之后,单击右下角的“Save”按钮保存修改,再单击右上角的“Commit Changes”按钮提交修改。

3、修改Tomcat的server.xml文件

server.xml文件的具体路径:C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\conf\\server.xml,在原来的项中加入一个子项< ResourceLink>:

reloadable=\

docBase=\ workDir=\

global=\

type=\

4、测试数据库连接池

将以下测试程序命名为test.jsp,创建在hello模块的根目录下,然后通过IE地址:http://127.0.0.1:8080/hello/test.jsp来访问。这个测试程序从数据库连接池中获得一个数据库连接对象Connection,然后再查询数据库的iuser表,并用name(姓名)列的数据打印出来(注:iuser是在第8章创建的用户表)。test.jsp运行效果如下图9.32所示:

图9.32 test.jsp的效果 test.jsp源代码如下:

<%@ page contentType=\<%@ page import=\<%@ page import=\

<%@ page import=\<%

Connection con=null; Statement sm=null; ResultSet rs=null; try{

InitialContext ctx=new InitialContext();

DataSource ds=(DataSource)ctx.lookup(\ con = ds.getConnection(); sm = con.createStatement();

rs = sm.executeQuery(\ while(rs.next())

out.println(rs.getString(\}catch(Exception e){ e.printStackTrace(); }finally {

if (rs != null) { try {

rs.close();

} catch (SQLException e) {} rs = null; }

if (sm != null) { try {

sm.close();

} catch (SQLException e) {} sm = null; }

if (con != null) { try {

con.close();

} catch (SQLException e) {} con = null; } } %> 程序说明:

? <%@ page contentType=\这一行是设置网页的字符集,也是解决中文乱码问题的关键一句。如果是纯html页面,则应在项之前加入这样一句:

8.2 面向对象分析和数据表创建(版本V0010) 8.2.1 界面效果及实现功能

本章项目是编写一个学生成绩管理软件,由于主要目的是给出一个项目开发的示例,所以这个软件的功能是做得相当简单的,也不存在需求分析阶段。关于学生成绩管理软件的一些功能及概念,也不再多加说明,毕竟大家都是从学校和考试里走出来的,对这些已经很熟悉了。

本章项目的主体界面框架如下图8.19所示:

图8.19 主体界面框架

功能说明:

? 左上部是主功能导航器视图(简称为主功能导航器或主功能视图),其中提供了一个功能结点树,本章将实现“档案管理”和“成绩管理”两个结点的功能。 ? 右部是一个编辑器,当单击“档案管理”结点时将生成一个编辑器。 ? 左下部是成绩管理的搜索视图,可以根据这个视图设置的搜索条件,查询出相应的考试成绩。

? 右部还有一个名为“2003-12-11段考”的编辑器,当单击左下部的“搜索”按钮时将生成此编辑器,如下图8.20所示:

图8.20 成绩编辑器 8.2.2 面向对象的分析与设计

面向对象的分析与设计,也称OOAD(Object Oriented Analyse Design)。因为它能够更准确自然的用软件语言来描述现实事物,并使得在它基础上构建的软件具有更好的复用率、扩展性及可维护性,所以OOAD是当前最重要的软件方法学之一。 OOAD和Rose、Together等UML软件没有必然的关系,OOAD是一种方法,UML是描述这种方法的图形语言,而Rose等则是使用UML的具体工具。OOAD的关键在于思维方式的转变,而不是工具的使用,即使只用铅笔和白纸也可以成为一个优秀OOAD专家。

现在大学的课程以C、Basic、VB、FoxPro居多,即使是用C++、Java,也是可以用面向过程的方式来编写程序,所以使用面向对象的语言并不代表你是以面向对象的方式来思考和编

程。徒具对象的形,而无对象的神,是现在一般程序员的最大缺陷所在。 以本项目为例,大多数习惯于面向过程的编程思维方式的开发人员,一般在做完需求分析后,便开始设计数据库的表结构,而在编码阶段才开始考虑根据表结构来进行对象的设计与创建,这种开发方式就是带有过去很深的面向过程、面向数据库表编程的烙印。 所谓“万物皆对象”,OOAD应该是把对象做为思考的核心,而不是仅仅把“对象”当成一种编程的手段,应当先完成对象设计,然后再根据对象创建表,这是最基本的次序。

当然这种方式在转化成数据库时会遇到一些困难和阻力,毕竟数据库不是面向对象的,SQL语言也不是面向对象的。但Hibernate、JDO、EJB等数据库持久化技术,已经可以让开发者用完全的面向对象方式来编程,而不必忍受“对象”到“关系”转化的痛苦。

为了让读者可以了解如何手工完成“对象”到“关系”的转化,本插件项目仍然使用纯JDBC方式来实现。在第9章会讲解Hibernate的使用,所谓“先苦后甜”,通过两种方式的比较,读者能更深的体会Hibernate等数据库持久化技术的美妙之处。

本章的学生成绩管理软件有以下对象:学生、老师、年级、班级、课程、成绩、考试,本项目所有对象创建在cn.com.chengang.sms.model包下,如下图8.21所示。接下来会具体分析一下这些对象,并给出其源代码和UML类图。

图8.21 数据对象所在的包

1、用户对象:学生、老师

这个系统有可能会存在一个前台网站,比如:老师用Eclipse做客户端来管理成绩,而学生则通过一个网页来查询成绩,所有的数据集中在学校的中心服务器上。因此系统的用户有两种:学生、老师,这两种用户有一些信息是相同的,有些则不同。比如他们都有用户名、姓名、密码等,而学生没有老师的课程属性,老师则没有学生的班级属性。

由上面的分析,我们将两种用户的共性抽象成一个接口:IUser,这个接口有如下属性:数据库ID号(Id)、用户名(userId)、密码(password)、姓名(name)、最后登录时间(latestOnline)。另外,学生类(Student)有班级属性(SchoolClass),老师类(Teacher)则有课程(Course)属性,学生类和老师类都实现于IUser接口。

将用户抽象成一个接口的另一个好处就是:使用户类置于同一个规范之下。今后要新增加一个种类型的用户,比如:家长用户,只需要再实现IUser接口即可。“接口”是用Java进行OOAD开发的一个最重要的概念,也是成为一个优秀的Java设计师所必须掌握和熟练使用的概念。

其他说明:类的实例变量有多种叫法:通用的名称是“实例变量”或“属性”;在实体类中因为和数据表的字段相对应,也可称之为“字段”;有些书籍文章也称之为“域”。 先给出用户类的UML设计图,如下图8.22所示:

图8.22 用户类的源代码如下: (1)用户接口IUser

package cn.com.chengang.sms.model; import java.util.Date; public interface IUser { /**

* 得到数据库ID */

public Long getId(); /**

* 设置数据库ID */

public void setId(Long id); /**

用户类的UML类图

* 得到用户名 */

public String getUserId(); /**

* 设置用户名 */

public void setUserId(String userId); /** * 得到密码 */

public String getPassword(); /** * 设置密码 */

public void setPassword(String password); /**

* 得到用户姓名 */

public String getName(); /**

* 设置用户姓名 */

public void setName(String name); /**

* 得到最后登录时间 */

public Date getLatestOnline(); /**

* 设置最后登录时间 */

public void setLatestOnline(Date date); }

程序说明:

? 接口规定只能定义方法,不能定义属性变量,所以本例只定义了用户各属性的set/get方法。

? 接口定义的方法前面是否有public或abstract都是一样的,本例加了public,你也可以去除,两者效果相同。

? 这里需要注意的是Date对象是java.util.Date,不要和java.sql.Date混淆。 (2)实现接口IUser的抽象类AbstractUser

每一个具体用户类(学生、老师)都要实现一遍接口IUser中定义的方法,而这些方法的代码都是一样的,所以我们用一个抽象类AbstractUser来统一实现IUser接口中的公共属性,我们把这种抽象类称之为“默认实现抽象类”。AbstractUser不仅提供了方法的实现,也提供了属性变量的定义,所有的用户子类都将继承并拥有这些属性。 AbstractUser类的具体代码如下: package cn.com.chengang.sms.model; import java.util.Date;

abstract class AbstractUser implements IUser { private Long id; //数据库ID private String userId; //用户名 private String password; //密码 private String name; //姓名

private Date latestOnline;//最后登录时间

/********以下为接口IUser的实现方法***********/ public Long getId() { return id; }

public void setId(Long id) {

this.id = id; }

public String getUserId() { return userId; }

public void setUserId(String userId) { this.userId = userId; }

public String getPassword() { return password; }

public void setPassword(String password) { this.password = password; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public Date getLatestOnline() { return latestOnline; }

public void setLatestOnline(Date latestOnline) { this.latestOnline = latestOnline; } }

(3)学生类Student

学生类Student继承自抽象类AbstractUser,所以也拥有了抽象类中所有的属性和方法,因此这里只需定义学生类独有的属性和方法。 package cn.com.chengang.sms.model;

public class Student extends AbstractUser {

//学生所属班级,为了避免和类(class)的名称混淆,将其命名为SchoolClass private SchoolClass schoolclass; /**

* 得到学生所在班级 */

public SchoolClass getSchoolclass() { return schoolclass; } /**

* 设置学生所在班级 */

public void setSchoolclass(SchoolClass schoolclass) { this.schoolclass = schoolclass; } }

(4)老师类Teacher

package cn.com.chengang.sms.model; import java.util.HashSet; import java.util.Set;

public class Teacher extends AbstractUser { private Set courses = new HashSet(); //所教课程 /**

* 得到所有课程 */

public Set getCourses() { return courses; } /**

* 设置一批课程 */

public void setCourses(Set courses) { this.courses = courses; }

本文来源:https://www.bwwdw.com/article/dx37.html

Top