湛蓝的梦---hunterjie's blog

All about Java.
posts(0) comments(0) trackbacks(0)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

文章档案(9)

  • 2009年2月 (4)
  • 2008年9月 (1)
  • 2008年7月 (2)
  • 2008年6月 (1)
  • 2008年3月 (1)

Javaer

  • Alonely Blog
  • BeanSoft
  • java2000.net的专栏
  • java我的最爱
  • 一个人的Java
  • 付江blog
  • 千里冰封
  • 木月的博客
  • 编程小兵-菜鸟天堂
  • 诗特林-sterning

搜索

  •  

最新评论

2009年2月13日

Tomcat下JSP、Servlet和JavaBean环境的配置

一、开发环境配置
第一步:下载j2sdk和tomcat:到sun官方站(http://java.sun.com/)下载j2sdk,注意下载版本,同时最好下载J2SE  Documentation,然后到tomcat官方站点(http://jakarta.apache.org/)下载tomcat

第二步:安装和配置你的j2sdk和tomcat:执行j2sdk和tomcat的安装程序,然后按默认设置进行安装即可。
1.安装j2sdk以后,需要配置一下环境变量,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的j2sdk安装在c:\j2sdk1.5.0):
JAVA_HOME=c:\j2sdk1.5.0
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因为它代表当前路径)
path=%JAVA_HOME%\bin
接着可以写一个简单的java程序来测试J2SDK是否已安装成功:
public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}
将上面的这段程序保存为文件名为Test.java的文件。
然后打开命令提示符窗口,cd到你的Test.java所在目录,然后键入下面的命令
javac Test.java
java Test
此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印出这句话,你需要仔细检查一下你的配置情况。
2.安装Tomcat后,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat):
CATALINA_HOME=c:\tomcat
然后修改环境变量中的classpath,把tomat安装目录下的common\lib下的(可以根据实际追加)servlet.jar追加到classpath中去,修改后的classpath如下:
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar;
接着可以启动tomcat,在IE中访问http://localhost:8080,如果看到tomcat的欢迎页面的话说明安装成功了。

PS:

版本问题:  j2sdk1.4.2_08+Tomcat 5.0一切正常,jdk1.5.0_04+Tomcat 5.5好像不能通过,Tomcat 5.5启动不了。还发现一种情况Tomcat 启动后会自动关闭


第三步:建立自己的jsp app目录
1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带的的目录;
2.在webapps目录下新建一个目录,起名叫myapp;
3.myapp下新建一个目录WEB-INF,注意,目录名称是区分大小写的;
4.WEB-INF下新建一个文件web.xml,内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>
5.在myapp下新建一个测试的jsp页面,文件名为index.jsp,文件内容如下:
<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>
6.重启Tomcat
7.打开浏览器,输入http://localhost:8080/myapp/index.jsp 看到当前时间的话说明就成功了。
第四步:建立自己的Servlet:
1.用你最熟悉的编辑器(建议使用有语法检查的java ide)新建一个servlet程序,文件名为Test.java,文件内容如下:
package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.println("<html><body><h1>This is a servlet test.</h1></body></html>");
out.flush();
}
}
2 .编译
将Test.java放在c:\test下,使用如下命令编译:
C:\Test>javac Test.java
然后在c:\Test下会产生一个编译后的servlet文件:Test.class
3 .将结构test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那个test目录到classes目录下,如果classes目录不存在,就新建一个。 现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结构
4 .修改webapps\myapp\WEB-INF\web.xml,添加servlet和servlet-mapping
编辑后的web.xml如下所示,红色为添加的内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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>My Web Application</display-name>
<description>
A application for test.
</description>
<servlet>
<servlet-name>Test</servlet-name>
<display-name>Test</display-name>
<description>A test Servlet</description>
<servlet-class>test.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
</web-app>
这段话中的servlet这一段声明了你要调用的Servlet,而servlet-mapping则是将声明的servlet"映射"到地址/Test上
5 .好了,重启动Tomcat,启动浏览器,输入http://localhost:8080/myapp/Test 如果看到输出This is a servlet test.就说明编写的servlet成功了。
注意:修改了web.xml以及新加了class,都要重启Tomcat
第四步:建立自己的Bean:
1.用你最熟悉的编辑器(建议使用有语法检查的java ide)新建一个java程序,文件名为TestBean.java,文件内容如下:
package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}
2 .编译
将TestBean.java放在c:\test下,使用如下命令编译:
C:\Test>javac TestBean.java
然后在c:\Test下会产生一个编译后的bean文件:TestBean.class
3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下,
4 .新建一个TestBean.jsp文件,文件内容为:
<%@ page import="test.TestBean" %>
<html><body><center>
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>
Java bean name is: <%=testBean.getName()%>
</center></body></html>
5 .好了,重启Tomcat,启动浏览器,输入http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了。
这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码,自己多动手写代码以增强自己在这方面开发的能力了。

jvm应填写到
c:\j2sdk\bin

给你一个简单的配置::::

JSP环境配置心得
首先要说的是,使用jdk+tomcat完全可以配置我们的jsp服务器,不再需要其实任何东东,有很多文章介绍了Apache,其实根本用不着,一般的学习调试tomcat完全可以胜任了。
安装jdk后,tomcat在安装之前会自动找到jdk的安装路径,一路点击"下一步",经过一段时间的文件复制,最后"close",完成comcat的安装。
您最好去下载一个版本较高的tomcat,比如4.1以上的,因为它不需要设置太多的系统变量,右击"我的电脑",选择"属性"->"高级"->"环境变量"->"系统变量",新建一个TOMCAT_HOME,值设置成你的tomcat所在的路径,比如:D:\Program Files\Apache Group\Tomcat 5.5,配置完成。
从开始菜单中找到tomcat选项,一般打开顺序是:开始->程序->Apache Tomcat 5.5,选择"Start Tomcat",让jsp服务器开始运行,此时会打开一个类似Dos的窗口,会显示一些相关的信息。
如果您使用代理上网,一定要先撤掉代理,不然您的jsp程序永远也得不到执行。如果不是代理的,这一步就跳过了。
打开浏览器,在地址栏中输入:http://localhost:8080,如果看到有老虎(我也不知道是老虎还是猫)的画面,恭喜您,您成功了一半。
先来享受一下成功的喜悦吧,请输入下面的代码:
<html>
<head>
<title>First Page</title>
</head>
<body>
<H3>Today is: h
<%= new java.util.Date() %>
</H3>
</body>
</html>
将该程序保存为:First.jsp,放到Tomcat的ROOT目录下,然后在浏览器的地址栏中输入:http://localhost:8080/First.jsp,(First.jsp跟我们保存的文件名的大小写要一致)回车,如果不出意外,应该可以看到形如Today is: h Fri Apr 11 08:32:38 CST 2003 的结果。
注意:ROOT是tomcat的默认虚拟目录,如果要改成自己的虚拟目录怎么办呢?请继续往下看吧。
要改成自己的虚拟目录,就要请出server.xml来了,该文件是一个配置文件,在Tomcat\conf目录下,使用任何文本编辑软件都能打开它,我们先找到下面一句:
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080" minProcessors="5" maxProcessors="75"
enableLookups="true" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000"
useURIValidationHack="false" disableUploadTimeout="true" />
这里的port="8080"就是端口,我们完全可以用别的端口来代替,但不能是被系统占用的端口(0--1023),这里简单提一下。
下面我们再往下找,会发现以下的语句:
</Context>
</Host>
我们就应该找到这两个语句,如果不懂E文,您就认定这两个语句好了。然后我们将该语句更改如下:
</Context>
<Context path="/myjsp" debug="0" docBase="e:/myjsp" reloadable="true">
</Context>
</Host>
这里的path="/myjsp"就是我们就配置的虚拟目录了,以后在地址栏中输入http://localhost:8080/myjsp即可。而docBase="e:/myjsp" 则是机器本地路径,他们通过这个语句形成一个映射关系,其它照抄。
将上面的First.jsp文件放到e:/myjsp目录下,输入http://localhost:8080/myjsp/First.jsp,是不是有一种喜上眉梢的感觉?
在论坛里我见得最多的就是很多人不知道javaBean文件放到哪里,老实说开始我也不知道,更令人不解的是,十个人有九种不同的说法,这更让我们茫然。其实这问题也不是我们想像的那么复杂,我们以一个例子说明:
先建立一个java程序,代码如下:
package hall;
public class SimpleBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
保存为SimpleBean.java,编译后会生成一个包,其实就相当于一个目录,也就是SimpleBean.class会存放在hall目录中,暂且保存起来,将来备用。
再输入以下代码:
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</TABLE>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test" property="message" value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>
保存在我们刚才建立的虚拟目录e:/myjsp下面,并命名为:BeanTest.jsp。
现在我们应该将hall(包)目录放在哪儿呢?别急,我们先在e:/myjsp下建立一个文件夹WEB-INF,然后再在WEB-INF下建立一个classes文件夹,最后将hall目录放到classes下,当然,hall下的字节码文件SimpleBean.class也一并要移过来,而SimpleBean.java就和BeanTest.jsp放到同一目录吧(可以不需要放的,自己试试)。
好了,大功告成了,重新启动机器(如果您试了好多次都不行,这一步一定要做),在浏览器中输入:http://localhost:8080/myjsp/BeanTest.jsp,您看到了什么?呵,别告诉我您什么都没看到,那肯定是您设置的问题了。
好了,文章写完了,我也只是一只菜鸟,所以有写的不准备的地方请多多指教。祝您jsp之旅一路顺风!!!
Java学习 - 技术文章中心
初学者问的诸如:《怎样配置环境变量》《怎样运行Servlet》啊?这样的问题太多了,现在我写一个初学者入门必读,以便对初学者有指导作用!
首先是下载工具:
我建议初学者用Editplus+JDK,我觉得如果用例如JB,Eclipse,JCreator,虽然刚开始的时候比较方便,但是确使初学者门不知道怎样配置环境变量,
从而难以达到知其然,知其所以然的地步
可以通过如下地址下载:
Editplus(最新版本是v2.11):http://count.skycn.com/softdown.php?id=3641&url=http://sc-http.skycn.net/down/epp211a_cn.exe(要照注册码就自己找吧,网上很多的)
JDK(最新版本是Java2sdk1_5_0):http://192.18.97.54/ECom/EComTicketServlet/BEGIN30AA3B63E5C2F61C8C26F84B78970A98/-2147483648/926882595/1/627578/627410/926882595/2ts+/westCoastFSEND/jdk-1.5.0_04-oth-JPR/jdk-1.5.0_04-oth-JPR:3/jdk-1_5_0_04-windows-i586-p.exe(这是For Windows)
然后就是安装JDK,我是把它装到从c:\JDK目录下面:
然后就是CLASSPATH的问题了:
正如操作系统利用PATH来搜索可执行程序一样,Java运行环境也会遍历CLASSPATH来查找类,即便是HelloWorld这样简单的程序,JVM也会遍历
CLASSPATH定义的每一个路径,直到找到相应的文件为止。
相信大家用的系统不是2k就是XP,然后就应当如下设置Path:
我的电脑->属性->高级->环境变量
然后在环境变量的Path后面追加: C:\JDK\bin;.;C:\JDK\lib
也可以这样配置:C:\JDK\bin;.;C:\JDK\lib\dt.jar;C:\JDK\lib\tools.jar
★记住:环境变量中的 . 切记不能少,它表示当前路径,如果少掉出现的错误等会就说!
dt.jar是关于运行环境的类库,tools.jar是关于一些工具的类库
如果没有配置:C:\JDK\bin,则会出现 " javac´ 不是内部或外部命令,也不是可运行的程序或批处理文件。"这样的错误。
然后下面就该写程序了:
首先是(HelloWorld.java),打开Editplus,新建一个Java文件,请照着如下输入,要一字不漏,并且分清大小写:
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello,World!");
}
}
然后把这个文件保存(ctrl + s)到HelloWorld.java,记住大小写一定要分清,是HelloWorld.java不是helloworld.java或者其它的
下面就该运行了,开始->运行->cmd
在控制台中把目录切换到当前目录:
javac HelloWorld.java
java HelloWorld
你就会在控制台上看见输出的Hello,World!(没出来?我把电脑吃了:))
javac是编译命令,它把HelloWorld.java编译成HelloWorld.class
java就是解释命令,JVM把HelloWorld.class解释执行.
在这个时候:
1。如果出现Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
那就是你在环境变量中没有加上那个.(dot)
2。如果出现Exception in thread "main" java.lang.NoSuchMethodError: main
或者HelloWorld.java:1: Public class helloworld must be defined in a file called
"HelloWorld.java".
那就是你没有分清大小写的写入这个HelloWorld,或者保存得时候没有保存为HelloWorld.java
这个名字一定要跟public class的名字一样
对于环境变量的问题就说到这里,下面我先所说怎么在Editplus里面编译和运行,在Tools->参数设置->配置用户工具
1.添加工具(添加应用程序)
菜单文字:Compile Java Program
程序:C:\JDK\bin\javac.exe
参数:文件名称
初始目录:文件目录
2.添加工具(添加应用程序)
菜单文字:Run Java Program
程序:C:\JDK\bin\java.exe
参数:文件名称(不含扩展名)
初始目录:文件目录
工具组名称可以随便添,比如Debug Java Program
然后在Tools的下拉菜单中,你就会看见Compile Java Program以及Run Java Program这两个选项,以后你就可以利用ctrl + 1编译和ctrl +2运行程序了

下面就讨论Servlet的运行:
首先要运行Servlet,则需要JSP/Servlet container,我建议初学者用Tomcat
Tomcat(最新版本5.5):http://apache.justdn.org/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9.exe然后把这个压缩包解压到:
C:\Tomcat
然后再配置环境变量:
添加三个系统变量:
JAVA_HOME: C:\JDK
TOMCAT_HOME: C:\Tomcat
CLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\lib
Tomcat的环境变量就配置完毕了,下面检验Tomcat是否能够运行:
在控制台中转到C:\Tomcat\bin这个目录,运行startup,然后回出现一个窗口,连跳一大串东西,最后表示Server已经运行
在浏览器中输入http://localhost:8080,出现欢迎界面,则表示Tomcat没问题了
然后和上面一样,写入你的第一个Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println("This is my first Servlet");
out.println("</title></head><body>");
out.println("<h1>Hello,World!</h1>");
out.println("</body></html>");

}
}
然后照样用javac HelloWorld.java来编译这个文件,如果出现无法import javax.servlet.*
那么就是应该把C:\Tomcat\common\lib里面的servlet.jar(根据实际来看)文件拷贝到C:\JDK\jre\lib\ext中,再次编译,就没有问题了!
然后在Tomcat目录里面的C:\Tomcat\webapps\ROOT里面按如下的文件结构:
ROOT\index.html
ROOT\welcom.jsp
ROOT\WEB-INF\lib\MyServlet.jar(如果你的servlet的.class打成了.jar文件,则放在lib下面)
ROOT\WEB-INF\classes\HelloWorld.class(把上面生成的HelloWorld.class文件放在这个里面)
然后在浏览器中输入http://localhost:8080/servlet/HelloWorld,于是Server众望所归的报错了:Error 404--Not Found
怎么回事呢?
Servlet必须使用C:\Tomcat\webapps\ROOT\WEB-INF这个目录下面的web.xml文件进行注册,用EP打开这个web.xml文件,
在里面加入
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/servlet/helloworld</url-pattern>
</servlet-mapping>
这样的结构
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
表示指定包含的servlet类.
而以下的结构
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/servlet/HelloWorld</url-pattern>
</servlet-mapping>
表示指定HelloServlet应当映射到哪一种URL模式。
在修改web.xml完毕过后,重新启动Server,然后再输入http://localhost:8080/servlet/HelloWorld,那么偌大一个Hello,World!等着你呢,恭喜你
摆平了:)

【转自:http://blog.csdn.net/dakuen/archive/2005/12/01/540913.aspx 】

posted @ 2009-02-13 14:58 hunterjie 阅读(52) | 评论 (0) | 编辑 收藏

2009年2月12日

Windows下Apache+Tomcat+MySQL+jsp+php的服务器整合配置经验总结

1.作者:moonsbird  
  题目:Windows下Apache+Tomcat+MySQL+jsp+php的服务器整合配置经验总结
  时间:2004.8.19
  最初发表于西南交通大学锦城驿站   
2.本文是作者学习几年来学习jsp/配置服务器环境的经验总结。可以转载,但请注明出处.
    
   开始学习jsp很久了,网上有许多关于jsp整合的例子,但存在着许多问题。
对于Apache+Tomcat+MySQL+jsp+php的整合,针对不同的Tomcat和apache的版本,稍微有些区别。
即使你E文很好,去看Tomcat和Apache的手册,也不一定能完全整合成功。暑假在家,网速不像
在交大那样---老黄牛拉破车样的慢,所以基于此作者查阅大量网上资料,汲其精华,写这篇文
章希望能为初学者提供方便,也可以作为高手的参考手册。
    jsp是优秀的,它基于Java技术,利用JavaBean/Servlet制作动态网站,Java强大的面向对
象编程使Jsp相对于php和asp有着得天独厚的优势。但学习jsp相对于php和asp来说是有难度的。
我想原因之一就是jsp服务器环境的配置要棘手一些。对于动态网页制作,在交大asp曾很长时
间占据上风,不太多的“高手”(也许很多人认为使用jsp的是高手吧)使用jsp,交大比较成功的
jsp网站如世纪星网(Tomcat)、网络教育学院网站(Resin)、交大招生就业网(Tomcat),服务器是
Linux 9,运行相对来说比较稳定可靠。Linux下的Apache和Tomcat整合我曾经发过一篇文章,需
要的大家在锦城搜搜。linux和windows下整合思想是相同的,利用apache来解析*.html/*.htm
静态网页,当遇到*.jsp和servlet时,通过一个apache中的module把jsp页面抛给Tomcat(或者
resin)来处理,在linux下通过编译来制作这个module,要麻烦一些,本文通过现成的win下的一
个module来完成整合。
废话不说啦,下面开始整合:

所需软件
  (1) j2sdk-1_4_2-windows-i586.exe 
   jdk的版本关系倒不是很大,不影响Apache和Tomcat的整合,配置环境变量时注意一些就行了.
  (2) apache_2.0.49-win32-x86-no_ssl.exe
   apache版本对整合影响不是太大,但最好利用此版本。
  (3) jakarta-tomcat-4.1.30.exe
   版本最好用这个版本,其他的我没有试过,有可能会导致整合不成功。
  (3) php-4.3.3-Win32.zip
  是一个压缩包,下载下来直接解压就行了。
  (4) mod_jk.dll
  这个module是放到apache中的module中去的,利用它来使Tomcat和Apache之间通讯。
  (5) mysql-max-3.23.46a-win.zip  
  数据库mysql,其版本对整合影响不大.
  (6) jdbc驱动
   mysql的驱动程序,和数据库连接时用
   以上软件我就不把down的地址贴出来啦,去网上搜baidu、北大天网,只要用心找,应该问题
不大,如果真的找不到,发信找我要吧。

一.安装j2sdk
   在Windows下,直接运行下载的j2sdk-1_4_1_01-windows-i586.exe文件,根据安装向导安装
到一个目录,例如安装到d:\server\j2sdk
   1.配置环境变量:
   添加CLASSPATH变量
变量值为
./;%CLASSPATH%;D:\server\j2sdk1.4.0\lib\dt.jar;d:\server\j2sdk1.4.0\lib\tools.jar;
             d:\server\j2sdk1.4.0\bin
   这个配置保证java运行时可以找到class类。
   2.添加JAVA_HOME变量,变量值为d:\server\j2sdk1.4.0
   3.在原来的path变量中,添加d:\server\j2sdk1.4.0\bin,这样无论在何处运行java名令都行。
重新启动

cmd进入dos,运行java和javac看有没有反应,如果出现命令的帮助,那么java就安装成功了
也可以运行一个java小程序看看.

public class test{
  public static void main(String args[]){
    System.out.println("看到这个说明java安装成功!");
}
}
把上以程序存放在test.java文件中,一定要是test.java才行,然后利用命令编译
javac test.java
如果没有错误,则说明编译成功,如果有错,在程序书写正确的基础上,刚说明java环境变量没
有配置好,刚重新配置。如果编译成功,则运行:
java test
注意,不是java test.java!如果无误,刚会打印出:

   看到这个说明java安装成功!

gxgx,jdk安装成功啦!可以进行下一步.

二.apache安装
    1.运行apache_2.0.49-win32-x86-no_ssl.exe,一路点"确定"和"接受"就行,路径选
d:\server\apache group\apache2。
    此时apache已经安装成功,且已运行,在IE中输入http://localhost/可以看到
apache的主页。安装成功!
    2.修改httpd.conf
     apache的配置文件是httpd.conf,位于apache根目录的下的conf文件夹下
    (1).修改默认网站根目录:
       在d:\server下建立文件夹www,以此作为网站的根目录
       DocumentRoot "D:/server/Apache Group/Apache2/htdocs"
       改为DocumentRoot "D:/server/www
    (2).修改字符设置
      apache解析中文网页时会产生乱码,
      修改AddDefaultCharset ISO-8859-1为AddDefaultCharset GB2312
    (3).修改默认主页
       当访问目录时,apache会自动导入的主页,优先级以先后顺序为准
       把DirectoryIndex index.html index.html.var改为
       DirectoryIndex index.html index.jsp index.php default.jsp default.php index.html.var
    (4).设置错误页面
      这样对于你的网站会更安全些,如果没设置,别人在你的网址后随便输入一个路径,会显示404错
    误,并且会显示你的服务器版本号,服务器配置一目了然,为了避免这种情况,可以设置错误页面。
      当出现404错误,即找不到网页时,把访问者导入到一个错误页面
  找到:
    #
    # Customizable error responses come in three flavors:
    # 1) plain text 2) local redirects 3) external redirects
    #
    # Some examples:
    #ErrorDocument 500 "The server made a boo boo."
    #ErrorDocument 404 /missing.html
    #ErrorDocument 404 "/cgi-bin/missing_handler.pl"
    #ErrorDocument 402 http://www.example.com/subscription_info.html
    # 
       httpd.conf中的这一部分,#ErrorDocument 404 /missing.html
      一行修改为ErrorDocument 404 /error/noFile.htm,其中noFile.htm为d:\server\www\error\下一个错误文件,需
   要你自己建立。当发生404错误时,进入noFile.htm页面,可以提示网页没有找到。这样就不可能看到
你的服务器软件信息了。也可以设置其它的错误导向的页面,具体http响应错误编号请查阅相关资料。
重新启动apache,如果没意外,此时已经安装成功,把静态页面放到d:\server\www\error\目录下,看能不能成功解析。
随便输入一个:http://localhost/sdagasgdasasg.htm,看是不是导向你设置的404错误,即noFile.htm错误页面.
成功了吧!
    关于apache中其他参数的意义,我就不说啦,你可以去网上查,其实最好的方法是看httpd.conf中的注释部
分,已经说得很清楚啦。
好啦,到此apache安装成功,你可以休息一下,听首音乐,开始下一步的安装:)

三.php安装
   解压php-4.3.3-Win32.zip,到d:\server\php目录下.下配置PHP和Apache,使之能解析php程序。
   将d:\server\php\目录中的“php.ini-dist”改名“php.ini”,并复制到C:\windows\system32
(Win2K目录为:C:\winnt\system32)下,在apache的配置文件httpd.conf中下入以下几行,使之
支持php.
    ScriptAlias /php/ "d:/server/php/" 
    AddType application/x-httpd-php .php3
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php .phtml 
    Action application/x-httpd-php "/php/php.exe"
    在d:\server\www下建立网页:index.php,内容为:
    <html>
     <head><title>php测试</title></head>
     <?php
       phpinfo();
     ?>
    </html>
  用文本编辑器编辑好为存为index.php,重新启动apache,在IE中输入http://localhost/index.php,如果出现php的
环境变量,说明php,安装成功,如果不能解析<?php phpinfo(); ?>中的部分,则说明没有成功安装。

四.Tomcat的安装
   我用的是jakarta-tomcat-4.1.30.exe安装文件,在windows下一路点"确定"就行了,比较简单,安装目录为
d:\server\tomcat
   下面设置环境变量:
   同jdk的环境变量,添加变量TOMCAT_HOME,值为d:\server\tomcat;增加变量CATALINA_HOME,值为
d:\tomcat\server,在path变量中加入d:\server\tomcat\bin
   下面启动tomcat,运行tomcat目录下的,bin/startup.bat文件就行啦,出现tomcat运行控制台,tomcat成功
启动.
   在IE中输入http://localhost:8080/,看到大猫的吧,则tomcat安装成功.

五.安装MySQL

   第一步:解压 mysql-max-3.23.46a-win.zip,运行mysql安装文件,把mysql安装到d:\server\mysql
   第二步:在环境变量path中加入 d:\server\mysql\bin
   第三步:进入d:\server\mysql\bin目录,运行winmysqladmin,刚会出现对话框,设置mysql用户密码,假设
帐号为:root 密码为:123
   第四步:进入dos,进入mysql/bin下,运行以下命令打开mysql
   mysqld-nt --standalone
   则mysql开启
   然后运行:
   mysql
   如果开启,则出现以下文字:
   Welcome to the MySQL monitor. Commonds end with ; or \g.
   Your MySQL connection id is 1 to server version: 3.23.46-nt 
   Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
   mysql>
   注意:此时mysql没有设置密码,为了不让别人进入你的数据库,请为mysql设置密码,具体操作请参阅mysql
的中文说明文档。
   至此,mysql安装成功!

六.安装MySQL的驱动类jdbc
   解开jdbc驱动包,把里面的org文件夹复制到jsp可以找到的位置就行啦。可以是tomcat的根目录common/classes
文件夹下,也可以是jsp网站class类WEB-INF/class/下。当加载驱动程序时,以便能找到相关的类。或者把jdbc包
的路径加入到classpath变量中。

七.Tomcat和Apache的整合配置
   Tomcat只是一个用来解析*.jsp文件的容器,它不是服务器,其解析静态htm/html文件的能力远远不如apache,
整合后在同一个端口使apache来解析静态网页,而遇到*.jsp网页时,交由tomcat来解析.
  第一步:把 mod_jk.dll复制到apache根目录module文件夹下。
  第二步:配置APACHE

  打开apache根目录下conf\httpd.conf

添加以下语句:

     #------------------------------------------

    #connecting to tomcat using ajp13 
    LoadModule jk_module modules/mod_jk.dll
    JkWorkersFile "d:/server/tomcat/conf/workers.properties"
    JkMount /servlet/* ajp13 
    JkMount /*.jsp ajp13 


    #-----------------------------------------------------

   注意:以上语句的基本意思是:
   loadModule一行:加载mod_jk.dll动态链接库模块,使之与tomcat通讯
   jkWorkersFile:指明工作时tomcat相关文件workers.properties位置
   jkMount:两行指明当遇到*.jsp和servlet时,交由ajp13协议,继而转发给tomcat处理。
  第三步:建立workers.properties文件,在tomcat根目录conf下建立workers.properties文件,内容为:
workers.tomcat_home=d:\server\tomcat
workers.java_home=d:\server\j2sdk1.4.0
ps=\
# worker.list=ajp13 
worker.list=ajp12,ajp13  

worker.ajp12.port=8007
worker.ajp12.host=localhost
worker.ajp12.type=ajp12 
worker.ajp12.lbfactor=1
             
worker.ajp13.port=8009         
worker.ajp13.host=localhost      
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1

worker.loadbalancer.type=lb 

worker.loadbalancer.balanced_workers=ajp12, ajp13
worker.inprocess.type=jni 
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes 
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)jaxp.jar 
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)parser.jar 
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)common$(ps)lib$(ps)jasper.jar 
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)common$(ps)lib$(ps)servlet.jar 
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)common$(ps)lib$(ps)webserver.jar
worker.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar 
worker.inprocess.cmd_line=-config 
worker.inprocess.cmd_line=$(workers.tomcat_home)/conf/jni_server.xml 
worker.inprocess.cmd_line=-home 
worker.inprocess.cmd_line=$(workers.tomcat_home) 
worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)jvm.dll 
worker.inprocess.stdout=$(workers.tomcat_home)$(ps)inprocess.stdout 
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)inprocess.stderr 
worker.inprocess.sysprops=tomcat.home=$(workers.tomcat_home)

注意以上文件第一、二行填上tomcat和jdk的相关目录.
 
  第四步:配置tomca/conf下的server.xml文件,这个是tomcat的主要配置文件,重要配置如下:
    1.虚拟目录设置:
     找到下面内容:
     <Host name="localhost" debug="0" appBase="/webapps" 
       unpackWARs="true" autoDeploy="true">
    修改为:
    <Host name="localhost" debug="0" appBase="d:/server/www" 
       unpackWARs="true" autoDeploy="true">
    使tomcat主目录为d:\server\www.
    找到下面内容:
    <Context path="examples" docBase="/examples" debug="0"
                 reloadable="true" crossContext="true">
    修改为
    <Context path="" docBase="/" debug="0"
                 reloadable="true" crossContext="true">
    这个我的理解是应该是使tomcat根目录下的jsp作为一个虚拟主机吧.
   2.设置tomcat监听端口,找到下面的内容:
   <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
         port="8080"     minProcessors="5" maxProcessors="75"
               enableLookups="true" redirectPort="8443"
               acceptCount="100" debug="0" connectionTimeout="0"
               useURIValidationHack="false" disableUploadTimeout="true" />
    默认的端口是8080,但这个大家都知道,最好修改一下,假设修改为:8123,则如下:
   <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
         port="8123"     minProcessors="5" maxProcessors="75"
               enableLookups="true" redirectPort="8443"
               acceptCount="100" debug="0" connectionTimeout="0"
               useURIValidationHack="false" disableUploadTimeout="true" />
   3.找到以下8009端口的地方,这个很重要,通过8009,tomcat与apache互相通讯,如果下面的部分
被<!---->注释掉,一定要把<!---->去掉.
    <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
               port="8009" minProcessors="5" maxProcessors="75"
               enableLookups="true" redirectPort="8443"
               acceptCount="10" debug="0" connectionTimeout="0"
               useURIValidationHack="false"
               protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>
    第五步:配置tomcat的conf/web.xml文件:
    类似于apache下404错误页面的配置,在最后</web-app>一行之前加入以下内容:
      
       <error-page> 
        <error-code>404</error-code>
        <location>/error/noFile.htm</location> 
      </error-page>
      <error-page>
       <exception-type>java.lang.NullPointerException</exception-type> 
       <location>/error/error.jsp</location> 
      </error-page>
      第一个<error-page></error-page>之间的是404未找到jsp网页的错误导向页面,使之发生404错误时,
网页导向至/error/noFile.htm,也可以用类似方法添加其多的错误代码导向页面。
      第二个<error-page></error-page>之间的是当jsp网页出现java.lang.NullPointerException导常时
导向至/error/error.jsp错误页面。那么需要在第个jsp网页中加入以下内容:
      <%@ page  errorPage="/error/error.jsp" %>
      典型的error.jsp错误页面的程序写法如下:
   
    <%@ page contentType="text/html;charset=GB2312"%> 
    <%@ page isErrorPage="true"%>
    <html>
    <head><title>错误页面</title></head>

    <body>
    出错了:</p> 错误信息: <%= exception.getMessage() %><br>

    Stack Trace is : <pre><font color="red"><%
    java.io.CharArrayWriter cw = new java.io.CharArrayWriter();
    java.io.PrintWriter pw = new java.io.PrintWriter(cw,true);
    exception.printStackTrace(pw);
    out.println(cw.toString());
    %></font></pre>
    </body>
    </html>
        当出现NullPointerException异常时tomcat会把网页导入到error.jsp,且会打印出出错信息。
        第五步主要是安全考虑,在正常情况下,如果找不到网页即出现404错误或者jsp程序出错,在客户端
    会列举出类似于如下的信息(以tomcat为例,resin类似):
      HTTP Status 404 - /sdags.jsp

      --------------------------------------------------------------------------------
      type Status report
      message /sdags.jsp
      description The requested resource (/sdags.jsp) is not available.
       --------------------------------------------------------------------------------

      Apache Tomcat/5.0.19
      
      这样服务器版本会被别人看到,如果完成第五步的配置,就不会出现这种情况.
    第六步:配置httpd.conf文件
    这种方法把tomcat和apache的根目录设置为同一目录,但是必须限制客户对目录下一些文件的访问,比如存入class
的web-inf,在httpd.conf下添加以下代码:
        #deny the access to WEB-INF
    <Directory ~ "/WEB-INF/"> 
          Order allow,deny 
          Deny from all 
    </Directory> 
     这样,当试图记问http://localhost/web-inf/时,apache将会拒绝.
      
     到此为至,tomcat和apache的整合就完成啦.重新启动tomcat和apache,
 把jsp网页放到d:\server\www\下,例如:
     <html>
    <h1>JSP test<hr>

    <%out.println("Hello World!");%>

    </html>
    存为index.jsp,在IE中输入http://localhost:8123/index.jsp
    如果出现了
    Hello World!
    刚说明tomcat运行正常,在IE中输入http://localhost/index.jsp,如果也出现
    Hello World!
    恭喜你!整合成功啦,你在jsp漫长艰辛的道路上迈出了一大步~!

    以上整合文章我是在仓促的的时间完成的,可能有些错误。或考虑不周的地方,但是总体应该没
 太大问题,我是反复使用这种方法整合成功的。如果有疑问,可以直接给我联系.   moonsbird:    mail:pengw97@163.com

posted @ 2009-02-12 14:52 hunterjie 阅读(85) | 评论 (0) | 编辑 收藏

详细介绍五种JSP跳转方法

   是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递.

  但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面.

  重定向后浏览器地址栏URL不变.

  例:在servlet中进行重定向

public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
  response.setContentType("text/html; charset=gb2312");
  ServletContext sc = getServletContext();
  RequestDispatcher rd = null;
  rd = sc.getRequestDispatcher("/index.jsp"); //定向的页面
  rd.forward(request, response);
}

  通常在servlet中使用,不在jsp中使用。

   2.response.sendRedirect()

  是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.

  重定向后在浏览器地址栏上会出现重定向页面的URL

  例:在servlet中重定向

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
  response.setContentType("text/html; charset=gb2312");
  response.sendRedirect("/index.jsp");
}

  由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。

  注意:

   (1) 使用response.sendRedirect时,前面不能有HTML输出

  这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说 JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。

   (2) response.sendRedirect之后,应该紧跟一句return;

  我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。

  比较:

   (1) Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;

   (2) response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。

  前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.

  注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。

   3.

  它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。

  如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。

  另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交

   4.修改HTTP header的Location属性来重定向

  通过设置直接修改地址栏来实现页面的重定向。

   jsp文件代码如下:

<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn = "/newpath/jsa.jsp";
response.setHeader("Location",newLocn);
%>

   5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面

  在html文件中,下面的代码:



  它的含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。

  由上可知,可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。

  关键代码:

String content=stayTime+"; URL="+URL;
response.setHeader("REFRESH",content);


[转自:http://java.csdn.net/page/9936337a-05d6-4a72-a4f6-7db9c95597fd]

posted @ 2009-02-12 11:55 hunterjie 阅读(45) | 评论 (0) | 编辑 收藏

2008年9月18日

J2EE的OA项目[转]

我现在正在做一个J2EE的OA项目,基于安全保密考虑,项目名称以下称为J2EEOA。现在,项目的系统需求和设计阶段都已做完,正处在编码阶段。在这个过程中有很多开发心得和体会,不吐不快。在这里,整理出来与大家一同分享。

文章中应用大量专业术语,所以在阅读前,您应有一定的基础知识,如java language、jsp、servlet、j2ee、ejb、ejb-ql、structs(MVC)、jboss、ant等。为了帮助大家更好的阅读,把相关知识链接列在下面。

1.JBoss Application Server :
http://www.jboss.org/
或者http://sourceforge.net/projects/jboss/
2.Java Language Specification
http://java.sun.com/docs/books/jls/
或者http://java.sun.com/products/javahelp/whitepaper.html
3.JDK
http://java.sun.com/j2se
4.J2EE
http://java.sun.com/j2ee
5.ANT
http://jakarta.apache.org/ant/index.html
6.Structs
http://jakarta.apache.org/struts/
7.JSP
http://java.sun.com/products/jsp/
8.Servlet
http://java.sun.com/products/servlet/
9.EJB
http://java.sun.com/products/ejb/
10.EJB-QL
http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/EJBQL.html
安装和配置JBoss Application Server

今天的工作主要是安装JBoss。下面在介绍JBoss之后重点讲解配置JBoss Application Server后我总结出的经验。
为什么要选择JBoss作应用服务器?


http://blog.csdn.net/zhaoshuxian/archive/2006/09/17/1232772.aspx 

posted @ 2008-09-18 11:55 hunterjie 阅读(82) | 评论 (0) | 编辑 收藏

2008年7月17日

IT人士群聚喝酒的讲究[转帖]

大家喝的是啤酒,这时你入座了……
你给自己倒了杯可乐,这叫低配置。
你给自已倒了杯啤酒,这叫标准配置。
你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。
你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。
你的同事给你倒了杯白酒,这叫推荐配置。
人到齐了,酒席开始了。
你先一个人喝了一小口,这叫单元测试。
你跟旁边的人说哥们咱们随意,这叫交叉测试。
但是他说不行,这杯要干了,这叫压力测试。
于是你说那就大家一起来吧,这叫内部测试。
这个时候boss向全场举杯了,这叫公开测试。
菜过三巡,你就不跟他们客气了。
你向对面的人敬酒,这叫p2p.
你向对面的人敬酒,他回敬你,你又再敬他……,这叫tcp.
你向一桌人挨个敬酒,这叫令牌环。
你说只要是兄弟就干了这杯,这叫广播。
可是你的上司jj听了不高兴了,只有兄弟么,罚酒三杯。这叫炸弹。
可是你的下级mm听了不高兴了,我喝一口,你喝一杯,这叫恶意攻击。
有一个人过来向这桌敬酒,你说不行你先过了我这关,这叫防火墙。
你的小弟们过来敬你酒,这叫一对多。
你是boss,所有人过来敬你酒,这叫服务器。
酒是一样的,可是喝法是不同的。
你喝了一杯,boss喝了一口,这叫c#。
你喝了一杯,mm喝了一口,这叫vb。
你喝了一杯,你大哥喝了半杯,这叫c++。
你喝了半杯,你小弟喝了一杯,这叫汇编。
你喝了一杯,你的搭档也喝了一杯,这叫c。
死就是一念的事,活着却是一辈子的事,所以活着比死更需要勇气 says:
酒是一样的,可是喝酒的人是不同的。
你越喝脸越红,这叫频繁分配释放资源。
你越喝脸越白,这叫资源不释放。
你已经醉了,却说我还能喝,叫做资源额度不足。
你明明能喝,却说我已经醉了,叫做资源保留。
你喝一段时间就上厕所,这叫cache。
酒过三巡,你也该活动活动了。
你一桌一桌的走,这叫轮巡。
你突然看到某一桌的漂亮mm,走了过去,这叫优先级。
你去了坐下来就不打算走了,这叫死循环。
你的老大举杯邀你过去,你只好过去,这叫激活事件。
你向一桌敬酒,他们说不行不行我们都喝白的,于是你也喝白的,这叫本地化。
你向boss敬酒,可是boss被围了起来,你只能站在外圈,这叫排队。
你终于到了内圈,小心翼翼的向前一步,这叫访问临界区。
你拍着boss的肩膀说哥们咱们喝一杯,这叫越界。
你不知喝了几圈了,只会说两个字,干了,这叫udp。
可是还有人拿着酒瓶跑过来说,刚才都没跟你喝,这叫丢包。
喝酒喝到最后的结果都一样
你突然跑向厕所,这叫捕获异常。
你在厕所吐了,反而觉得状态不错,这叫清空内存。
你在台面上吐了,觉得很惭愧,这叫程序异常。
你在boss面前吐了,觉得很害怕,这叫系统崩溃。
你吐到了boss身上,只能索性晕倒了,这叫硬件休克 。

posted @ 2008-07-17 09:02 hunterjie 阅读(96) | 评论 (0) | 编辑 收藏

2008年7月9日

JAR 文件揭密

探索 JAR 文件格式的强大功能

developerWorks
文档选项
将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送


级别: 初级

Pagadala J. Suresh (pjsuresh@in.ibm.com), 软件工程师, IBM Global Services India
Palaniyappan Thiagarajan (tpalaniy@in.ibm.com), 软件工程师, IBM Global Services India

2003 年 11 月 15 日

大多数 Java 程序员都熟悉对 JAR 文件的基本操作。但是只有少数程序员了解 JAR 文件格式的 强大功能。在本文中,作者探讨了JAR 格式的许多功能和优势,包括打包、可执行的 JAR 文件、安全性和索引。

JAR 文件是什么?

JAR 文件格式以流行的 ZIP 文件格式为基础,用于将许多个文件聚集为一个文件。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。

一个 JAR 文件可以用于:

  • 用于发布和使用类库
  • 作为应用程序和扩展的构建单元
  • 作为组件、applet 或者插件程序的部署单位
  • 用于打包与组件相关联的辅助资源

JAR 文件格式提供了许多优势和功能,其中很多是传统的压缩格式如 ZIP 或者 TAR 所没有提供的。它们包括:

  • 安全性。可以对 JAR 文件内容加上数字化签名。这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是否被篡改过。
  • 减少下载时间。 如果一个 applet 捆绑到一个 JAR 文件中,那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件打开一个新连接。
  • 压缩。JAR 格式允许您压缩文件以提高存储效率。
  • 传输平台扩展。 Java 扩展框架(Java Extensions Framework)提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 开发的扩展例子)。
  • 包密封。存储在 JAR 文件中的包可以选择进行 密封,以增强版本一致性和安全性。密封一个包意味着包中的所有类都必须在同一 JAR 文件中找到。
  • 包版本控制。一个 JAR 文件可以包含有关它所包含的文件的数据,如厂商和版本信息。
  • 可移植性。处理 JAR 文件的机制是 Java 平台核心 API 的标准部分。

压缩的和未压缩的 JAR

jar 工具(有关细节参阅 jar 工具 )在默认情况下压缩文件。未压缩的 JAR 文件一般可以比压缩过的 JAR 文件更快地装载,因为在装载过程中要解压缩文件,但是未压缩的文件在网络上的下载时间可能更长。

META-INF 目录

大多数 JAR 文件包含一个 META-INF 目录,它用于存储包和扩展的配置数据,如安全性和版本信息。Java 2 平台识别并解释 META-INF 目录中的下述文件和目录,以便配置应用程序、扩展和类装载器:

  • MANIFEST.MF。这个 manifest 文件定义了与扩展和包相关的数据。
  • INDEX.LIST。 这个文件由 jar 工具的新选项 -i 生成,它包含在应用程序或者扩展中定义的包的位置信息。它是 JarIndex 实现的一部分,并由类装载器用于加速类装载过程。
  • xxx.SF。 这是 JAR 文件的签名文件。占位符 xxx标识了签名者。
  • xxx.DSA。 与签名文件相关联的签名程序块文件,它存储了用于签名 JAR 文件的公共签名。

jar 工具

为了用 JAR 文件执行基本的任务,要使用作为Java Development Kit 的一部分提供的 Java Archive Tool ( jar 工具)。用 jar 命令调用 jar 工具。表 1 显示了一些常见的应用:

表 1. 常见的 jar 工具用法

功能 命令
用一个单独的文件创建一个 JAR 文件 jar cf jar-file input-file...
用一个目录创建一个 JAR 文件 jar cf jar-file dir-name
创建一个未压缩的 JAR 文件 jar cf0 jar-file dir-name
更新一个 JAR 文件 jar uf jar-file input-file...
查看一个 JAR 文件的内容 jar tf jar-file
提取一个 JAR 文件的内容 jar xf jar-file
从一个 JAR 文件中提取特定的文件 jar xf jar-file archived-file...
运行一个打包为可执行 JAR 文件的应用程序 java -jar app.jar





回页首


可执行的 JAR

一个 可执行的 jar 文件是一个自包含的 Java 应用程序,它存储在特别配置的JAR 文件中,可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的 JAR 中的应用程序,必须将它加入到您的类路径中,并用名字调用应用程序的主类。但是使用可执行的 JAR 文件,我们可以不用提取它或者知道主要入口点就可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用程序。

创建可执行 JAR

创建一个可执行 JAR 很容易。首先将所有应用程序代码放到一个目录中。假设应用程序中的主类是 com.mycompany.myapp.Sample 。您要创建一个包含应用程序代码的 JAR 文件并标识出主类。为此,在某个位置(不是在应用程序目录中)创建一个名为 manifest 的文件,并在其中加入以下一行:

Main-Class: com.mycompany.myapp.Sample
                        

然后,像这样创建 JAR 文件:

jar cmf manifest ExecutableJar.jar application-dir
                        

所要做的就是这些了 -- 现在可以用 java -jar 执行这个 JAR 文件 ExecutableJar.jar。

一个可执行的 JAR 必须通过 menifest 文件的头引用它所需要的所有其他从属 JAR。如果使用了 -jar 选项,那么环境变量 CLASSPATH 和在命令行中指定的所有类路径都被 JVM 所忽略。

启动可执行 JAR

既然我们已经将自己的应用程序打包到了一个名为 ExecutableJar.jar 的可执行 JAR 中了,那么我们就可以用下面的命令直接从文件启动这个应用程序:

java -jar ExecutableJar.jar
                        





回页首


包密封

密封 JAR 文件中的一个包意味着在这个包中定义的所有类都必须在同一个 JAR 文件中找到。这使包的作者可以增强打包类之间的版本一致性。密封还提供了防止代码篡改的手段。

要密封包,需要在 JAR 的 manifest 文件中为包添加一个 Name 头,然后加上值为“true”的 Sealed 头。与可执行的 JAR 一样,可以在创建 JAR 时,通过指定一个具有适当头元素的 manifest 文件密封一个 JAR,如下所示:

Name: com/samplePackage/
                        Sealed: true
                        

Name 头标识出包的相对路径名。它以一个“/”结束以与文件名区别。在 Name 头后面第一个空行之前的所有头都作用于在 Name 头中指定的文件或者包。在上述例子中,因为 Sealed 头出现在 Name 头后并且中间没有空行,所以 Sealed 头将被解释为只应用到包 com/samplePackage 上。

如果试图从密封包所在的 JAR 文件以外的其他地方装载密封包中的一个类,那么 JVM 将抛出一个 SecurityException 。

扩展打包
扩展为 Java 平台增加了功能,在 JAR 文件格式中已经加入了扩展机制。扩展机制使得 JAR 文件可以通过 manifest 文件中的 Class-Path 头指定所需要的其他 JAR 文件。

假设 extension1.jar 和 extension2.jar 是同一个目录中的两个 JAR 文件,extension1.jar 的 manifest 文件包含以下头:

Class-Path: extension2.jar
                        

这个头表明 extension2.jar 中的类是 extension1.jar 中的类的 扩展类。extension1.jar 中的类可以调用 extension2.jar 中的类,并且不要求 extension2.jar 处在类路径中。

在装载使用扩展机制的 JAR 时,JVM 会高效而自动地将在 Class-Path 头中引用的 JAR 添加到类路径中。不过,扩展 JAR 路径被解释为相对路径,所以一般来说,扩展 JAR 必须存储在引用它的 JAR 所在的同一目录中。

例如,假设类 ExtensionClient 引用了类 ExtensionDemo ,它捆绑在一个名为 ExtensionClient.jar 的 JAR 文件中,而类 ExtensionDemo 则捆绑在 ExtensionDemo.jar 中。为了使 ExtensionDemo.jar 可以成为扩展,必须将 ExtensionDemo.jar 列在 ExtensionClient.jar 的 manifest 的 Class-Path 头中,如下所示:

Manifest-Version: 1.0
                        Class-Path: ExtensionDemo.jar
                        

在这个 manifest 中 Class-Path 头的值是没有指定路径的 ExtensionDemo.jar,表明 ExtensionDemo.jar 与 ExtensionClient JAR 文件处在同一目录中。





回页首


JAR 文件中的安全性

JAR 文件可以用 jarsigner 工具或者直接通过 java.security API 签名。一个签名的 JAR 文件与原来的 JAR 文件完全相同,只是更新了它的 manifest,并在 META-INF 目录中增加了两个文件,一个签名文件和一个签名块文件。

JAR 文件是用一个存储在 Keystore 数据库中的证书签名的。存储在 keystore 中的证书有密码保护,必须向 jarsigner 工具提供这个密码才能对 JAR 文件签名。


图 1. Keystore 数据库
Keystore 数据库

JAR 的每一位签名者都由在 JAR 文件的 META-INF 目录中的一个具有 .SF 扩展名的签名文件表示。这个文件的格式类似于 manifest 文件 -- 一组 RFC-822 头。如下所示,它的组成包括一个主要部分,它包括了由签名者提供的信息、但是不特别针对任何特定的 JAR 文件项,还有一系列的单独的项,这些项也必须包含在 menifest 文件中。在验证一个签名的 JAR 时,将签名文件的摘要值与对 JAR 文件中的相应项计算的摘要值进行比较。


清单 1. 签名 JAR 中的 Manifest 和 signature 文件
Contents of signature file META-INF/MANIFEST.MF
                        Manifest-Version: 1.0
                        Created-By: 1.3.0 (Sun Microsystems Inc.)
                        Name: Sample.java
                        SHA1-Digest: 3+DdYW8INICtyG8ZarHlFxX0W6g=
                        Name: Sample.class
                        SHA1-Digest: YJ5yQHBZBJ3SsTNcHJFqUkfWEmI=
                        Contents of signature file META-INF/JAMES.SF
                        Signature-Version: 1.0
                        SHA1-Digest-Manifest: HBstZOJBuuTJ6QMIdB90T8sjaOM=
                        Created-By: 1.3.0 (Sun Microsystems Inc.)
                        Name: Sample.java
                        SHA1-Digest: qipMDrkurQcKwnyIlI3Jtrnia8Q=
                        Name: Sample.class
                        SHA1-Digest: pT2DYby8QXPcCzv2NwpLxd8p4G4=
                        

数字签名

一个数字签名是.SF 签名文件的已签名版本。数字签名文件是二进制文件,并且与 .SF 文件有相同的文件名,但是扩展名不同。根据数字签名的类型 -- RSA、DSA 或者 PGP -- 以及用于签名 JAR 的证书类型而有不同的扩展名。

Keystore

要签名一个 JAR 文件,必须首先有一个私钥。私钥及其相关的公钥证书存储在名为 keystores 的、有密码保护的数据库中。JDK 包含创建和修改 keystores 的工具。keystore 中的每一个密钥都可以用一个别名标识,它通常是拥有这个密钥的签名者的名字。

所有 keystore 项(密钥和信任的证书项)都是用唯一别名访问的。别名是在用 keytool -genkey 命令生成密钥对(公钥和私钥)并在 keystore 中添加项时指定的。之后的 keytool 命令必须使用同样的别名引用这一项。

例如,要用别名“james”生成一个新的公钥/私钥对并将公钥包装到自签名的证书中,要使用下述命令:

keytool -genkey -alias james -keypass jamespass
                        -validity 80 -keystore jamesKeyStore
                        -storepass jamesKeyStorePass
                        

这个命令序列指定了一个初始密码“jamespass”,后续的命令在访问 keystore “jamesKeyStore”中与别名“james”相关联的私钥时,就需要这个密码。如果 keystore“jamesKeyStore”不存在,则 keytool 会自动创建它。

jarsigner 工具

jarsigner 工具使用 keystore 生成或者验证 JAR 文件的数字签名。

假设像上述例子那样创建了 keystore “jamesKeyStore”,并且它包含一个别名为“james”的密钥,可以用下面的命令签名一个 JAR 文件:

jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass
                        -keypass jamespass -signedjar SSample.jar Sample.jar james
                        

这个命令用密码“jamesKeyStorePass”从名为“jamesKeyStore”的 keystore 中提出别名为“james”、密码为“jamespass”的密钥,并对 Sample.jar 文件签名、创建一个签名的 JAR -- SSample.jar。

jarsigner 工具还可以验证一个签名的 JAR 文件,这种操作比签名 JAR 文件要简单得多,只需执行以下命令:

jarsigner -verify SSample.jar
                        

如果签名的 JAR 文件没有被篡改过,那么 jarsigner 工具就会告诉您 JAR 通过验证了。否则,它会抛出一个 SecurityException , 表明哪些文件没有通过验证。

还可以用 java.util.jar 和 java.security API 以编程方式签名 JAR(有关细节参阅 参考资料)。也可以使用像 Netscape Object Signing Tool 这样的工具。





回页首


JAR 索引

如果一个应用程序或者 applet 捆绑到多个 JAR 文件中,那么类装载器就使用一个简单的线性搜索算法搜索类路径中的每一个元素,这使类装载器可能要下载并打开许多个 JAR 文件,直到找到所要的类或者资源。如果类装载器试图寻找一个不存在的资源,那么在应用程序或者 applet 中的所有 JAR 文件都会下载。对于大型的网络应用程序和 applet,这会导致启动缓慢、响应迟缓并浪费带宽。

从 JDK 1.3 以后,JAR 文件格式开始支持索引以优化网络应用程序中类的搜索过程,特别是 applet。JarIndex 机制收集在 applet 或者应用程序中定义的所有 JAR 文件的内容,并将这些信息存储到第一个 JAR 文件中的索引文件中。下载了第一个 JAR 文件后,applet 类装载器将使用收集的内容信息高效地装载 JAR 文件。这个目录信息存储在根 JAR 文件的 META-INF 目录中的一个名为 INDEX.LIST 的简单文本文件中。

创建一个 JarIndex
可以通过在 jar 命令中指定 -i 选项创建一个 JarIndex。假设我们的目录结构如下图所示:


图 2. JarIndex
JarIndex Demo

您将使用下述命令为 JarIndex_Main.jar、JarIndex_test.jar 和 JarIndex_test1.jar 创建一个索引文件:

jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar
                        

INDEX.LIST 文件的格式很简单,包含每个已索引的 JAR 文件中包含的包或者类的名字,如清单 2 所示:


清单 2. JarIndex INDEX.LIST 文件示例
JarIndex-Version: 1.0
                        JarIndex_Main.jar
                        sp
                        JarIndex_test.jar
                        Sample
                        SampleDir/JarIndex_test1.jar
                        org
                        org/apache
                        org/apache/xerces
                        org/apache/xerces/framework
                        org/apache/xerces/framework/xml4j
                        





回页首


结束语

JAR 格式远远超出了一种压缩格式,它有许多可以改进效率、安全性和组织 Java 应用程序的功能。因为这些功能已经建立在核心平台 -- 包括编译器和类装载器 -- 中了,所以开发人员可以利用 JAR 文件格式的能力简化和改进开发和部署过程。.



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • 参阅 jar 实用程序的命令行选项的文档。


  • Raffi Krikorian 在 ONJava 上发表的文章提供了有关 programmatically signing a JAR file的帮助。


  • 文章“ Java Web Start”( developerWorks,2001 年 9 月)描述了如何使用这种技术,以便允许应用程序可以指定所需的 JAR 文件并动态下载它们。


  • 在 developerWorks Java 技术专区 上可以找到数百篇关于 Java 编程的各个方面的文章。



作者简介

Photo of Pagadala Suresh

Pagadala J. Suresh 是 IBM Global Services India 的软件工程师。他擅长的领域包括 Java 技术、WebSphere Application Server 和 WebSphere Studio Application Developer (WSAD)、Ariba Buyer。他参与了 WebSphere 的 IBM Redbook 项目。可以通过 pjsuresh@in.ibm.com 与 Pagadala 联系。


Photo of Palaniyappan Thiagarajan

Palaniyappan Thiagarajan 是位于印度班加罗尔的 IBM Global Services India 的软件工程师。他是IBM 认证的 IBM WebSphere Application Server V3.5 和 IBM DB2 UDB V7.1 Family Fundamentals 专家。可以通过 tpalaniy@in.ibm.com 与 Palaniyappan 联系。

posted @ 2008-07-09 09:26 hunterjie 阅读(75) | 评论 (0) | 编辑 收藏

2008年6月17日

[java]程序员的爱情表白(转载)

程序员的爱情表白:
       我能抽象出整个世界...
  但是我不能抽象出你...
  因为你在我心中是那么的具体...
  所以我的世界并不完整...
  我可以重载甚至覆盖这个世界里的任何一种方法...
  但是我却不能重载对你的思念...
  也许命中注定了 你在我的世界里永远的烙上了静态的属性...
  而我不慎调用了爱你这个方法...
  当我义无返顾的把自己作为参数传进这个方法时...
  我才发现爱上你是一个死循环...
  它不停的返回对你的思念压入我心里的堆栈...
  在这无尽的黑夜中...
  我的内存里已经再也装不下别人...
  我不停的向系统申请空间...
  但却捕获一个异常---我爱的人不爱我...
  为了解决这个异常...
  我愿意虚拟出最后一点内存...
  把所有我能实现的方法地址压入堆栈...
  并且在栈尾压入最后一个方法---将字符串″我爱你,你爱我吗?″传递给你...
  如果返回值为真--我将用尽一生去爱你...
  否则--我将释放掉所有系统资源..

posted @ 2008-06-17 09:48 hunterjie 阅读(110) | 评论 (0) | 编辑 收藏

2008年3月22日

偶的JAVA情结

对JAVA一直有一种说不出的情绪,现在决定选择这里作为我学习的新的平台。

posted @ 2008-03-22 18:32 hunterjie 阅读(100) | 评论 (0) | 编辑 收藏

仅列出标题  
 
Powered by:
BlogJava
Copyright © hunterjie