农民 - javen
阿古主讲的 webwork 介绍 按时开始了! 大家欢迎 阿古!
阿古
感谢大家的支持哈
今天简单介绍一些webwork2
阿古 19:50:28
在一下的介绍中,我可能会为了方便把webwork2简写为ww2
阿古
结构:
1. 总体介绍
2. 相关概念
3. 核心
4. 资源
阿古
第一部分 :总体介绍
pull-based mvc模式j2ee web框架。webwork目前最新版本是2.1.1,现在的webwork2.x前身是rickard oberg开发的webwork,但现在webwork已经被拆分成了xwork1和webwork2两个项目
农民 - javen 20:04:53
可以随时提问吧? “拉出式”这个说法的特别在哪里?
阿古 19:50:44
current in 1.0.2
阿古 19:51:06
可以,大家一起讨论嘛!
阿古 19:52:40
ww2在执行action之后把结果放到堆栈中,所有的视图都是从堆栈中寻找action执行结果的值
所以ww2能支持多种表现形式!比如:jasper report,xml等等
聊且一笑 19:53:55
xwork完全脱离了web层,是说它不仅可以开发web程序吗?
阿古 19:55:18
只需要很少的代码就可以把action执行的结果用不同的视图显示出来!
比如:一个用于查询的action,查询的结果可以用pdf,xml,html等等格式表示,而只需作很小的改变
聊且一笑 19:55:49
这样的特性,不错
snake eyes 19:56:11
这个特性好,最好一会举个例子说明一下啊
阿古 19:56:16
对的
xwork是可以应用于桌面程序的开发的
swingwork就是用于swing应用的
它也是在xwork的基础上建立的
阿古 19:56:57
好的
这个在ww2的demo中就有
一会儿我把demo挂到服务器上去
让大家看看!
阿古 19:57:29
这样的特性具有很大的灵活性和实用性
阿古 19:57:36
或对应action中的方法 。webwork2支持多视图表示,视图可以使用jsp, velocity, freemarker, jasperreports,xml等。2.2.1版本已经能支持基本的客户端校验。
阿古 19:58:02
大家有什么问题随时可以提,大家一起讨论。:)
阿古 19:58:32
第二部分 :相关概念
1. mvc
聊且一笑 20:00:15
能不能说说webwork2与其它mvc框架的优劣?
农民 - javen 20:14:41
webwork 相当于 struts 里 actionservlet 的功能? xwork 主要做的什么事情?
农民 - javen 20:15:05
聊且一笑: 你这个问题可能是最后吧, 做比较
阿古 20:01:02
ww2跟stuts一样,也是建立在mvc基础上的
ww2在views上作的比较多
多种视图支持就是最好的证明
而ww2对model基本没有限制
但是ww2主要是工作在web层
所以在ww2的action中最好不要包含业务逻辑
阿古 20:01:55
下面我在核心部分会介绍xwork重要的作用
阿古 20:02:28
2. web framework
阿古 20:03:39
现在,web framework就多了,struts就是现在流行之一
阿古 20:03:47
第三部分:核心
阿古 20:06:02
在将这部分之前
先给大家看一个helloworld的事例
阿古 20:07:19
请大家稍等
snake eyes 20:07:53
不急
阿古 20:08:09
我的机器慢
启动服务器慢
阿古 20:10:19
先把ww2的默认配置文件copy到位
阿古 20:11:52
然后建一个类,继承actionsupport
然后覆盖actionsupport类的execute方法
在这个只需一条语句 return success;
郁也风 20:14:25
来晚了:(
阿古 20:14:36
public class helloworldaction extends actionsupport
{
{
"this is the action of hellworld!" ;
return success;
}
}
阿古 20:16:13
这里的success是在xwork.xml中指定的一个位置或是一个动作
<result name="success" type="dispatcher">success.jsp</result>
阿古 20:17:29
之所以要继承actionsupport类
是因为它提供了其他的一些接口的实现
使得可以在action中直接使用国际化的资源文件等其他支持
阿古 20:18:14
1. servletdispatcher
servletdispatcher是默认的处理web http请求的调度器,是ww2的”入口”。
默认的是.action的后缀 的请求都对应到该调度的servlet中。servletdispatcher接受客户端的http请求,将http的相关参数封装后,再传给xwork。xwork解析xwork.xml(配置文件 并根据配置,创建对应的action,组装并调用相应的拦截器,执行action,返回执行结果。
聊且一笑 20:18:23
这段与struts的差不多
阿古 20:19:03
但是ww2的action是线程安全的
可以用自己的属性
struts不能
聊且一笑 20:19:18
哦
农民 - javen 20:33:44
是啊。 感觉差不多。 不过没有传参数过来。 那我怎么样在 action 里处理 request 呢? 这是经常需要做的
无聊神灯 20:19:42
打住一下,线程何为安全?何为不安全?
聊且一笑 20:20:13
它是不是每个请求创建一个action对象
dfdfswsw 20:20:19
ww2还是不错的
阿古 20:20:32
在action中定义属性之后
action的属性跟表单中的input直接对应
其中数据转换是由ognl完成的
农民 - javen 20:35:22
action 中定义属性? 也就是相当于struts 里的 action + actionform 了。
阿古 20:21:23
ww2种action与threadlocal绑定
所以是线程安全的
而struts的action不是现成安全的
dfdfswsw 20:21:33
不过有人推荐我用这个
http://mav.sourceforge.net
这个更轻量级
农民 - javen 20:36:23
在 action 里我怎么样取到其他的 页面属性(没有放在action 属性之外的)? 还有, action 里出的结果,怎么样给到页面上去? 在 struts 里我们大多通过 request
阿古 20:22:11
在ww2种可以使用和struts完全一样的方式,建立formbean
也可以不用那样
非常灵活
可以自己选则
阿古 20:23:26
属性传递也是通过request传递的
但是这个request不是servletrequest
是个map
在ww2中,session,request,application全部重新封装
snake eyes 20:23:34
我有问题,比如一个查询操作,如何将得到的数据在页面上面显示出来??
snake eyes 20:24:02
以前用servlet时用request等,用ww2时怎么封装这个?
阿古 20:24:05
action执行的结果放到堆栈中的
页面显示的时候直接到堆栈中去找
snake eyes 20:24:38
放到堆栈中的操作是否在aceion中完成??
农民 - javen 20:39:04
堆栈是怎么样的概念? 比如代码: action 里得到一个 list ,怎么样放
snake eyes 20:25:07
页面显示如何在堆栈中查找啊??
最好给一个简单的action和页面的代码
阿古 20:25:25
在开发中不需要关心她的实现方式
他是用tag来显示结果的
dfdfswsw 20:25:37
可以使用velocity
snake eyes 20:25:39
好像提问的有点快了
阿古 20:26:03
先进后出的那个堆栈
呵呵
dfdfswsw 20:26:24
很简单
比如在一个action里面
list data
;(数据操作
dfdfswsw 20:26:53
在view的时候list就可以使用
velocity的摸板显示了
dfdfswsw 20:27:11
maverick 这个也是这样的
阿古 20:27:13
如果有个list需要传到页面上去
;
然后return success;
在页面中直接用tag显示
阿古 20:27:23
马上来个例子
snake eyes 20:27:29
农民 - javen 20:42:25
啊。 不错,你只需要定义 list , 框架会帮你去找?
聊且一笑 20:28:12
这个list它是不是自动封装到request中了
聊且一笑 20:28:27
这不错,省事
阿古 20:28:30
对的
list放在堆栈中了
阿古 20:29:13
你不需要他是怎么实现的
他会帮你全部搞定
具体怎么实现的,可以看看代码
他的堆栈结合了ognl
阿古 20:29:35
<ww:iterator value="messages">
<tr bgcolor="#f3f3f3">
<td width="24" height="23" align="center"></td>
<td width="340"><font color="#46a718"><ww:property value = "postdate"/>
</font> 作者:<font color="#46a718"><ww:property value = "author"/></font></td>
</tr>
<tr>
<td height="26"> </td>
<td width="423" colspan="2" style="word-break:break-all"><ww:property value = "content"/></td>
</tr>
</ww:iterator>
snake eyes 20:29:36
还有一个问题,传递参数的时候我能不能不在action中定义form的属性,而是直接建立一个map,然后将form作为map传递进去??
dfdfswsw 20:30:17
我觉得还是velocity的语法简单点
阿古 20:30:21
用tag iterator来显示你的list
同时value就是定义在action中的list
阿古 20:31:01
可以按照struts的方式
建立一个formbean
然后想怎么着就怎么着
农民 - javen 20:45:22
可以不使用 tag iterator 吗? 他过来的应该是个 list 吧,我喜欢使用 jtsl 。
dfdfswsw 20:31:08
$phone in $model.phonelist
#end
dfdfswsw 20:31:37
velocity好。。美工都基本上能理解
阿古 20:31:37
完全可以
农民 - javen 20:45:53
jstl 也是这样的。 现在代码里,我基本上用 jstl 的标签了
阿古 20:32:13
继续哈
阿古 20:32:25
1. action
中。但是如果不放在execute中,须在xwork.xml中指定客户端请求对应的方法。
农民 - javen 20:46:55
上面说的是 list 。 在 action 里的任何变量 , 是不是都可以直接在 页面上取得了?
阿古 20:32:51
可以得
阿古 20:33:35
这是一个action定义的例子
<action name="login" class="loginaction">
<result name="input" type="redirect">/login.jsp</result>
<result name="success" type="chain">usergrouplist</result>
<interceptor-ref name="defaultstack"/>
</action>
无聊神灯 20:34:03
呵呵。ww2使用了拦截器吧?
阿古 20:34:09
上面那个class要指定类的具体位置
阿古 20:34:22
当然
1. interceptor
日志拦截器 。所有xwork提供的interceptor都在webwork-default中有定义。
农民 - javen 20:48:48
<interceptor-ref name="defaultstack"/> 这个 拦截器 的功能就是堆栈了。
阿古 20:35:16
这个是ww2的拦截器的默认定义
<interceptor name="logger" class="com.opensymphony.xwork.interceptor.logginginterceptor"/>
阿古 20:36:47
1. validator
xwork的核心部分之一。它主要完成参数的动态校验。主要包括参数的类型和范围等的验证。在当前版本中ww2利用validator已经支持服务器端和客户端的自动校验
阿古 20:37:29
1. ioc容易支持
ww2提供了ioc容器。在ww2中实现ioc需要增加一个接口,接口中只需定义一个setter,然后在需要注入的action的类中实现该接口。最后在component.xml中定义就可以灵活应用ww2的ioc支持了。如果ww2与spring集成,可以选择使用spring作为ioc容器。前者比较灵活,但是要多一个接口。
阿古 20:37:47
打错了
上面那个是容器
阿古 20:38:08
我靠
怎么编号全部变成1了
阿古 20:38:37
word害死我了
农民 - javen 20:53:02
struts action 里,问题在于传了那么多的参数过来。 在 ww2 里,不传参数过来了,实际上是他自己定义了个 堆栈实现, 来代替了 request 的传递。
疑问: 页面上,除了 action 里定义的属性之外的属性,怎么样取得? 有时, action 里需要操作到 response (在struts 里), xwork action 里怎么样实现?
阿古 20:40:01
在action中直接取得request,然后
跟servletrequest的做法是一样的
农民 - javen 20:55:02
晕,在 xwork action 也可以直接取得 request ?
response 也是一样?
阿古 20:41:17
你取得的request是封装过的
是个map
不是servletrequest
snake eyes 20:41:43
这个,最好还是代码说明吧
阿古 20:41:52
不过如果你愿意也可以取得servletrequest
但是不推荐那么做
wait
airland 20:41:59
包括session,request,response?还有其他的么?
dfdfswsw 20:43:01
就是reqeust <->map-<->action-<->view
基本上它自动把reqeust里面的东西
变成string,int,boolean 就是action里面的
formbean或者action自己的setxxx,getxxx变量
阿古 20:43:02
actioncontext ac;
.put (user_key, user ;
阿古 20:44:03
request,application做法类似
阿古 20:44:36
我做了个demo可以给大家看看
dfdfswsw 20:44:36
如果访问reqeust还有简单的方法
public class userregistration extends actionsupport implements servletrequestaware
dfdfswsw 20:44:53
就有一个自动的
// public --------------------------------------------------------
httpservletrequest request {
this.req = request;
}
dfdfswsw 20:45:03
你就获得了req做什么操作都可以的
农民 - javen 20:59:43
哦。 这又是 ioc 了。
dfdfswsw 20:45:33
实现一个或者几个接口
servletrequestaware, sessionaware
阿古 20:46:21
7. 执行流程
1 取得请求的action的名称和所在namespace的名称;(2 创建contextmap,将客户端请求的相关参数全部封装并放到map对象中;(3 根据前面获得的namespace等参数创建一个actonproxy;
4 执行proxy的execute( 方法,这个方法最核心的语句是:retcode = invocation.invoke( ; invocation对象的invoke( 方法它遍历并执行这个action对应的所有拦截器,执行action对应的方法(默认的是execute( ),根据action执行返回的值去调用执行相应的result(返回结果处理)的方法。
农民 - javen 21:00:51
上面阿古说的 actioncontext 实际上,实际上对 request 等 servlet 对象做了些包装了。 s
dfdf 说的这种应该是 ioc 容器的概念了。
阿古 20:47:04
对的
农民 - javen 21:02:26
这个 proxy 我一直没有太理解。 总之好像又是 动态代理 来实现类似于 aop 的功能 。 spring 就是用动态代理实现 aop 的
阿古 20:49:13
spring的代码还没有研究过
我也不是很明确
还待各位给指点一下
农民 - javen 21:03:31
对于 html form 数据, struts 也出现了这种新的作法,即都放到 map 里
dfdfswsw 20:49:26
方法,这个方法最核心的语句是:retcode = invocation.invoke(
这个?。。就是
把xxx方法映射为doxxx方法
dfdfswsw 20:49:42
看看他的源代码
dfdfswsw 20:49:49
/**
* invokes an alternate execution path for the action. the name of the action
* is derived by prepending a "do" and capitalizing the first letter of the
* action.
*
*/
throws exception
{
"do" ;
command ;
2, character.touppercase(sb.charat(2 ;
dfdfswsw 20:49:55
try
{
.getmethod(cmd, new class[0] ;
nosuchmethodexception e
{
"no command '" + command + "' in action" ;
}
try
{
string method.invoke(this, new object[0] ;
invocationtargetexception e
{
/**
* we try to return
dfdfswsw 20:50:24
有点长。。。
dfdfswsw 20:52:03
我掉了?。。
阿古 20:52:21
本来应该有ww2的一系列资源介绍的
但是准备不太充分
只能给一部分了
airland 20:52:50
有没有现成的例子啊?
dfdfswsw 20:52:52
我最喜欢的就是动态方法调用虽然很简单
不过很实用,尤其是在框架编写中间
阿古 20:53:15
有
马上就房山来
阿古 20:54:52
这个是wiki
主要的文档都在这儿
http://wiki.opensymphony.com/display/ww/webwork
中文文档比较少
阿古 20:56:28
有个中文文档我会传给农民
大家可以去看看
magicgod 20:56:40
session也是一个map吗?
阿古 20:56:59
也是
magicgod 20:57:43
看来只是简单包装,没有 面向对象
char 20:58:14
request和sessoin里面都包含了一个map对象.
magicgod 20:59:00
应该直接引用业务对象,而不是通用对象
阿古 20:59:24
怎么做?
农民 - javen 21:13:46
但 request / session 这样的东西, 一般也就直接使用了。 能包装成怎么样啊?
magicgod 20:59:48
考虑一个最普通的购物系统
magicgod 21:00:05
那么其实session就是一个visitor,可以叫访问者
dfdfswsw 21:00:08
其实我觉得ww2或者maverick 主要就是
提供高效的mvc模式
一般不直接使用req,resp
阿古 21:00:21
a simple implementation of the {@link java.util.map} interface to handle a collection of http session
} method enumerates over all session attributes and creates a set of entries.
note, this will occur lazily - only when the entry set is asked for.
magicgod 21:00:48
每个访问者都应该有name,id,productlist等属性
magicgod 21:00:59
.getname(
阿古 21:01:04
但是那样做得太死了
magicgod 21:01:25
string getsession( .get(user_name
农民 - javen 21:16:01
哈哈, magicgod 一说就会说到 tapestry 上去。
magicgod 21:01:50
.getname( 这才是面向对象
dfdfswsw 21:01:56
为什么要这样访问?
阿古 21:02:04
你可以把
string getsession( .get(user_name 封装到一个类中
dfdfswsw 21:02:12
不能直接一个visit放入一个session里面
magicgod 21:02:18
因为我们做程序做久了都认为map之类的对象很自然
dfdfswsw 21:02:21
为什么不能直接一个visit放入一个session里面
阿古 21:02:41
难道map很不自然?
magicgod 21:02:50
其实不对,我觉得map是一种很抽象的虚类,在现实生活中好象不存在
magicgod 21:03:23
计算机本身是没有价值的,我还是这样认为,只有转化为应用的时候才有巨大价值
char 21:03:24
session包含的是hashmap对象,当然map里面是可以放对象的,而不只是一个字符串.
magicgod 21:03:41
当然可以,session本来就是设计为通用的
dfdfswsw 21:03:51
map本来就是抽象把。。下面一般都是具体的
hashtable
阿古 21:03:59
今天就到这儿了哈
大家继续讨论
呵呵
magicgod 21:04:03
只不过不要忘了,所有的应用系统应该设计为不通用的,有限制的,专注的
magicgod 21:04:21
hashtable我也不觉得现实中有存在
dfdfswsw 21:04:30
string getsession( .get(user_name ?
而不能
visti map.get("key"
阿古 21:04:30
讲的不好
见谅哈
有什么问题
可以qq联系或是我的mail
feng-zhou@163.net
char 21:04:48
magicgod的答案在项目中很有用
magicgod 21:04:03
只不过不要忘了,所有的应用系统应该设计为不通用的,有限制的,专注的
magicgod 21:04:52
软件应该从用户角度去看,根本没有客户会搞清楚map这样的
char 21:05:11
阿古,不是吧,我刚回来,你就说讲完啦...
magicgod 21:05:15
visti map.get("key" 为什么不直接变成 getvisit(
农民 - javen 21:19:32
感谢 阿古! 让我们了解了 webwork
阿古 21:05:38
本来周4讲的
准备不充分
抱歉抱歉
郁也风 21:05:43
那就要求客户再次封装了
dfdfswsw 21:05:46
visti map.get("key" 为什么不直接变成
你可以实现这个方法
return 一个visit不就行了?
magicgod 21:05:47
我觉得框架更应该取悦于客户,而不是开发者
char 21:05:59
哦,谢谢,阿古,周四再讲一次.
dfdfswsw 21:06:11
visti map.get("key" 并不代表
方法
magicgod 21:06:15
当然自己实现和框架实现是两回事
dfdfswsw 21:06:20
只是封装的程度而已
阿古 21:06:21
啊?
课有点多!:)
magicgod 21:06:35
就好象现在有很多人只写虚方法一样,更清晰
char 21:06:44
session没有必要写成visitor,
郁也风 21:06:48
其实我觉得框架封装倒这种程度已经很好了,给我们留有较大的余地
dfdfswsw 21:06:46
严格的来说软件和现实永远不可能达到真实的映射
magicgod 21:07:16
软件现在 遇到的问题是更难维护,更庞大,而不是缺少技巧
magicgod 21:07:34
开发应该从如何适应客户需求角度从而得到生存
char 21:07:39
如果是想外加方法,应该用filter,
但是session的作用不仅仅像visitor的外加方法...
snake eyes 21:08:05
嘻嘻,感谢
dfdfswsw 21:08:07
我觉得那个只是封装的度而已
magicgod 21:08:10
当然象doomiii这样纯技术型游戏也存在,象cs这样技术落后,但依然流行的游戏也存在,世界总是多元的
magicgod 21:08:29
也可以说封装的度
char 21:08:32
讲解一下区别呀...
magicgod 21:08:10
当然象doomiii这样纯技术型游戏也存在,象cs这样技术落后,但依然流行的游戏也存在,世界总是多元的
阿古 21:08:34
cs的技术好像不是很落后噢
magicgod 21:08:39
这就是面向对象所要求的
magicgod 21:08:45
封装
snake eyes 21:08:53
和doom比起来落后多了
阿古 21:09:04
cs打了多年了
magicgod 21:09:24
以对象为核心,你专注的对象,业务系统专注于业务而非map,list之类
dfdfswsw 21:09:32
封装的度同样存在问题。
高度的掩盖。和底层的思考
snake eyes 21:09:48
cs用的还是q2 的引擎,而doom超越q3很多了
magicgod 21:10:07
软件肯定会分化为两个极端,技术极端和应用极端
郁也风 21:10:10
两个天才的john
char 21:10:23
阿古...
char 21:10:28
阿古 21:10:31
what?
char 21:10:33
webwork demo
dfdfswsw 21:10:38
本来也没有建议在ww2或者mav这样框架立面
里面直接使用req,session
等对象
更不应该往用户的session里面放n个string字段
阿古 21:10:42
等一下
我看不到图
magicgod 21:10:43
一批人以技术为核心,一批人以业务应用为核心,就象手工艺人和工厂一样
char 21:10:46
你知道我在说什么吧....
char 21:10:55
车.....
阿古 21:11:02
车???
dfdfswsw 21:11:05
一个最简单的也是最复杂的对象就可能是一个
bean.
char 21:11:22
jasper reports demos
jasper reports pdf example
jasper reports html example
jasper reports xml example
jasper reports csv example
char 21:11:26
阿古....
char 21:11:42
阿古....
char 21:11:56
阿古...
阿古 21:12:01
在webwork自带的demo就有
我开了你们开起来太慢
你取下载一个就可以看到
阿古 21:12:14
要不
我勉强使一下
char 21:12:18
我已经建好了demo
char 21:12:26
不过,有个地方运行不了...
阿古 21:12:34
是不是新版本的?
char 21:12:40
char 21:12:49
这几天下载的..
阿古 21:13:00
我看不到图
dfdfswsw 21:13:02
有空大家可以去看看
http://mav.sourceforge.net
和ww2相比更轻量。^^;
阿古 21:13:29
有空去看看
dfdfswsw 21:13:59
自己打算参考ww2和mav写一个简单的框架
阿古 21:14:13
呵呵
期待
dfdfswsw 21:14:51
多action叠加
dfdfswsw 21:15:12
在这个群里面我是才鸟。
magicgod 21:15:20
我现在在做的一个电子表单系统就是专注于人工信息采集的自动代码生成系统
char 21:15:32
郁也风,阿古
是不是可以webwork+flex?
阿古 21:15:37
dfdfswsw
给江一下动态代理码
magicgod 21:15:47
打算把所有的人工信息采集表单全部一网打尽
阿古 21:16:02
正在研究
看看能不能像jasperreport那样容易
magicgod 21:16:06
以后再也不用编写输入表单之类的东西
dfdfswsw 21:16:08
其实我那个应该叫动态方法调用
char 21:16:06
dfdfswsw,是讲师,不用谦虚...大家都知道
dfdfswsw 21:16:15
老了
base 21:16:21
char 21:16:38
阿古,你的服务器开了瓵?
magicgod 21:16:43
估计一年左右,市场上到处都是这种产品,程序员在逐步退化了
阿古 21:17:13
等一下嘛
:)
char 21:17:22
mav,demo哪里有?
char 21:17:42
???什么产品...
magicgod 21:16:43
估计一年左右,市场上到处都是这种产品,程序员在逐步退化了
郁也风 21:18:10
magicgod的那个东东可否给看看?
magicgod 21:18:20
表单系统
char 21:18:29
char 21:28:56
郁也风,阿古
是不是可以webwork+flex?
magicgod 21:18:33
做完了马上开源掉
郁也风 21:18:46
hoho,好啊:)
char 21:18:46
表单系统 ?
char 21:19:01
什么表单系统,
jasperreport?
dfdfswsw 21:19:11
比如我想的就是a.action?action=xxx
或者其他的参数输入action之后
这个xxx参数最后就变成了doxxx方法
就是一个类拥有n个doxxx方法
有程序动态调用这些方法。。
dfdfswsw 21:19:35
其实就是抄袭的ww2...不要bs..>.<
郁也风 21:19:40
好像可以,char,flex里面使用httprequest,和webservice来与后台交互的,前者就是平常的request,估计可以结合
阿古 21:19:43
呵呵
土豆仙 21:19:45
yeah,几天盖上了..
dfdfswsw 21:19:45
然后把它简单化
土豆仙 21:19:55
今天赶上了..
郁也风 21:20:17
df的那个好像类似于struts的那个啊
dfdfswsw 21:20:17
flex.war据说可以在resin下面直接运行。
那应该比较简单的
阿古 21:20:28
可以得
我试过了
注: 请访问 matrix 专题 - java 高手营地专题讲座 下载讲座实录与以及演示程序、其他相关资料。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器