回 帖 发 新 帖 刷新版面

主题:[讨论]JAVA学习日记

本人在北京传智播客进行精英班的培训,在课余时间整理了下JAVA日记!发到这里!与大家分享!!希望可以帮助些什么!!

1. 同学的一个问题
他用javac(1.4)编译,用java(1.6)运行,出现不支持的类版本错误。我们用javac -version和java -version各看了一下版本,就发现了这个问题。然后查看path环境变量,发现他计算机上安装了oracle,oracle/bin排在了整个path的前面,调整path,让jdk1.6/bin排在最前面即可。
2. 由内存中一切皆二进制引出字符编码的讲解
大陆写的“中”到台湾显示不正常的原理分析,翻译软件的翻译原理,GBK-->“中”-->BIG5。讲解UTF-8编码和unicode编码,ASCII与Unicode码的转换规则,演示记事本显示字符时的趣味问题,分析乱码原因,GB2312码中也包含英文字符,如何识别GB2312码中的英文与汉字。最后课结束时讲了GB18030,如何支持?
3. xml文档中设置encoding属性的重要性
xml文档保存的编码类型和encoding指定的编码方式是两码事,前者表示xml文档内容的编码方式而后者是告诉解析器以什么编码方式来解析xml文档。二者必须一致,否则在浏览器中打开xml文档就会出现问题。默认情况下encoding属性的值是UTF-8。
沈继龙:以为指定了encoding="GBK",那文件就用GBK保存了,这正好理解反了。我是张,我戴顶帽子说明我是张,以便解析软件知道我是谁,如果我戴顶李的帽子,解析软件就认为我是李,显然就出了问题。
4. CDATA区
要小心的是XML文档是通过一个程序生成出来的,如下所示的一个jsp程序,对于用变量生成的信息,
要特别注意加上CDATA区。
<%@page pageEncoding="GBK"%>
<%@page contentType="text/xml;charset=UTF-8"%>
<?xml version="1.0" encoding="UTF-8"?>
<country>
        <name>中国</name>
        <info><![CDATA[${param.info}]]></info>
</country>
这个JSP文件涉及了两个编码:源文件是用什么码写的,程序执行后以什么码输出结果。
为了加深理解处理软件必须文件中的字符编码的情况,又演示了javac编译utf-8源文件的问题。
与CDATA区类似的一个小技巧:
        <%@page pageEncoding="GBK"%>
        <form>
            <input type="hidden" name="email" value="${param.email}"/>
            请输入用户名:<input type="text" name="name" />
        </form>
如果给隐藏字段传递的参数是“zxx" a="b”,那么也会出问题,对于程序生成值时,一定要考虑值的特殊情况。
5. 编码转换
编码转换程序:
        char [] codes = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        byte b = (byte)Integer.parseInt(args[0]);
        System.out.print(codes[((b>>4) & 0x0f)]);
        System.out.println(codes[(b & 0x0f)]);    
得到字符的big5码
<%@page pageEncoding="GBK"%>
<%@page contentType="text/html;charset=GBK"%>//修改contentType="audio/x-mp3"说明头的作用
<%
    String china="中一二";
    for(int i=0;i<china.length();i++)
    {
        out.println(Integer.toHexString((int)china.charAt(i)));
    }
    System.out.println();
    byte[] bufGBK = china.getBytes("GBK");
    for(int i=0;i<bufGBK.length;i++)
    {
        out.println(Integer.toHexString(bufGBK [i]));
    }
    byte[] buf = china.getBytes("Big5");
    for(int i=0;i<buf.length;i++)
    {
        out.println(Integer.toHexString(buf[i]));
    }
    byte [] buf ={0xa4, 0xa4,0xa4,0x40,0xa4,0x47}
%>
输出big5码给浏览器:
<%
    byte [] buf ={(byte)0xa4, (byte)0xa4,(byte)0xa4,(byte)0x40,(byte)0xa4,(byte)0x47};
    response.getOutputStream().write(buf);
%>
6. 区分中文英文的程序代码
buf[] = new byte[1024];
int len = System.in.read(buf);
boolean halfChinese = false;
for(int i=0;i<len;i++)
{
    if(halfChinese)
    {
        //buf[i-1] + buf[i]合并
        System.out.write('[');
        Systen.out.write(buf[i-1]);
        Systen.out.write(buf[i]);
        System.out.write(']');
        halfChinese = false;
        continue;
    }
    if((buf[i] & 0x80) == 0)
    {
        //为什么必须用write???
        System.out.write('[');
        Systen.out.write(buf[i]);
        System.out.write(']');
    }
    else
    {
        halfChinese = true;
        //等下一个,暂时不处理
        /*
        System.out.write('[');
        Systen.out.write(buf[i++]);
        Systen.out.write(buf[i]);
        System.out.write(']');
        */
    }
}
System.out.write();方法要用flush();刷新缓存,才能正常显示。
我写的代码,但还有地方没弄明白:为什么去掉了if()判断是否有'\r','\n'后,显示的结果不正常。
import java.io.*;
class TestInputChinese {
    public static void main(String[] args) {
        byte[] buf = new byte[1024];
        int len = 0;
        try {
            len = System.in.read(buf);
        }catch(IOException e) {
            e.printStackTrace();
        }
        change(buf, len);
    }
    public static void change(byte[] b, int len) {
        for( int i=0; i<len; i++ ) {
            if(b[i] == '\r' || b[i] == '\n' ) {
                continue;
            }
            if((b[i] & 0x80) == 0 ) {
                System.out.write('[');
                System.out.write(b[i]);
                System.out.write(']');
            } else {
                System.out.write('[');
                System.out.write(b[i++]);
                System.out.write(b[i]);
                System.out.write(']');
            }
        }
        System.out.flush();
    }
}

回复列表 (共23个回复)

沙发

收下,谢谢...

板凳


1. 换皮肤问题
换肤问题,“内容与表现相分离”。一套内容,多套表现。xml文档提供内容,该怎么样显示,由css或xsl定义。以后尽量采用 DIV + CSS 模式。
一个简单的换皮肤例子:
<HTML>
    <HEAD>
        <META HTTP-EQUIT="Content-Type" content="text/html,charset=GBK" />
        <LINK rel="stylesheet" href="red.css" type="text/css" id="skin" />
        <title>换肤</title>
        <script>
            function chickSkin(name) {
                document.getElementById("skin").href=name;
                return false;
            }
        </script>
    </HEAD>
    <body>
        <span class="info">aaaaaa</span><br>
        <span class="info">bbbbbb</span><br>
        <span class="info">cccccc</span><br>
        <a href="#" onclick="return chickSkin('red.css')">红色</a>
        <a href="#" onclick="return chickSkin('green.css')">绿色</a>
    </body>
</HTML>
Css 代码如下:
red.css
.info {
    color:red;
    txt-decoration="none";
}
green.css
.info {
    color:green;
}
CSS中可以用 txt-decoration="none";去掉超连接的下划线。
小知识:
更改浏览器打开时的编码为GBK可以在<head></head>标签对内加入:<meta http-equiv="Content-Type" content="text/html;charset=GBK">
2. 浏览器与web服务器互交的过程
讲述了浏览器与web服务器互交的过程,分析程序:
import java.net.*;
import java.io.*;
public class HttpServer
{
    public static void main(String [] args) throws Exception
    {
        ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0]));
        while(true)
        {
            Socket socket  = serverSocket.accept();
            new Thread(new Server(socket)).start();
        }
    }    
}    
class Server implements Runnable
{
            Socket s = null;
            public Server(Socket s)
            {
                this.s = s;
            }
            public void run()
            {
                try
                {
                    InputStream ips  = s.getInputStream();
                    BufferedReader br = new BufferedReader(new InputStreamReader(ips)); 
                    String line = br.readLine();
                    //GET /a.html HTTP/1.1
                    String firstLine = line;
                    while(/*(line == null) || */!"".equals(line))
                    {
                        System.out.println(line);
                        line = br.readLine();
                    }
                    String parts [] = firstLine.split(" +");
                    /*StringTokenizer st = new StringTokenizer(firstLine);
                    while(st.hasMoreToken())
                    {
                        st.nextToken();
                    }*/
                    System.out.println(parts[1]);
                    File f = new File("d:\\webcontent",parts[1].substring(1));
                    FileInputStream fis = new FileInputStream(f);
                    OutputStream ops = s.getOutputStream();
                    copyStream(fis,ops);
                    br.close();
                    ops.close();
                    fis.close();
                    s.close();
                }catch(Exception e){e.printStackTrace();}
            }
            void copyStream(InputStream fis,OutputStream ops) throws Exception
            {
                    byte [] buf = new byte[1024];
                    int len = 0;
                    while((len=fis.read(buf)) != -1)
                    {
                        ops.write(buf,0,len);
                    }
            }
}    

3 楼

呵呵
收下

4 楼


555555555 又遇乱码问题
在分析conf\server.xml时,如果在里面添加中文注释,那么startup.bat启动服务器则会出现错误。是因为编码问题,如果文件中出现中文,则文件读取错误,因为xml默认是以unicode编码存的。添加声明<?xml version="1.0" enconding="GB2312"?>或文件另存为编码为UTF-8则启动正常。
2. 怎样在telnet命令行窗口中显示本地回显
用ctrl+”]”然后按回车,再输入命令,telnet就可以本地回显。
3. 讲解Tomcat中的server.xml
(1)在分析conf\server.xml时,如果在里面添加中文注释,那么startup.bat启动服务器则会出现错误.是因为编码问题,如果文件中出现中文,则文件读取错误,因为xml默认是以unicode编码存的.添加声明<?xml version="1.0" encondin="GB2312"?>或文件另存为编码为UTF-8则启动正常。
(2)server.xml是给java执行的,所以在添盘符路径时可以不用\\来表示\,而java程序是给javac看的,编译器需要用\\来转意表示\,否则编译器会报错。
<Host></Host>之间添加<Context path="/abc" docBase="e:abc\"/> path代表浏览器中的目录,docBase代表path的设置中对应本地磁盘的目录。
(3)当用startup.bat启动tomcat时,如果server.xml配置有错误,那么startup.bat将闪一下就消失了,如果想让命令窗口停住,好方便查看错误信息,则用如下方法修改:修改catalina.bat,找到里面的:
:doStart
shift
if not "%OS%" == "Windows_NT" goto noTitle
set _EXECJAVA=start %_RUNJAVA%
goto gotTitle
:noTitle
set _EXECJAVA=start %_RUNJAVA%
:gotTitle
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy
goto execCmd
将上面set _EXECJAVA=start %_RUNJAVA% 中的start去掉,就可以让命令行出错后不消失。set _EXECJAVA=start %_RUNJAVA% 的意识是重新启动一个命令行窗口。去掉start后,则不会再重新启动窗口,就达到了使命令行停住的效果。要在命令行中启动startup.bat才能看到效果。
4. 配置虚拟子目录的三种方法
1.使用server.xml文件中的<context>元素。
2.在某个特定的目录中的xml文件中包含<Context>元素
例如:Tomcat5.x中主目录/conf/cat/localhost/manager.xml中的<Context>元素
3.<Host>元素的appBase属性所设置的应用程序基准目录中含有WEB-INF/web.xml文件的子目录会自动被映射成虚拟子目录。
4.<Host>元素的appBase属性所设置的应用程序基准目录中的war文件,这个war文件的名称也会自动被映射成虚拟子目录。
5. 其它知识点
将一个WAR的压缩包放到webapps目录下时,服务器会自动解压这个压缩文件。
Web.xml文件中
<welcome-file-list>
        <welcome-file>a.html</welcome-file>
       </welcome-file-list>
<welcome-file>内放如想要直接显示的页面(比如说欢迎页面),如果设置了该属性则站点下默认的网页就是a.html。

5 楼

1. 首先让大家解压安装tomcat,然后介绍和演示批处理文件的作用,接着执行bin目录下的startup.bat,结果出错,根据错误信息,我们知道要配置JAVA_HOME,可以在批处理文件中配置。
2测试Tomcat通过后,要求大家修改服务器的端口号为80,并加上注释,大家加完注释后,服务器就启动不了了。解决办法:加xml声明,或将文件保存为UTF-8。
3. 通过telnet localhost 8005关闭服务器的方式来演示如何打开telnet的本地回显功能。
4. 学员启动一个tomcat实例后,再启动tomcat,启动不了,找不出错误来,正好借用这个来说明如何修改catalina.bat,让错误可以停留下来,看错误信息。在讲解过程中演示了使用ActivePort软件看端口号。
5. 介绍Tomcat的体系结构设计原理,系统功能是通过xml配置出来的,大家要理解这种思想,接着讲解并要求大家使用server.xml文件中的<Context>元素配置好一个虚拟目录,分析了配置文件中的’\’不用写成’\\’的原理。
server.xml是给java执行的,所以在添盘符路径时可以不用\\来表示\,而java程序是给javac看的,编译器需要用’\\’来转意表示’\’,否则编译器会报错。
6. 讲解了war包的发布与如何做war包
jar -cvf webcontent.war webcontent/abc.html xyz/def.xml很好地说明jar命令要在结果中保留目录信息
7. 分析了有时候要设置CATALINA_HOME环境变量,有时候又可以不设置的情况
8. 设置WEB站点的根目录
配置conf/server.xml文件,在Host元素中添加Context,path属性值为空,将docBase的值指定为根目录的名字:
       <!-- 下面是将webapps目录中的目录指定成为根目录的方法. -->
       <!-- <Context path="" docBase="xx" reloadable="true" /> -->
9. 建立虚拟子目录的方法
    A: 配置conf/server.xml文件,在Host元素中添加Context:
 <!--配置当前主机的虚拟目录,使用Context元素,它有两个属性:path和docBase;path代表虚拟目录的名称,docBase指定本地目录。
注意:斜杠的方向,docBase里指定目录时只要一个斜杠,因为这个文件是给
java.exe程序看的,所以指定目录是不能用双斜杠如下例:
       <!-- <Context path="/w2" docBase="D:\www" /> -->
B. 在webapps目录中新建一个子目录,并在这个子目录里再新建一个WEB-INF目录,注意WEB-INF需大写
    C. 在conf文件夹,找到当前引擎中的当前主机文件夹,
      在当前主机文件夹内新建一个xml文档,这个xml的文件名,就是该虚拟目录的名字
      例:conf/<Engine name>/<Host name>/xy.xml ,xy 即是这个虚拟目录的名字
      该xml文件内容例:<Context docBase="d:\www" /> ,不需写path属性
发现 : 使用此方法 , 在虚拟目录文件夹中 , 建立一个WEB-INF文件夹中.放置一个web.xml文件,即:可为此虚拟目录单独进行WEB配置。
10. 配置默认首页,conf/web.xml
        修改<welcome-file-list>元素中的<welcome-file>index.html</welcome-file> 。conf/web.xml中的welcom-file-list文件应用于主机内所有WEB程序。
如需对每个WEB程序单独配置默认首页,则应在要配置的WEB程序中新建一个web.xml,将此xml文件放入WEB-INF文件夹中
11. 讲解了SSL(安全套接字),公钥,私钥,认证证书
讲解配置支持SSL协议的Tomcat,先说配置原理(tomcat只要加一个连接器,但这个连接器还需要在外部为它提供一些参数,即证书),对称加密与非对称加密,数据完整性校验、 数字签名,再引出数字证书,再讲解keytool产生证书。SSL会话原理:先非对称加密传递对称加密所用的密码,然后双方用这个密码对称加密和解密数据。我们只给服务器安装证书即可,SSL会话过程中的加密处理是浏览器与服务器自动完成的。

6 楼

收藏了,谢谢楼主分享

7 楼

太感谢啦!!收下啦~~~~

8 楼

呵呵!谢谢大家的关注,我会继续努力的,要支持我哟!!
1. 重要网站
http://jakarta.apache.org
2. Tomcat服务器的配置文件(server.xml)
E:\tomcat6\conf\server.xml
(1)关闭tomcat元素
<Server port="8005" shutdown="SHUTDOWN">用于关闭tomcat服务器
(2)修改TOMCAT端口号
在服务器配置文件中的 <Connector port="8080" protocol="HTTP/1.1"  maxThreads="150" connectionTimeout="20000" redirectPort="8443" /> 修改便可。
(3)要注意的问题
问题:如果在server.xml文件中加入中文,则服务器加载不起来了,
原因:是xml文件中没有设置编码
办法:第一行加入<?xml version="1.0" encoding="GB2312" ?>
当Tomcat启动出错的时候,一闪就过去了,说明在startup批处理文件中用dos的start命令启动了一个新窗口
在catalina.bat中找到下面这段代码:
========================================================
:doStart
shift
if not "%OS%" == "Windows_NT" goto noTitle
set _EXECJAVA=start "Tomcat" %_RUNJAVA%
goto gotTitle
:noTitle
set _EXECJAVA=start %_RUNJAVA%
=========================================================
将红色字符串删掉就可以看到错误
3. GlobalNamingResources元素
<GlobalNamingResources>
 <!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
 -->
<Resource name="UserDatabase" auth="Container"
 type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
 pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
服务器端创建对象供给Servlet或JSP使用,例如数据库连接池对象
4. Service元素
<Service name="Catalina">
5. Engine元素
<Engine name="Catalina" defaultHost="localhost">
在一个服务器引擎上可以通过在这个元素里增加子元素<Host>来配置多个主机,
在<Host>元素中配置<Context>子元素可以增加多个站点(Web应用程序)
5. 配置一个站点(Web应用程序)
<Context path="/TestApp" docBase="e:\TestApp" />
参数path是用于浏览器访问的站点根目录
参数docBase是对应的硬盘上的物理目录
tomcat默认部署目录:tomcat/webapps/
6. 配置元素里的斜杠问题
在配置文件里的路径不用双斜杠
java源程序中的路径用双斜杠,是用于给编译器javac的,编译器会把双斜杠转换为单斜杠
而配置文件中的路径是给虚拟机java的,会直接读取单斜杠
7. 查看端口占用情况 
netstat -na 但不知道端口被谁占用
可以用ActivePort.exe软件查看
netstat -na | findstr 3306
查找指定端口有没有被占用
8. 设置默认根目录
==========================================================
默认根目录,浏览器访问网站时,不用再写目录名
方法一: 在server.xml中加入
<Context path="" docBase="e:\TestApp" />
方法二: 把工程放入webapps下,并一定要起名为ROOT
==========================================================
方法三: conf\Catalina\localhost\*.xml

Catalina是对应的引擎,有多少个引擎,在这就有多少个目录
Localhost 对应的是站点,有多少个站点,就有多少个目录,这个目录中又有多个xml配置文件,每个配置文件都对应一个Web应用程序。
在xml文件中写入<Context docBase="e:\test">元素,虚拟目录名字属性(path)不用写,虚拟目录名就是这个xml的文件名。
方法三在tomcat5.5中操作成功,在6中不推荐使用,但是也可以根据server.xml配置文件中的引擎,站点,web应用程序结构手工写入目录文件结构
9. 将项目打成war包
打成包的项目放到webapps下面不用解压,tomcat会将项目自动解压展开
打包后会自动生成META-INF文件夹
进入要打包的文件夹:jar -cvf webcontent.war .(点代表当前目录)
或者不进入文件夹:jar -cvf webcontent.war -C webcontent .
-C 代表改变目录
10. conf/web.xml通用配置文件
为所有的web应用程序进行配置,通用配置文件
配置默认网页(欢迎页面)
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
如果没找到对应的网页则打印文件列表报错
11. 批处理实例
batch 批
@echo hehe  加@的作用是不会让echo命令显示出来
或者直接设置@echo off ,整个批处理文件就不会显示命令
变量要用双引号引起来 "%OS%"
12. 连接器
https协议支持加密,默认端口号为443
要支持https协议,需要加入连接器
在tomcat/conf/server.xml中存在一个元素:(默认被注释掉)
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
 clientAuth="false" sslProtocol="TLS" />
必须为这个连接器申请一个证书,这个证书由专门的机构颁发审核
产生一个证书用JAVA_HOME/bin/keytool命令 查帮助文档,再将这个加入到连接器<Connector>元素
13. 对称加密和非对称加密
对称加密: 加密密码和解秘密密码相同
非对称加密:加密密码和解密密码不同,共钥加密的数据可以被私钥解密,私钥加密的数据也能被公钥解密,发钥的必须是个权威机构(CA)
根据要传输的数据计算出一个16位的128bit的一个数值,只要内容被改动一点,这个值就会被改变(很大的改变)
数字签名,数字证书
15. SSL会话原理
将密码进行非对称加密,SSL会话过程中的加密处理是浏览器与服务器自动完成的

9 楼

1. 分析server.xml时得出的知识点
(1)如果在server.xml里面添加中文注释,那么用startup.bat启动服务器则会出现错误。是因为编码问题,如果文件中出现中文,则文件读取错误,因为xml默认是以unicode编码存的,添加声明<?xml version="1.0" encondin="GB2312"?>或文件另存为编码为UTF-8则启动正常。
(2)server.xml是给java执行的,所以在添盘符路径时可以不用\\来表示\,而java程序是给javac看的,编译器需要用\\来转意表示\,否则编译器会报错.
2.解决用startup.bat启动tomcat时一闪而过的办法
当用startup.bat启动tomcat时,如果server.xml配置有错误,那么startup.bat将闪一下就消失了,如果想让命令窗口停住,好方便查看错误信息,则用如下方法修改:修改catalina.bat,找到里面的:
:doStart
shift
if not "%OS%" == "Windows_NT" goto noTitle
set _EXECJAVA=start %_RUNJAVA%
goto gotTitle
:noTitle
set _EXECJAVA=start %_RUNJAVA%
:gotTitle
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy
goto execCmd
将上面set _EXECJAVA=start %_RUNJAVA% 中的start去掉,就可以让命令行出错后不消失。set _EXECJAVA=start %_RUNJAVA% 的意识是重新启动一个命令行窗口。去掉start后,则不会再重新启动窗口,就达到了使命令行停住的效果。要在命令行中启动startup.bat才能看到效果。
3. 设置网站的默认网页
在要发布的网站的WEB-INF的目录下编写web.xml.
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <welcome-file-list>
        <welcome-file>a.html</welcome-file>
    </welcome-file-list>
</web-app>
<welcome-file>内放如想要直接显示的页面(比如说欢迎页面),则在打开网页时,只要输入文件夹的名字,就可以自动显示网页。

10 楼

1. Servlet的注册和运行
在web.xml里面,添加
 <servlet>
        <servlet-name>wzh</servlet-name>
        <servlet-class>MyFirst</servlet-class>
 </servlet>   
 <servlet-mapping>
        <servlet-name>wzh</servlet-name>
        <url-pattern>/first/a.html</url-pattern>
  </servlet-mapping>
<servlet-name>可以随便填写<servlet-class>要与classes文件夹内的.class内的文件同名.在写<url-pattern>的时候要注意目录结构.。里面的/first/a.html是接在当前目录(应用程序的根目录)下的。所以在地址栏中访问时,一定要加上放在webapps里那个目录的名字.如http://localhost:8080/xml/first/a.html
还可以在<servlet>中设置<load-on-startup>元素,该元素的作用是指在web应用启动的时候指定了servlet被加载的顺序,它的值必须是一个整数。如果它的值是一个负整数或是这个元素不存在,那么容器会在该servlet被调用的时候,加载这个servlet 。如果值是正整数或零,容器在配置的时候就加载并初始化这个servlet,容器必须保证值小的先被加载。如果值相等,容器可以自动选择先加载谁。
2. 类装载
如果要想让一个sevlet被多个程序装载,可以把这个servlet放在common里,把原来.class文件打成jar放在lib,原来的.class放在class目录下。因为程序起来后,会自动找上面的类装载器,如果找到,那么就可以使用。所以放在common里就可以实现。程序就算自己有也会向上找,上面的找到了就不会返回来,所以这时如果用程序获得类装载器的名字,那得到的是上面的类装载器的名字。(这和sun公司在servlet规范中的建议是不一样的,Sun建议,如果下面的可以找到servlet则不用再向上找)
3. 模版方法设计模式
下面是一个模板方法设计模式的伪代码
Class abstract BaseServlet
{
service() throws IOException,ServletException
{
    try
    {
        doService()
    }
    catch(SqlException e)
    {
        throw new IOException(e);
    }
}
    public abstract void doSevice();
}
YourServlet extends BaseServlet
{
    public doService()
    {
        ....
    }
}
小知识:
response.getWriter().println();输出流默认是ISO8859-1,如果想输出中文,则必须要显示调用response.setCharacterEncoding("gb2312");

我来回复

您尚未登录,请登录后再回复。点此登录或注册