选择显示字体大小

matrix java 大讲坛之struts 应用

&nbsp;农民 - javen&nbsp; 19:48:07<br>  好了,开始吧! <br>  <br>  还是老规矩,请大家用普通字体,包括大小、颜色 <br>╃(chris&nbsp;&nbsp; 19:48:29<br>  我来主持,我用绿色 <br>_阿古&nbsp; 19:48:39<br>  好准时<br>  鼓掌 <br>╃(chris&nbsp;&nbsp; 19:48:39<br>  欢迎fajaven <br>&nbsp;农民 - javen&nbsp; 19:48:52<br>  感谢大家的支持! struts 实在应用比较多,而我也不能算是精通,所以今天的讲座只能算是讨论。 请大家积极参与讨论。我今天下午也做了些准备,写了点提纲之类的。有什么问题,请大家随时提问,当然尽量做提到的问题在目前讲到的范围。 <br>&nbsp;拓拔涛&nbsp; 19:48:53<br>   <br>头发乱了~~&nbsp; 19:48:54<br>   <br>&nbsp;totodo&nbsp; 19:48:54<br>  pipa ,pipa... <br>crane&nbsp; 19:48:54<br>  &nbsp; <br>crane&nbsp; 19:48:55<br>   <br>郁也风&nbsp; 19:49:03<br>  哇赛,好大啊 <br>&nbsp;totodo&nbsp; 19:49:18<br>  哇,..不打字了.. <br>╃(chris&nbsp;&nbsp; 19:49:20<br>  javen,字体小点吧 <br>&nbsp;农民 - javen&nbsp; 19:49:47<br>  呵呵,我也用默认的字体大小吧。&nbsp; <br>动物园的猪&nbsp; 19:49:54<br>  还好,刚开始 <br>&nbsp;totodo&nbsp; 19:49:55<br>  ︿_︿ <br>╃(chris&nbsp;&nbsp; 19:50:09<br>  开始 <br>╃(chris&nbsp;&nbsp; 19:50:11<br>  go <br>风舞狂沙&nbsp; 19:50:12<br>   <br>傻子&nbsp; 19:50:13<br>  go&nbsp; <br>&nbsp;农民 - javen&nbsp; 19:50:14<br>  先来点好笑的! 呵呵&nbsp; <br>无聊神灯&nbsp; 19:50:16<br>  农民终于翻身做主 <br>&nbsp;农民 - javen&nbsp; 19:50:16<br>  说起apache帮,那可是名声显赫,龙蛇混杂,其中有个误人不浅的struts不得不提。那个家伙号称mvc2,其实就是干把简单的事情弄复杂那套坑蒙拐骗的小伎俩。做一个很简单的东东,都要动用action,form,啃完一大本的taglib,还要折腾n个巨复杂无比的配置文件。唉,不知葬送了多少无知桶子的宝贵青春。那阵子,如果你见到一个面色苍白眼窝深陷的桶子,可以走上去问struts?,那人要是扑通一声跪下,抱住你的腿就开始痛哭流涕的,那一定就是刚到struts连锁店抽过的了。唉~~,悲惨世界呀。 <br>&nbsp;农民 - javen&nbsp; 19:50:42<br>  笑坏了。&nbsp; 这是郁也风发在 mailing list 的。 <br>&nbsp;农民 - javen&nbsp; 19:51:38<br>  一、概念基础<br>  1、mvc 模式<br>  2、web framework<br>  3、m v c <br>&nbsp;农民 - javen&nbsp; 19:52:09<br>  1、mvc 模式<br>  &nbsp;看四人帮的模式,好像最早起源于 smalltalk 。总之是一种职责分离,用到 view 上是 mvc&nbsp; 用到里边还会有其他的别的模式。 这是模式的内容了。我们期待着 char 为我们讲解设计模式。之后我想设计模式也是我们讲座的一个重点内容,期待更多的人参与进来。 <br>郁也风&nbsp; 19:52:16<br>  呵呵,太好了,过两天正好要给几个兄弟作个小的培训,有教材了:) <br>&nbsp;农民 - javen&nbsp; 19:53:09<br>  2、web framework<br>  &nbsp;framework 的话题就更深入了。 struts 也可以说是一个 web ui 层的 framework 。 struts 可能是 java web ui 层出现最早最流行一个 framework 吧。从用户量来说,绝对数肯定是最多的。有一种说话,strutsjava web ui 事实的标准。<br>  &nbsp;最近框架就层出不穷了,好几个大有取代 struts 之势。这个图片非常有意思,描述了多种选择。(图片) <br>无聊神灯&nbsp; 19:53:11<br>  交版权。。。:) <br>char&nbsp; 19:53:17<br>  我指明一点,mvc在四人帮里说不是模式,是框架 <br>&nbsp;农民 - javen&nbsp; 19:53:47<br>  晕,我刚看了一点。&nbsp; char 什么时候再细讲吧。&nbsp;&nbsp; <br>&nbsp;totodo&nbsp; 19:54:12<br>  ︿+︿ 我先回家饭凡.. <br>zhangever&nbsp; 19:54:17<br>  现在有什么新的比较特出的框架啊? <br>动物园的猪&nbsp; 19:54:20<br>  struts中的那个叫el的东西,讲讲 <br>char&nbsp; 19:54:24<br>  好,你继续。 <br>&nbsp;农民 - javen&nbsp; 19:54:27<br>   <br>&nbsp;农民 - javen&nbsp; 19:54:48<br>   <br>&nbsp;bill-过儿&nbsp; 19:54:54<br>  怎么又来了颜色的 <br>char&nbsp; 19:55:07<br>  太形象了 <br>&nbsp;农民 - javen&nbsp; 19:55:15<br>  这就是现在的框架!&nbsp;&nbsp; jsf 还没有热起来。 我估计还是有希望的。&nbsp; <br>头发乱了~~&nbsp; 19:55:40<br>  你是说jsf比另外几个带来更大的累坠? <br>动物园的猪&nbsp; 19:55:51<br>  赞一下webwork! <br>&nbsp;bill-过儿&nbsp; 19:56:05<br>  jsf 不知道阿 <br>&nbsp;农民 - javen&nbsp; 19:56:10<br>  不应该是 。&nbsp; jsf 应该是比较方便可视化的开发环境 <br>&nbsp;农民 - javen&nbsp; 19:56:15<br>  magicgod 的 web ui 技术比较,感觉很精彩,推荐参考:<br>  &nbsp;<a href=&quot;http://www.matrix.org.cn/subjects/wiki.jsp?page=uicompare&quot;>http://www.matrix.org.cn/subjects/wiki.jsp?page=uicompare</a><br>  &nbsp;我们也期待&ldquo;阿古&rdquo;为我们讲解 webwork ,magicgod 为我们讲解 tapestry 。 <br>头发乱了~~&nbsp; 19:56:49<br>  那怎么画的好像这些框架都成了手铐脚镣 <br>&nbsp;bill-过儿&nbsp; 19:56:51<br>  我建议,先讲一些,然后再讨论,要不很乱 <br>郁也风&nbsp; 19:56:53<br>  如果有好的ide的话,jsf还是不错的 <br>&nbsp;农民 - javen&nbsp; 19:56:59<br>  to 物园的猪:&nbsp; el 是 jstl 的内容。&nbsp; <br>char&nbsp; 19:57:23<br>  el是struts的几个标签库的扩展 <br>动物园的猪&nbsp; 19:57:45<br>  噢,极度不明白ing。。。,忘兄介绍一二 <br>char&nbsp; 19:57:47<br>  讲完再评论 <br>&nbsp;bill-过儿&nbsp; 19:57:57<br>   <br>&nbsp;bill-过儿&nbsp; 19:58:04<br>  继续 <br>&nbsp;农民 - javen&nbsp; 19:58:39<br>  呵呵,struts 的 taglib 因为 jstl ,推出了 -el 的标签。&nbsp; el 是&nbsp; expression language ,&nbsp; 是 jstl 的一部分。&nbsp; <br>&nbsp;农民 - javen&nbsp; 19:58:49<br>  3、m v c<br>  &nbsp;control&nbsp;<br>  &nbsp;&nbsp;是 struts 的核心。struts 主要提供的也是这个 control,具体由 actionservlet 配合 struts-config 配置文件、最后由 action 来实现 control 对 view 与 model 的接口。 <br>&nbsp;农民 - javen&nbsp; 19:59:33<br>  &nbsp;view<br>  &nbsp;&nbsp;表示层。主要是 jsp/jstl/taglib ,特别是 struts 有自己特别的 tiles 。另外,也可以配合 jsf/velocity/xslt 。我没有实践过。 struts 有个 jsf 模块,实现与 jsf 的融合。听说 jsf 的主创人员就是 struts 原来的头,二者并不冲突。<br>  &nbsp;&nbsp;struts 有提供一些 view 的东西,就是很多人抱怨的 taglib <br>  &nbsp;model<br>  &nbsp;&nbsp;struts 对 model 没有做出任何缺省的限制,把灵活性留给了你! <br>&nbsp;农民 - javen&nbsp; 20:00:56<br>  二、概念深入<br>  struts 最新发布版本为 1.2.1&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:02:10<br>  1、actionservletstruts-config.xml<br>  &nbsp;系统启动时,actionservlet 装载 struts-config.xml 配置文件。当页面有请求时,actionservlet 把请求交给 requestproccessor ,然后执行一系列的动作,包括调用你的 action 。<br>  <br>  &nbsp;actionservlet 就是一个 servlet ,需要在 web.xml 里设置启动。 <br>&nbsp;农民 - javen&nbsp; 20:02:50<br>  2、action <br>  &nbsp;action 是程序员做自己的动作的地方。你就应该把你的代码都放在 execute 方法里。另外,你不应该在 action 里太多的事情,应该是简单的逻辑判断。具体做事应该在后面 model 或者辅助类。做完你的动作后,findforward 到一个地址,而这个地上具体内容在 struts-config 里设置的。 <br>&nbsp;农民 - javen&nbsp; 20:03:41<br>  3、actionform dynaactionform validatorform<br>  &nbsp;属性名称与页面 html form 对应的 javabean ,用于接收页面传递过来的数据。<br>  &nbsp;如果这个 actionform 需要验证,则应该继承 validatorform 。 <br>   <br>&nbsp;农民 - javen&nbsp; 20:04:24<br>  不想自定义 actionform 而只是简单地使用属性时, 可以用 dyanactionform ,在配置文件里直接配置属性。 <br>&nbsp;农民 - javen&nbsp; 20:04:37<br>  4、requestprocessor<br>  &nbsp;背后的英雄。 actionservlet 接到请求,交给 requestprocessor 做一些 struts 可以做的动作,然后到 action 交给你,你来做处理。 <br>&nbsp;农民 - javen&nbsp; 20:05:31<br>  5、看一下源代码、了解执行流程<br>&nbsp; 或者 doget(&nbsp; 里执行 process(request, response&nbsp; 。查找配置文件里的有可能自定义的 requestprocessor ,如果没有用默认的,把 process(reqeust, response&nbsp; 交给了 requestprocessor 做集中的处理。<br>request, resposne&nbsp; 里需要做一系列的其他 process 。 <br>&nbsp;农民 - javen&nbsp; 20:06:14<br>  这些当然包括:&nbsp; actionform&nbsp; action actionmapping 等等。&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:06:30<br>  其中有几个重要的:<br>  <br>  &nbsp;// process any actionform bean related to this request<br>request, response, mapping ;<br>request, response, form, mapping ;<br>!processvalidate(request, response, form, mapping&nbsp;&nbsp; {<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;农民 - javen&nbsp; 20:07:56<br>  这个是处理 actionform 的。&nbsp; 首先创建 actionform ,如果是 session scoope ,当然会去找回来。<br>  然后 processpopulate ,这里把 html form&nbsp; 的东西压到 actionform 里来<br>  然后验证。&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:08:18<br>  &nbsp;// create or acquire the action instance to process this request<br>request, response, mapping ;<br>action == null&nbsp; {<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // call the action instance itself<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actionforward forward =<br>request, response,<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action, form, mapping);<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // process the returned actionforward instance<br>request, response, forward ; <br>&nbsp;农民 - javen&nbsp; 20:09:23<br>  创建 action:&nbsp;&nbsp; struts 里 action 是只有一个实例的。&nbsp; 如果已经存在,则直接返回。<br>  <br>  然后执行你的 action 里的 execute ,即你自己实现的逻辑。&nbsp;&nbsp;&nbsp;&nbsp; <br>  <br>  对于 struts ,除了设置配置文件,大部分逻辑处理都在这里做了。&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:10:10<br>  然后处理完成后的 mappign 。&nbsp; 下一步 ......<br>  <br>  怎么走?&nbsp; 找 actionservlet 为我们准备好的&nbsp; struts-config.xml&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:10:44<br>  大多数时候,这个 forward 是 jsp 文件。<br>  <br>  当然可以是另外的一个 action 。&nbsp;&nbsp;&nbsp;&nbsp; <br>郁也风&nbsp; 20:10:57<br>   <br>&nbsp;农民 - javen&nbsp; 20:11:23<br>  比如 经常出现的, 插入完成后, 我们一般会让他导向&nbsp; list 页面。&nbsp; 这里, forward 就是到&nbsp; list 这个动作了。&nbsp; <br>郁也风&nbsp; 20:11:39<br>  汗,想找visio画个示意图的,发现没装,用tcc随便画个意会的吧,大意如此,别全当真:) <br>&nbsp;农民 - javen&nbsp; 20:12:26<br>  晕,我都看不到。&nbsp;&nbsp;&nbsp; <br>  <br>  概念部分就这些了。&nbsp; 大家有什么问题没有? <br>╃(chris&nbsp;&nbsp; 20:12:55<br>  很详细,大家有问题请讨论阿。 <br>zhangever&nbsp; 20:13:06<br>  想问问,action-mapping中, <action ... name=&quot;formname&quot;>与<action ... attribute=&quot;formname&quot;>有何不同? <br>郁也风&nbsp; 20:14:09<br>  好像没什么不同吧,我记得我到源码里找过的,时间久了,没啥印象了 <br>&nbsp;农民 - javen&nbsp; 20:14:17<br>  name 与 attribute 的区别,&nbsp; 记得那个谁的 blog 有个详细研究。&nbsp;&nbsp;&nbsp; 呵呵,我倒是没有研究过,但一般直接用 name ,name 就是这个动作对应的 actionform <br>动物园的猪&nbsp; 20:14:32<br>  聊聊tag吧 <br>&nbsp;农民 - javen&nbsp; 20:14:49<br>  还是有点不同的。&nbsp; 但实际应用上,没有怎么体现出来。&nbsp;&nbsp; <br>风舞狂沙&nbsp; 20:14:56<br>  actionform实例的生成和使用过程? <br>&nbsp;农民 - javen&nbsp; 20:16:21<br>  以 add 动作为例吧,导向 html form 时,会生成 actionform 放到 request/session 里。<br>  <br>  submit 后,进行 process , 主要是 populate ,然后&nbsp; validate&nbsp; <br>摄氏十度&nbsp; 20:16:59<br>  由于页面的跳转由配置文件控制,所以在传递参数的时候不是很方便。大家有什么意见? <br>&nbsp;农民 - javen&nbsp; 20:17:04<br>  具体代码我倒是没有仔细研究。&nbsp; 看 tomcat 输出大概是这样的。&nbsp; <br>郁也风&nbsp; 20:17:54<br>  参数还是可以照一般方式用的啊,不会因为用了配置文件而不好传参的:) <br>&nbsp;农民 - javen&nbsp; 20:17:58<br>  一般放在 request 里。&nbsp; 我是这样做的。&nbsp;&nbsp; <br>  forward 时,放在 request 里。<br>  action 里,可以带参数的 <br>摄氏十度&nbsp; 20:18:31<br>  呵呵,我也是这么做的。看来也没有别的办法 <br>&nbsp;农民 - javen&nbsp; 20:18:37<br>  <foward name=&quot;list&quot; ;<br error.token.invalid?&nbsp; path=&quot;user.do?method=list....../> <br>郁也风&nbsp; 20:19:07<br>  呵呵,曾经想过很多自以为讨巧的方法,最后还是发现最原始的最方便:) <br>char&nbsp; 20:19:27<br>  有什么自以为讨巧的方法,说来听听。 <br>郁也风&nbsp; 20:20:06<br>  呵呵,哪还记得住啊,从来都是试过不好就随手扔了:( <br>&nbsp;农民 - javen&nbsp; 20:20:22<br>  先接下来啊, 过会详细讨论!&nbsp;&nbsp; <br>风舞狂沙&nbsp; 20:20:26<br>  在同一个页面里面,如果有一个form和一个link,对应的action都是同一个,如果点击link,form对应的submit按钮也会有响应,如何解决呢? <br>动物园的猪&nbsp; 20:20:56<br>  就想了解el,赶紧给解惑一下吧 <br>郁也风&nbsp; 20:21:12<br>  javen继续 <br>&nbsp;bill-过儿&nbsp; 20:21:18<br>  我在想action里执行导向页面,但是所有的逻辑代码到放在另外一个class文件里,都能实现功能,但总感觉不象struts,哈哈!<br>  这样规不规范呢? <br>&nbsp;农民 - javen&nbsp; 20:21:39<br>  三、struts 辅助<br>  1、view:struts-taglib<br>  &nbsp;struts 默认提供许多常用的 taglib ,主要用的有 html bean logic 。 jstl 出来后,与 struts 的标签有重复的地方。我一般的作法是,尽量使用 jstl 标签,特别是 el 很方便使用。比如很多时候需要传递多个变量,<html:link>时 如果不使用 el 会很麻烦。 <br>摄氏十度&nbsp; 20:22:04<br>  美工制作的页面还需要加上标签进行转换。这点很烦。最要命的是,dw好像还不能正常显示。 <br>头发乱了~~&nbsp; 20:22:32<br>  你总不能指望dw出for structs的plugin吧?<br>   <br>摄氏十度&nbsp; 20:22:43<br>  农民,请你先将,等你讲完了在问 <br>郁也风&nbsp; 20:22:43<br>  这也是我对taglib诟病的地方 <br>&nbsp;农民 - javen&nbsp; 20:22:48<br>  听说 dw 有插件支持了。&nbsp; 我没有找到。<br>  <br>  taglib 我认为还是相当简单的。&nbsp; 因为毕竟大多数时候只用有限的几个 <br>风舞狂沙&nbsp; 20:22:56<br>  dw,要用插件的吧 <br>风舞狂沙&nbsp; 20:23:03<br>  我就在用 <br>char&nbsp; 20:23:22<br>  什么插件? <br>&nbsp;bill-过儿&nbsp; 20:23:26<br>&nbsp;农民 - javen&nbsp; 20:22:48<br>  听说 dw 有插件支持了。&nbsp; 我没有找到。<br>  <br>  taglib 我认为还是相当简单的。&nbsp; 因为毕竟大多数时候只用有限的几个&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:23:28<br>  哈哈,过会共享出来。&nbsp; 这个插件还是有些用处的。&nbsp;&nbsp; taglib 插件吧。&nbsp; <br>泥娃娃&nbsp; 20:23:31<br>  拿出来共享啊 <br>风舞狂沙&nbsp; 20:23:40<br>  好的, <br>风舞狂沙&nbsp; 20:23:43<br>  没有问题 <br>&nbsp;农民 - javen&nbsp; 20:23:48<br>  2、多模块<br>  &nbsp;当系统越来越大时,配置文件的管理是个问题。所以 struts 1.1 后就开始支持多模块,各模块使用相对独立的配置文件。使用起来还算方便的,只是遵守他特定的规范。配置文件形如 struts-config-model ,模块内的路径,在原来路径基础上,struts 为你加上模块名称。在 jsp 文件里,这样理解可能比较容易:<br>  &nbsp;目前在 model1,如果需要访问模块2里的路径时,这样写: ../model2/aa.do <br>摄氏十度&nbsp; 20:23:50<br>  大家还是先听农民讲吧 <br>头发乱了~~&nbsp; 20:23:52<br>  好用么?<br>   <br>风舞狂沙&nbsp; 20:24:04<br>  不错的 <br>&nbsp;农民 - javen&nbsp; 20:24:58<br>  总之,模块名是与路径相关的。&nbsp; struts 会为模块加上对应的相对路径。&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:25:28<br>  我认为稍大的系统都可以考虑使用 多模块。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>头发乱了~~&nbsp; 20:25:45<br>  问题是模块之间的接入 <br>&nbsp;农民 - javen&nbsp; 20:25:48<br>  如果只使用一个,大家都要经常来修改同一个配置文件都是麻烦事。&nbsp; 呵呵&nbsp;&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:26:07<br>  模块之间的转接,&nbsp; 就是路径的问题。&nbsp;&nbsp;&nbsp; <br>头发乱了~~&nbsp; 20:26:41<br>  很大程度依靠的是文件共享,对不?<br>   <br>&nbsp;农民 - javen&nbsp; 20:27:13<br>  文件共享?&nbsp;&nbsp;&nbsp; 你说源代码管理吗?&nbsp;&nbsp; 我们用 cvs 啊。&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:27:41<br>  3、验证<br>  &nbsp;有人认为,提供自动验证框架也是 struts 的一个好处之一。他的验证 rule 放在一个配置文件里,另外一个配置文件设置哪些 actionform 的哪个字段需要哪种类型 rule 的验证,以及具体的验证参数、失败信息。<br>  &nbsp;如果某个 actionform 需要验证,要求是必须继续 validatorform ,并在 struts 配置文件里设置 validator 。 <br>头发乱了~~&nbsp; 20:27:45<br>  不是,我说的是模块思想依靠共享文件,也就是配置文件,来传递各个模块之间的消息 <br>ss&nbsp; 20:28:00<br>  对了 <br>头发乱了~~&nbsp; 20:28:07<br>  也不完全对,我再想想 <br>ss&nbsp; 20:28:21<br>  农民,现在struts有没有好的配置管理工具 <br>&nbsp;农民 - javen&nbsp; 20:28:33<br>  所有的配置文件,都是 actionservlet 起动时加载的。&nbsp; 然后根据模块名称来找。 <br>头发乱了~~&nbsp; 20:28:41<br>  我总想起linuxunix里模块之间通讯的方式 <br>&nbsp;农民 - javen&nbsp; 20:28:55<br>  你说的 struts-config.xml ?&nbsp; 稍后会讲到工具。&nbsp;&nbsp; <br>头发乱了~~&nbsp; 20:29:21<br>  也就是说,在启动时候要把所有模块都预加载上,对不? <br>方片&nbsp; 20:29:26<br>头发乱了~~&nbsp; 20:27:45<br>  不是,我说的是模块思想依靠共享文件,也就是配置文件,来传递各个模块之间的消息 <br>  <init-param><br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <param-name>config</param-name><br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <param-value>/web-inf/struts-config.xml</param-value><br>  &nbsp;&nbsp;&nbsp; </init-param><br>  &nbsp;&nbsp;&nbsp; <init-param><br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <param-name>config/info</param-name><br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <param-value>/web-inf/struts-config-info.xml</param-value><br>  &nbsp;&nbsp;&nbsp; </init-param> <br>头发乱了~~&nbsp; 20:29:46<br>  恩,我说的就是这个意思 <br>&nbsp;农民 - javen&nbsp; 20:29:49<br>  4、国际化<br>  &nbsp;对于一个稍大型的 b/s 系统,国际化是需要考虑的,也是需要事先设计、考虑好的重要问题之一。使用 struts 做 ui 则不需要太多考虑,struts 为你准备好了。其关键在于资源文件,集中了在界面需要显示的信息。不同语言的资源文件以对应的 locale 做后缀。struts 根据不同的 locale 动态地查找对应 locale 的资源文件。 <br>&nbsp;农民 - javen&nbsp; 20:30:50<br>  5、异常捕获<br>  &nbsp;一般的情况下,后台 exception 都到 action 里来捕获处理,并给出错误消息。 struts 提供了集中捕获的方式,action 里你只需要简单地抛出 exception ,然后在 struts-config.xml 配置文件里的 exception 项做设置即可。与 forward 一样,每个 action 可以设置自己的 exception ,也有 global excepption 。可以设置 exception type ,每种 exception 给出特别的错误消息,也可以统一 java.lang.exception 给出同样的错误消息。 这地方有一个扩展点,就是可以实现自己的 exception handler 。 <br>&nbsp;农民 - javen&nbsp; 20:32:49<br>  6、文件上传<br>  &nbsp;struts 在 actionform 直接捕获上传的文件流,你从 actionform 里得到它,然后做自己的处理就好了。 struts-config 上也可以设置上传文件的属性。 <br>&nbsp;农民 - javen&nbsp; 20:33:29<br>  7、tiles<br>  &nbsp;一个页面展示模板。如果不合适用 frame 时,用这种模板会方便很多。因为我暂时没有在项目中用到,也不便多说。大家有兴趣以后一起研究。 <br>&nbsp;农民 - javen&nbsp; 20:34:32<br>  哈哈,web ui 相关的东西都有一网打尽啦。这也算是 struts 的成熟与魅力吧!<br>  <br>  包括 beanutils / validator / upload 等几个功能,struts 1.2.1 后是完全独立的 commons 组成部分。也就是说你可以不使用 struts 而单独使用。 特别是 beanutils / upload 相信会非常有用。 <br>摄氏十度&nbsp; 20:35:27<br>  struts1.2出了? <br>&nbsp;农民 - javen&nbsp; 20:35:35<br>  这个部分完了。 大家提问 <br>&nbsp;农民 - javen&nbsp; 20:35:54<br>  有 build 版了,但好像没有正式 release&nbsp; <br>头发乱了~~&nbsp; 20:35:54<br>  struts上船用的是http协议对么? <br>_阿古&nbsp; 20:36:21<br>  strutsweb ui 好不好用? <br>&nbsp;农民 - javen&nbsp; 20:36:22<br>  actionservlet 就是继承的 httpservlet&nbsp; <br>无聊神灯&nbsp; 20:36:51<br>  action是单实例吗? <br>&nbsp;农民 - javen&nbsp; 20:36:56<br>&nbsp;&nbsp; / doget(&nbsp; ,然后 process&nbsp; <br>crane&nbsp; 20:37:21<br>  是不是因为struts什么也没做,所以吧web ui一网打尽了,如果即使出现一个新的web ui也一样支持,那么好象就是struts什么也没做 <br>&nbsp;农民 - javen&nbsp; 20:37:33<br>  action 是单实例的。&nbsp; 所以建议不要除也 execute 之外,不应该有属性。&nbsp; <br>摄氏十度&nbsp; 20:38:09<br>  nested标签能讲讲吗? <br>_阿古&nbsp; 20:38:12<br>  用空看看它的web ui的实现 <br>&nbsp;农民 - javen&nbsp; 20:38:16<br>  struts web ui 就是 struts 提供的 taglib 。&nbsp; 很方便使用啊?&nbsp; 结合新出来的 jstl ,我是感觉一般的 web ui 都可以搞定了。 而且应该不算复杂。&nbsp; <br>郁也风&nbsp; 20:38:39<br>  呵呵,struts提供了一个比较灵活的框架,其他的东东都是可插拔的:) <br>郁也风&nbsp; 20:38:46<br>  可惜不是热插拔 <br>&nbsp;农民 - javen&nbsp; 20:38:59<br>  struts 自己都声称,他实际就是 control 啊。 核心类就这二个吧,我认为:&nbsp;&nbsp; <br>  <br>  actionservlet&nbsp;&nbsp; requestprocessor <br>   <br>spring&nbsp; 20:39:09<br>  springstruts的区别大吗? <br>郁也风&nbsp; 20:39:25<br>  太大了:) <br>_阿古&nbsp; 20:39:27<br>  springstruts差别很大 <br>base&nbsp; 20:39:36<br>  就不是一回事儿 <br>&nbsp;农民 - javen&nbsp; 20:39:41<br>  不好意思, nested 标签我都没有用过。&nbsp;&nbsp; 主要是多层的嵌套吧,目前的系统没有用到,也懒得去研究。&nbsp; <br>方片&nbsp; 20:40:07<br>  多层嵌套? <br>无聊神灯&nbsp; 20:40:16<br>  请问一个问题,表单提交后再刷新页面就会出现重复提交的现象,怎么解决这个问题? <br>_阿古&nbsp; 20:40:18<br>  不过spring也作了web层的东东 <br>_阿古&nbsp; 20:40:28<br>  有很多方法 <br>摄氏十度&nbsp; 20:40:29<br>  据说nested标签能够使页面获得最大的重用性和灵活性,只知道这么一点,也没用过 <br>&nbsp;农民 - javen&nbsp; 20:40:40<br>  struts 的 token 解决的就是重复提交问题。 过会有一点代码&nbsp; <br>傻子&nbsp; 20:40:45<br>  禁止刷新呀 <br>spring&nbsp; 20:40:48<br>  fajavaen,俺有个建议,我们这个群经常有讲座,今天这个讲座我听得懂一些,我想您能不能给我们来个理论与实际相结合,即给我们一些具体的例子呢? <br>无聊神灯&nbsp; 20:40:49<br>  期待。。。 <br>郁也风&nbsp; 20:41:02<br>  springweb层上的东东,感觉比struts用起来爽点哦:)不过也只是看看,没实际用过 <br>char&nbsp; 20:41:19<br>  token 在struts_example里面就有 <br>无聊神灯&nbsp; 20:41:22<br>  呵呵,下次风风说说spring的mvc。。 <br>摄氏十度&nbsp; 20:41:22<br>  例子?struts自带呀 <br>郁也风&nbsp; 20:41:29<br>  例子,struts自己的例子就最精彩了;) <br>动物园的猪&nbsp; 20:41:33<br>  我喜欢使用velocity作ui的展室 <br>&nbsp;bill-过儿&nbsp; 20:41:42<br>无聊神灯&nbsp; 20:41:22<br>  ! <br>动物园的猪&nbsp; 20:41:59<br>  我们现在就用struts作控制,velocity作显示,效果不错果 <br>&nbsp;农民 - javen&nbsp; 20:42:21<br>  struts + tiles 也应该很不错的。&nbsp;&nbsp;&nbsp;&nbsp; <br>郁也风&nbsp; 20:42:24<br>  不过感觉完全用velocity做显示,还是有点过火啊:) <br>郁也风&nbsp; 20:42:30<br>  我更喜欢局部用用 <br>风舞狂沙&nbsp; 20:42:46<br>  有没有人用过javawebstudio这个东西啊? <br>char&nbsp; 20:42:46<br>  为什么会过火? <br>无聊神灯&nbsp; 20:42:52<br>  velocity做模板才好。。呵呵 <br>摄氏十度&nbsp; 20:43:03<br>  萝卜、白菜各有所爱 <br>char&nbsp; 20:43:08<br>  用过没有什么特别 <br>动物园的猪&nbsp; 20:43:15<br>  我用的很爽 <br>&nbsp;农民 - javen&nbsp; 20:43:17<br>  四、技巧与最佳实践<br>  1、jsp 文件隐藏:放到 web-inf 里<br>  &nbsp;默认情况下,web-inf 目录是是受保护的,对于 browser 是不可见的。但对于 struts 则可以 forward 到 web-inf 里。 <br>&nbsp;农民 - javen&nbsp; 20:44:00<br>  但我认为意义不大。&nbsp; 使用 struts 的观念, jsp 里完全只是 view 了,隐藏也没有什么意义&nbsp; <br>无聊神灯&nbsp; 20:44:37<br>  欺骗菜鸟。。哈哈 <br>风舞狂沙&nbsp; 20:45:01<br>   <br>&nbsp;农民 - javen&nbsp; 20:45:05<br>  ???&nbsp;&nbsp; <br>郁也风&nbsp; 20:45:22<br>  现在在考虑把aaa.do?aa=1&amp;bb=2也给改一改:) <br>无聊神灯&nbsp; 20:45:39<br>  改什么? <br>风舞狂沙&nbsp; 20:45:41<br>  hashmap啊 <br>摄氏十度&nbsp; 20:45:41<br>  什么意思? <br>&nbsp;农民 - javen&nbsp; 20:45:42<br>  可以都用&nbsp; <html:hidden&nbsp; <br>郁也风&nbsp; 20:45:55<br>  换成/aa.1/ bb.2/aaa.htm:) <br>风舞狂沙&nbsp; 20:46:07<br>   <br>无聊神灯&nbsp; 20:46:08<br>  咋改? <br>郁也风&nbsp; 20:46:20<br>  简单啊,不是有action吗:) <br>郁也风&nbsp; 20:46:42<br>  自己加个处理了:)不过好像没啥意义,如果用struts的话 <br>无聊神灯&nbsp; 20:46:46<br>  愿闻其详 <br>char&nbsp; 20:47:13<br>  用apache的httd的rewrite模块可以很容易做这个处理。 <br>&nbsp;农民 - javen&nbsp; 20:47:14<br>  意义不大,因为所有动作都可以在 action 里控制&nbsp; <br>郁也风&nbsp; 20:47:29<br>  其实就类似于对request做个更改而已 <br>&nbsp;农民 - javen&nbsp; 20:47:37<br>  rewrite 改成目录对&nbsp; google 有很大的意义&nbsp; <br>郁也风&nbsp; 20:47:45<br>  用那个模块就显的太不独立了 <br>郁也风&nbsp; 20:48:07<br>  可以自己定义一个类似的规则,然后在filter里面实现 <br>郁也风&nbsp; 20:48:12<br>  不过javen继续 <br>char&nbsp; 20:48:14<br>  不如搞个filter <br>&nbsp;农民 - javen&nbsp; 20:48:29<br>  2、只链接到 actions、使用forwardaction<br>  &nbsp;一般建议,使用 struts 的项目,jsp 文件对 browser 隐藏,即所有的访问,都必须通过 action 。特别如果用 baseaction 的话,就可以统一做集中的控制,包括用户验证、访问控制。&nbsp;如果某个 jsp 页面,实现不需要 struts 做任何动作,那在配置文件里,直接使用 forwardaction 直接 forward 到 jsp 页面,就避免了自己写一个空的 action 。为什么? 方便以后可能修改控制流程,改动一下配置文件就好了。 <br>&nbsp;农民 - javen&nbsp; 20:49:25<br>  3、避免重复提交 tokens<br>!istokenvalid(request, true&nbsp;&nbsp; {<br>request ;<br>request, new actionmessage(&quot;>&quot;error&quot; ;<br>  &nbsp;}<br>   <br>char&nbsp; 20:49:39<br>  其实servletservlet-mapping是支持正则表达式的,不知道struts支不支持正则表达式。 <br>风舞狂沙&nbsp; 20:50:18<br>   <br>&nbsp;农民 - javen&nbsp; 20:50:38<br>  哦?&nbsp;&nbsp; struts 的路径是你自己在 struts-config.xml 里设定的啊?&nbsp;&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:52:00<br>  对于&nbsp; token ,如果想进一步了解,建议直接看源代码。 <br>   <br>&nbsp;农民 - javen&nbsp; 20:52:09<br>  4、actionform 应该单纯<br>  &nbsp;只是与 html form 交互,不应该承担更多的功能。 javabeans 是数据交换的核心<br>  &nbsp;actionform 不应该传递到 action 之后去。 这样,后面的数据交换,就需要另外的 javabean / model / vo / po 。 model 作为数据交换,在所有层次之间传递。甚至会传递到 view ,当 view 一个 list 时,list 里就是直接从数据库取得的 model list&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:53:16<br>  5、beanutils<br>  &nbsp;我们知道 html form 里的数据都是 string 类型,而 actionform 可以完全是你自己的特别类型。struts 调用了 beanutils 来做这个类型转换工作。struts 默认实现了一些常用的类型转换,比如 java.sql.date 都可以。你可以做自己需要的类型转换,比如 java.util.date 默认没有,可以这样加入自己的: convertutils.register 。这个加入动作,默认在 actionservlet 里做,这样需要继承原来 actionservlet 的默认实现,加入自己的。另外一种方式是,在 baseaction 的 static 里加。总之在使用前让 struts 知道就好了。<br>   <br>风舞狂沙&nbsp; 20:53:33<br>  那初始化数据,最好在哪里做?我是说从数据库取出的数据 <br>&nbsp;农民 - javen&nbsp; 20:54:16<br>  放到 model javabean 里。&nbsp; 然后 copy 到 actionform 里 <br>风舞狂沙&nbsp; 20:54:18<br>  我一般都是在retet里面调用ejb的接口 <br>&nbsp;农民 - javen&nbsp; 20:54:24<br>  &nbsp;在我的开发过程中,还大量使用 beanutils 的 properyutils.copyproperties 功能,实现二个 javabena 的属性 copy 。他是根据 getter / setter 方法来实现。 <br>char&nbsp; 20:54:54<br>  convertutils.register,农民有没有例子,上个星期在烦着这个问题 <br>&nbsp;农民 - javen&nbsp; 20:55:41<br>  &nbsp;&nbsp;&nbsp; static {<br>new sqldateconverter(null , java.sql.date.class ;<br>  &nbsp;&nbsp;&nbsp; }<br>  <br>  我放在 baseaction 里 <br>&nbsp;农民 - javen&nbsp; 20:56:39<br>null&nbsp;&nbsp; 这个类是你自己实现的。&nbsp;&nbsp; 实际上,implement 他的一个接口就好了。 <br>  <br>  因为默认的 java.sql.date converter 有点小问题,就是如果不输入,会报错。&nbsp; 所以我必了一下。&nbsp; <br>&nbsp;农民 - javen&nbsp; 20:56:52<br>  public final class sqldateconverter implements converter { <br>风舞狂沙&nbsp; 20:57:24<br>  <form-bean>里面定义的actionform的属性对全局有多大影响?因为我老是会漏下几个,不过也没有发现影响到什么啊 <br>&nbsp;农民 - javen&nbsp; 20:58:05<br>  ??? 没有太明白什么意思 <br>风舞狂沙&nbsp; 20:58:48<br>  就是<form-bean>里面的bean属性和actionform中定义的不一致啊 <br>风舞狂沙&nbsp; 20:59:50<br>  比如我在actionform中加了一个,但是在struct-config.xml的<form-bean>中又忘了加了 <br>&nbsp;农民 - javen&nbsp; 21:00:34<br>  配置文件里只量定义 actionform bean 名称,指向你的哪个 actionform 类啊,并不定义属性啊 <br>郁也风&nbsp; 21:00:49<br>  那好像就是那个dy。。。啥的了啊:) <br>风舞狂沙&nbsp; 21:01:14<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <form-bean name=&quot;logonform&quot; type=&quot;com.scard.struts.form.logonform&quot;><br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <form-property name=&quot;password&quot; type=&quot;java.lang.string&quot; initial=&quot;scard&quot;><br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <form-property name=&quot;username&quot; type=&quot;java.lang.string&quot;><br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </form-bean><br>   <br>无聊神灯&nbsp; 21:01:26<br>   <br>风舞狂沙&nbsp; 21:01:46<br>  这是用easy struts自动生产的 <br>&nbsp;农民 - javen&nbsp; 21:01:46<br>  就是 dynaactionform 。&nbsp; 但它是用来代替 actionform 的。&nbsp; <br>&nbsp;农民 - javen&nbsp; 21:02:37<br>  代替。&nbsp; 用了它,就不需要在创建对应的&nbsp; actionform 。&nbsp; 也就是说 struts 配置文件创建了 actionform&nbsp; <br>郁也风&nbsp; 21:02:39<br>  如果只是简单的内容的话,用用dynaactionform 还无伤大雅,如果是复杂的话,就有电。。。 <br>char&nbsp; 21:03:15<br>  还有个dynaactionvalidateform 是很方便 <br>&nbsp;农民 - javen&nbsp; 21:03:37<br>  我很少用 dynaactionform 。&nbsp; 基本上不用。&nbsp;&nbsp;&nbsp;&nbsp; 实际上,用 eclispe 之类工具生成 getter 与 setter 比慢慢去填属性,速度更快。&nbsp; <br>无聊神灯&nbsp; 21:03:39<br>  直接用request取得参数好了。哈哈 <br>郁也风&nbsp; 21:04:13<br>  我也不用,所以了解听少的,char等会介绍一下把 <br>char&nbsp; 21:04:16<br>  因为struts的这些web需要,因此struts还为beanutils带来了许多功能与类,<br>  例如dynabean. <br>风舞狂沙&nbsp; 21:04:36<br>   <br>风舞狂沙&nbsp; 21:05:27<br>  自己填数据,太麻烦了吧 <br>&nbsp;农民 - javen&nbsp; 21:05:55<br>  request 也可以直接取得啊。&nbsp;&nbsp;&nbsp; <br>  <br>  我的理解是这样的,&nbsp; 到 html form 提交时, 原来的&nbsp; form 属性值像&nbsp;&nbsp; 原来的&nbsp;&nbsp; <input 的特性。<br servlet 一样地提交了,因为这是>  <br>  struts 做的事情是,从 request 里把这些 form 属性取出来, populate 到 actionform 里了。&nbsp; <br>郁也风&nbsp; 21:06:15<br>  right:) <br>&nbsp;农民 - javen&nbsp; 21:06:15<br>  在这个过程中, 需要使用&nbsp; beanutils 做转换。&nbsp;&nbsp; 然后做验证。&nbsp;&nbsp;&nbsp; <br>&nbsp;农民 - javen&nbsp; 21:07:44<br>  五、扩展与另类、怀疑、批评<br>  1、dispath action<br>  &nbsp;大多数时候,每个对象的操作,是这样一些:add/insert edit/update/ remove view list 。 dispathaction 让你把这些动作都放在一个 action 里来做,方法名称就是对应的动作名称。在 struts-config.xml 里设置时,加个 parameter 参数比如为 method ,提交到 dispatchaction 里,你为 method 赋值为对应的动作名称。<br>  &nbsp;考虑到验证问题,我把所有对一个对象的操作放在二个 dispathaction 里。第二个里放了 insert/update 这二个动作,因为它需要验证,需要有 input 参数。 <br>无聊神灯&nbsp; 21:08:13<br>  呵呵,这个dispatchaction好用。 <br>&nbsp;农民 - javen&nbsp; 21:08:59<br>  名称形如:&nbsp;&nbsp; roleaction 放所有其它方法,&nbsp; roleformaction 里放 insert/update 二个动作。&nbsp;&nbsp; 这二个动作导向同一个页面 roleform.jsp 作为 html form&nbsp; <br>摄氏十度&nbsp; 21:09:48<br>  但是insert/update 二个动作的验证也不是一致的得失后怎么办? <br>&nbsp;农民 - javen&nbsp; 21:09:50<br>  roleaction 不需要做验证。&nbsp;&nbsp; roleformaction 是需要做验证的。&nbsp; 需要设置&nbsp; input=&quot;/page/roleform.jsp&quot; <br>郁也风&nbsp; 21:09:54<br>  呵呵,我跟你不同,我都放在一块,然后在xml中多放一个action-mapping,在里面设置validate是否成真 <br>&nbsp;农民 - javen&nbsp; 21:10:56<br>  insert/update 这二个动作的验证会不一致?&nbsp;&nbsp;&nbsp; 实在不行,再分一个啦,只有。 <br>  <br>  肯定还有其他方法的。&nbsp;&nbsp; <br>  <br>  郁也风详细说一下你的办法?&nbsp; <br>郁也风&nbsp; 21:11:40<br>  insert/update 肯定应该一致的吧? <br>摄氏十度&nbsp; 21:11:52<br>  不一定 <br>郁也风&nbsp; 21:12:03<br>  我是把crud都放在一个action里面了的:) <br>char&nbsp; 21:12:15<br>  dispath action<br>  在struts1.2.1规定得很死,<br>  只是限定了edit, save,delete,几个方法,<br>  不容易扩展。 <br>郁也风&nbsp; 21:12:15<br>  如果有不一致的,那就只好分开了:) <br>摄氏十度&nbsp; 21:12:41<br>郁也风 :你的配置文件怎么写? <br>郁也风&nbsp; 21:13:15<br>  配置文件???你现在叫我写个form我都得翻书啊:( <br>摄氏十度&nbsp; 21:13:23<br>  在xml中多放一个action-mapping,在里面设置validate是否成真。<br>  这是怎么写的?有例子吗? <br>摄氏十度&nbsp; 21:13:26<br>  嘿嘿 <br>&nbsp;农民 - javen&nbsp; 21:13:29<br>  to char:&nbsp; dispathaction 的动作完全是自己定义的啊 。&nbsp;&nbsp;&nbsp; method=listauditing <br>微雨心情&nbsp; 21:13:33<br>  猪,很少看到你qq,呵呵,难得啊。 <br>&nbsp;农民 - javen&nbsp; 21:14:18<br>  2、baseaction<br>  &nbsp;一个项目里的 action ,应该有一个 base ,在这里做些自己的集中控制工作。比如用户验证、访问控制等等。<br>  <br>  3、其他扩展:actionmapiing、actionservlet、requestprocessor<br>  4、完全不使用 actionform<br>  &nbsp;matrix 有篇文章,jpetstore 项目也是这样做的。有待进一步研究。我是认为 actionform 是很有用的,所以暂时也没有去研究它。<br>  &nbsp;<a href=&quot;http://www.matrix.org.cn/article/959.html&quot;>http://www.matrix.org.cn/article/959.html</a><br>  5、性能与安全<br>  &nbsp;...... <br>无聊神灯&nbsp; 21:14:43<br>  <br>  这个怎么处理才好? <br>&nbsp;农民 - javen&nbsp; 21:15:06<br>  baseaction 一般都会扩展<br>   requestprocessor 与 actionmapping 可能稍多点。&nbsp; <br>char&nbsp; 21:15:11<br>  当然,是可以在一个properties文件定义,<br>  我的意思是某个类要增加很麻烦,<br>  我的做法是自己另做一个没有限制的action <br>郁也风&nbsp; 21:15:43<br>  怎么说? <br>&nbsp;农民 - javen&nbsp; 21:16:14<br>  我也还是太明白。 呵呵&nbsp;&nbsp; <br>char&nbsp; 21:16:30<br>  是我的问题不明白吗? <br>郁也风&nbsp; 21:16:35<br>  对啊 <br>char&nbsp; 21:18:06<br>  我要增加 editchild&nbsp; removechild, savechild.... <br>char&nbsp; 21:18:14<br>  这样的参数就很麻烦了 <br>&nbsp;农民 - javen&nbsp; 21:18:30<br>  struts actionmapping&nbsp; 里提供了属性 roles ,也就是说 可以在配置文件里设置某个动作的访问权限。<br>  <br>  具体处理是在 requestprocessor 的 processroles ,实际上他就是用的 request.isuserinrole , 是基于容器的 访问控制&nbsp; <br>无聊神灯&nbsp; 21:19:20<br>  这个需要在容器配置吧? <br>&nbsp;农民 - javen&nbsp; 21:19:24<br>  有人扩展 actionmapping 或者 requesetprocessor 来做自己的访问控制。<br>  <br>  而我是把他们放在&nbsp; baseaction 里,感觉更加灵活方便。&nbsp; <br>&nbsp;农民 - javen&nbsp; 21:20:53<br>  我相信在坐的,对 struts 比较熟悉的人,应该不会怀疑 struts 的性能吧。<br>  <br>  看源代码,实际上他并没有做影响性能的事情,呵呵&nbsp; <br>char&nbsp; 21:21:20<br>  农民,不要急,今天讲不完,下次再定个时间再讲1个半钟。 <br>&nbsp;农民 - javen&nbsp; 21:21:33<br>  完了啊。&nbsp; 大概就这些了。&nbsp; <br>无聊神灯&nbsp; 21:21:50<br>  要是action和formbean是接口多好吖~! <br>char&nbsp; 21:22:05<br>  是呀,我天天在这样想。 <br>微雨心情&nbsp; 21:22:31<br>  农民讲得很好啊,要不你整理一下,写一片文章吧。但最好不是qq直接的内容。老实说,qq的内容看起来不好。 <br>&nbsp;农民 - javen&nbsp; 21:22:31<br>  如果需要有默认行为,就不好用接口啊。&nbsp;&nbsp;&nbsp; actionform 也有自己的默认行为。&nbsp; <br>char&nbsp; 21:22:37<br>  如果 formbean extends domainobject会不会省事很多。 <br>风舞狂沙&nbsp; 21:22:47<br>   <br>&nbsp;农民 - javen&nbsp; 21:22:57<br>  六、struts 资源<br>  1、精彩文章与教程<br>  &nbsp;dw的 深入struts 1.1 <a href=&quot;http://www-900.ibm.com/developerworks/cn/java/l-struts1-1/&quot;>http://www-900.ibm.com/developerworks/cn/java/l-struts1-1/</a><br>  &nbsp;蓝色天空java站,感觉教程比较完善 <a href=&quot;http://champion.8866.org/&quot;>http://champion.8866.org/</a><br>  2、开源项目<br>  &nbsp;国内开源论坛 - xforum 也是我最早研究比较多的。版本一直在更新<br>  &nbsp;使用量最多的 webblog - roller 开源项目集大成者。设计比较先进<br>  &nbsp;sf.net 上的 struts 应用项目:有很多的子项目<br>  &nbsp;struts-menu 一个比较不错的树形 menu / tree 的开源项目 <br>风舞狂沙&nbsp; 21:23:09<br>   <br>&nbsp;农民 - javen&nbsp; 21:23:22<br>  3、推荐交流<br>  &nbsp;struts.apache.org 官方网站的资源链接。很完善<br>  &nbsp;<a href=&quot;mailto:user@struts.apache.org&quot;>user@struts.apache.org</a> struts mailing list 可以解决大多数问题<br>  &nbsp;husted.com&nbsp;《struts in action》一书的作者。有一些技巧与最佳实践<br>  &nbsp;matrix subjects 里的 struts 我整理了很多资料<br>  &nbsp;国内论坛 matrix 论坛 struts 版, chinajavaworld.com 的 struts 版<br>  &nbsp;ibm developerworks 上的 struts 专题、赛迪网技术中心 struts 专题<br>  4、推荐工具与书籍<br>  &nbsp;支持 strutseclipse 插件: struts-console<br>  &nbsp;资源管理工具:rbmanager<br>  &nbsp;书籍:struts in action&nbsp; 国人有写一本书,china-pub 上搜索,听说不错。 <br>╃(chris&nbsp;&nbsp; 21:23:42<br>   <br>&nbsp;农民 - javen&nbsp; 21:23:48<br>  <a href=&quot;http://www.matrix.org.cn/subjects&quot;>www.matrix.org.cn/subjects</a> 上我整理了一个专题,大家有兴趣,希望帮着整理一下。&nbsp; <br>无聊神灯&nbsp; 21:23:52<br>  劈里啪啦 <br>&nbsp;农民 - javen&nbsp; 21:23:56<br>  我相信对初学者是有些用处的。&nbsp;&nbsp; <br>郁也风&nbsp; 21:24:03<br>  还有个ninsky。com啊 <br>郁也风&nbsp; 21:24:24<br>  这个域名跟我的某个网名一样,一直想给要过来:) <br>微雨心情&nbsp; 21:24:49<br>  但你今天的东西,我没有看全,是可以整理成为经验总结的 <br>&nbsp;农民 - javen&nbsp; 21:25:26<br>  大概就这样了!&nbsp; 感谢大家支持!&nbsp; <br>  <br>  以后有别的问题,我们再具体交流吧!&nbsp;&nbsp; <br>风舞狂沙&nbsp; 21:25:39<br>   <br>摄氏十度&nbsp; 21:25:46<br>  我以前只是把formbean里的属性都定义成string和int的,今天才知道原来可以定义成自己的类型。没理解错吧? <br>spring&nbsp; 21:25:59<br>  javen,以后有问题多多向你请教啊。 <br>&nbsp;农民 - javen&nbsp; 21:26:23<br>  struts 有默认一些型态转换, 自己也可以定义 <br>郁也风&nbsp; 21:26:45<br>  俺也是今儿才知道:( <br>摄氏十度&nbsp; 21:26:57<br>  还有一个相关问题 <br>&nbsp;农民 - javen&nbsp; 21:27:03<br>  实际上 java.sql.date是比较经常需要用到的。&nbsp; <br>无聊神灯&nbsp; 21:27:17<br>  收获不小哦。。看来农民对struts很有研究吖。哈哈 <br>微雨心情&nbsp; 21:27:43<br>   java.sql.date怎么处理的啊? <br>char&nbsp; 21:28:02<br>   讲讲时间的定义。农民是怎么用的?<br>  例如,日期,时间 <br>&nbsp;农民 - javen&nbsp; 21:28:08<br>  哪里哪里,你们经验都比我多啊。&nbsp; 我也还有些部分没有涉及到。&nbsp; 比如 tiles 我认为是可以有很好的应用的。&nbsp; 只是目前的项目有不到。&nbsp; <br>spring&nbsp; 21:28:08<br>  just do it. <br>摄氏十度&nbsp; 21:28:19<br>  如果formbean里有一个user类型的a,那么action里边form.geta()返回的是user类型的? <br>spring&nbsp; 21:28:38<br>  thank you javen.<br>  you helped me a lot. <br>郁也风&nbsp; 21:28:41<br>  还是需要你自己扩展convert的 <br>&nbsp;农民 - javen&nbsp; 21:28:56<br>  java.sql.date 就是日期。&nbsp; 没有时间啊。&nbsp; <br>  <br>  如果要时间,得 java.sql.time&nbsp; <br>无聊神灯&nbsp; 21:29:04<br>  怎么扩展,我郁闷了。。。 <br>char&nbsp; 21:29:20<br>  convertutil我以前看过代码,里面带了很多默认的转换 <br>&nbsp;农民 - javen&nbsp; 21:29:47<br>  微雨心情:&nbsp;&nbsp; struts 调用 beanutils 帮你做处理。 <br>  <br>  摄氏十度:&nbsp; 是的。&nbsp; <br>char&nbsp; 21:29:52<br>  应该是说java.util里面没有专门处理时间的类型,只能用java.sql.time吧。 <br>摄氏十度&nbsp; 21:30:06<br>  哦。今天还是知道了很多新东西。感谢 <br>摄氏十度&nbsp; 21:30:25<br>  起码以后会少走弯路 <br>&nbsp;农民 - javen&nbsp; 21:30:27<br>   <br>&nbsp;农民 - javen&nbsp; 21:30:37<br>  <a href=&quot;http://www.matrix.org.cn/blog/javen/archives/000422.html&quot;>http://www.matrix.org.cn/blog/javen/archives/000422.html</a> <br>动物园的猪&nbsp; 21:31:38<br>  感谢感谢! <br>&nbsp;农民 - javen&nbsp; 21:31:44<br>  日期时间方面,&nbsp; 如果需要与数据库打交道:<br>  日期:&nbsp;&nbsp; java.sql.date<br>  时间:&nbsp;&nbsp; java.sql.time<br>  日期时间:&nbsp; java.sql.timestamp <br>  这也是与 sql 规范符合的。&nbsp;&nbsp; <br>摄氏十度&nbsp; 21:32:16<br>  我在开发的时候总是一个烦恼:就是你的pojo大多数时候和你的formbean完全一样 <br>kiki&nbsp; 21:32:19<br>  好 <br>crane&nbsp; 21:32:25<br>   <br>&nbsp;农民 - javen&nbsp; 21:32:35<br>  beanutils.copyproperties&nbsp;&nbsp; <br>&nbsp;农民 - javen&nbsp; 21:33:05<br>  摄氏十度:&nbsp; 使用这个,来在二个属性类似的 javabean 里 copy&nbsp; <br>char&nbsp; 21:33:06<br>  但是formbean是一对多或者一对一的时候就麻烦了 <br>摄氏十度&nbsp; 21:33:12<br>  如果加一个字段,都要一起改,很烦 <br>kiki&nbsp; 21:33:46<br>  合到一起改的话会很烦, <br>无聊神灯&nbsp; 21:33:47<br>  formbean有关系的? <br>&nbsp;农民 - javen&nbsp; 21:34:04<br>  actionform 与 pojo 的字段不一定一样的。实际上, actionform 里经常需要有一些 pojo 里没有的属性 <br>char&nbsp; 21:34:24<br>  不如试试 domainobject extends formbean <br>摄氏十度&nbsp; 21:34:30<br>  我同意。但是我遇到的情况是,大部分都一样 <br>动物园的猪&nbsp; 21:35:05<br>  使用代理,呵呵 <br>&nbsp;农民 - javen&nbsp; 21:35:08<br>  呵呵,表示的东西是一样的,当然大部分都一样。&nbsp; 但也还是 copy&nbsp; <br>郁也风&nbsp; 21:35:53<br>  好像比较专业的说法叫dto? <br>郁也风&nbsp; 21:36:03<br>  哦,应该大写:dto <br>摄氏十度&nbsp; 21:36:08<br>  我也听说过 <br>摄氏十度&nbsp; 21:36:26<br>  就是没试过 <br>七彩狼&nbsp; 21:36:35<br>  我也是 <br>&nbsp;农民 - javen&nbsp; 21:36:36<br>  domain model 好像是另一个问题了。&nbsp; <br>  <br>  我现在的作法是:&nbsp; actionform&nbsp; copy 到 pojo 。&nbsp;&nbsp; 中间有一个 service , 然后到 pojo 在 dao 里 save&nbsp; <br>动物园的猪&nbsp; 21:36:57<br>string name {<br>name ;<br>  } <br>微雨心情&nbsp; 21:37:01<br>  对于java.sql.date也是可以直接使用beanutils拷贝的?string---&gt;date? <br>七彩狼&nbsp; 21:37:11<br>  代理的方式 <br>动物园的猪&nbsp; 21:37:16<br>  狼来了 <br>摄氏十度&nbsp; 21:37:28<br>  猪还不跑! <br>微雨心情&nbsp; 21:37:29<br>  2位好啊 <br>&nbsp;农民 - javen&nbsp; 21:37:32<br>  微雨心情:&nbsp; 是的。&nbsp;&nbsp; <br>动物园的猪&nbsp; 21:37:48<br>  z,en好 <br>无聊神灯&nbsp; 21:37:53<br>  类型不对都成?疑问吖。。 <br>七彩狼&nbsp; 21:38:21<br>  转型在formbean中做,formbean中尽量都是string <br>微雨心情&nbsp; 21:38:46<br>object o 的方式处理呢?咋办? <br>&nbsp;农民 - javen&nbsp; 21:38:47<br>  beanutils 帮你转啊。&nbsp; 需要有对应的 converter 。&nbsp; 建议大家直接看源代码。&nbsp;&nbsp; <br>郁也风&nbsp; 21:38:48<br>动物园的猪&nbsp; 21:36:57<br>string name {<br>name ;<br>  } <br>  这样处理还是得写俩类似的东东啊:( <br>char&nbsp; 21:39:33<br>&nbsp; <br>微雨心情&nbsp; 21:39:33<br>  我用那个beanutils,但总觉得有些时候可能出现问题,可能是我没有完全的测试就不放心的原因吧。呵呵。:) <br>摄氏十度&nbsp; 21:39:46<br>  他的意思是直接把domainmidel放到formbean里了 <br>摄氏十度&nbsp; 21:40:14<br>  beanutils好用,就放心用吧 <br>微雨心情&nbsp; 21:40:18<br>  对的,但这个是复杂的对象呢?而不只是string <br>动物园的猪&nbsp; 21:40:19<br>  隔离啊,隔离了ui和domain,domain是核心 <br>风舞狂沙&nbsp; 21:40:23<br>  to 微雨心情:你的颜色让我受不了 <br>风舞狂沙&nbsp; 21:40:35<br>   <br>char&nbsp; 21:40:38<br>date.valueof(value.tostring(&nbsp;&nbsp; ; <br>微雨心情&nbsp; 21:40:46<br>  我最喜欢红色了。。。 <br>郁也风&nbsp; 21:40:47<br>  嗯,这样倒也不错 <br>七彩狼&nbsp; 21:41:04<br>  formbean在概念上是个很好的东西,但在实际使用的时候,却是很烦,尤其是数量多了之后 <br>动物园的猪&nbsp; 21:41:18<br>  关键是隔离,不过,对于小项目,把formbean该把该把,当个domainmodel也未尝不可嘛 <br>char&nbsp; 21:41:18<br>  微雨心情喜欢红色,下次让他红色。 <br>微雨心情&nbsp; 21:41:25<br>  对啊,而且它的范围太小。我不喜欢的。 <br>摄氏十度&nbsp; 21:41:41<br>  不知道struts1.2是个什么样子? <br>&nbsp;农民 - javen&nbsp; 21:41:54<br>  差不多吧。&nbsp; 变化不大。&nbsp; <br>微雨心情&nbsp; 21:41:55<br>  在联想处理上海联通的项目的时候,就是完全的去掉forambean的 <br>无聊神灯&nbsp; 21:42:15<br>  理由? <br>char&nbsp; 21:42:22<br>  不用forambean,用什么? <br>微雨心情&nbsp; 21:42:30<br>  我问过相关的人员,基本上在使用的过程中,formbean是很不舒服的事情。 <br>&nbsp;农民 - javen&nbsp; 21:42:32<br>  我是认为 actionform&nbsp; 是必须的。&nbsp; 实际上 spring web 也有类似的设施的 <br>七彩狼&nbsp; 21:43:00<br>  formbean就像是个鸡肋,呵呵,食之无味,弃之可惜 <br>动物园的猪&nbsp; 21:43:03<br>  ui层的model <br>微雨心情&nbsp; 21:43:05<br>  他们让struts成为单纯的也是有效的 controller 仅仅如此。 <br>摄氏十度&nbsp; 21:43:37<br>  现在webwork、taperstry也很火,struts如果不改变一下,可能用的人会变少 <br>郁也风&nbsp; 21:43:39<br>  那么那些request的信息还是自己手工处理了? <br>char&nbsp; 21:43:40<br>  可惜了很多convertor,和validator <br>微雨心情&nbsp; 21:43:59<br>  基本上,beanutils的使用是好的,但是,在struts里面formbean值得争议。 <br>&nbsp;农民 - javen&nbsp; 21:44:30<br>  如果不用 actionform ,那 form 属性、 converter / validator 只有自己实现了。&nbsp;&nbsp; 呵呵,那我不敢想像有多麻烦&nbsp; <br>动物园的猪&nbsp; 21:44:31<br>  我感觉无所谓,想webwork把,formbean和controller合并起来也未尝不可 <br>微雨心情&nbsp; 21:44:37<br>  另外,最近,我觉得内建于viewbean的validate是值得的。 <br>&nbsp;农民 - javen&nbsp; 21:44:50<br>  要不用别的框架之类来完成 。&nbsp;&nbsp; 完全自己做好麻烦啊。&nbsp; <br>摄氏十度&nbsp; 21:44:58<br>  七彩狼,你们家猫好了吗? <br>动物园的猪&nbsp; 21:45:06<br>  关键是只要代码清晰,结构合理,无所谓那么多概念,嘿嘿 <br>风舞狂沙&nbsp; 21:45:08<br>   <br>无聊神灯&nbsp; 21:45:27<br>  下次让spring介绍一下spring的mvc。。哈哈<br>  大家鼓掌欢迎。。 <br>无聊神灯&nbsp; 21:45:34<br>   <br>七彩狼&nbsp; 21:45:38<br>  呵呵,多谢你对咪咪的关心,今天又强迫给它低了两滴眼药,好多了 <br>微雨心情&nbsp; 21:45:41<br>我的称呼,联想cpn项目称呼)里面做,而不是集中处理。 <br>&nbsp;农民 - javen&nbsp; 21:45:52<br>  我认为不是概念的问题,是别人已经为你做了很多事情,你只需要调用。&nbsp; 而你现在想自己重新来造轮子 <br>郁也风&nbsp; 21:46:09<br>微雨心情&nbsp; 21:45:41<br>我的称呼,联想cpn项目称呼)里面做,而不是集中处理。 <br>  仔细说说吧<br>   <br>crane&nbsp; 21:46:12<br>无聊神灯&nbsp; 21:45:27<br>  下次让spring介绍一下spring的mvc。。哈哈<br>  大家鼓掌欢迎。。 <br>  <br>  spring在哪里呢 <br>七彩狼&nbsp; 21:46:21<br>  大家可以看看webwork,虽然都是实现同样的功能,但是感觉上却好的多 <br>spring&nbsp; 21:46:36<br>  我虽然叫spring但是我的并不会spring,不好意思。呵呵。 <br>微雨心情&nbsp; 21:46:37<br>  但有个概念我是怀疑:那就是在viewbean里面的流程控制。 <br>无聊神灯&nbsp; 21:46:44<br>  ww2确实简单精巧。。 <br>七彩狼&nbsp; 21:46:58<br>  尤其是xwork的设计思路,实在是值得学习 <br>动物园的猪&nbsp; 21:47:02<br>  轮子当然不要在发明,但是,我觉得够用就好 <br>微雨心情&nbsp; 21:47:02<br>  也就是直接在viewbean页面对象里面的 controller <br>_阿古&nbsp; 21:47:29<br>  顶 <br>动物园的猪&nbsp; 21:47:31<br>  struts俺觉得很好,就一点,不好测试 <br>微雨心情&nbsp; 21:47:34<br>  xwork和webwork2我觉得不错,但是,这些开源的东西,总的来说,我是有点担心的。 <br>_阿古&nbsp; 21:47:48<br>  担心啥子? <br>微雨心情&nbsp; 21:47:48<br>  web系统的测试,我不主张。 <br>微雨心情&nbsp; 21:47:58<br>  1:可能不开源了; <br>char&nbsp; 21:48:03<br>  用struts-test<br>动物园的猪&nbsp; 21:47:31<br>  struts俺觉得很好,就一点,不好测试&nbsp; <br>动物园的猪&nbsp; 21:48:05<br>  没有测试简直无法活下去了 <br>微雨心情&nbsp; 21:48:08<br>  2:更新可能不及时; <br>&nbsp;农民 - javen&nbsp; 21:48:12<br>  现在 web测试工具有不少了。&nbsp; struts 也有。&nbsp; <br>微雨心情&nbsp; 21:48:21<br>  3:实现可能改变很大或者分歧。 <br>动物园的猪&nbsp; 21:48:25<br>  struts-test,噢,学一下ing <br>摄氏十度&nbsp; 21:48:45<br>  记下了 <br>微雨心情&nbsp; 21:48:55<br>  即使可以测试struts,我也觉得成本不划算。 <br>spring&nbsp; 21:48:56<br>  有一个问题,当我们用jsp作开发时,有时是要用到javascript的。我想知道,在使用struts时,是不是可以完全脱离javascript.比如数据输入的验证之类的? <br>_阿古&nbsp; 21:49:05<br>  不开源了你可以自己继续用开源的<br>  其实最重要的是像高手学习框架的设计等<br>  不光是怎么用 <br>七彩狼&nbsp; 21:49:07<br>  呵呵,webwork的测试就容易多了, <br>动物园的猪&nbsp; 21:49:13<br>  狼,赶紧推出你们的学徒项目八 <br>spring&nbsp; 21:49:14<br>  这个问题由fajaven来解答吧。 <br>摄氏十度&nbsp; 21:49:29<br>   <br>char&nbsp; 21:49:33<br>  不可能<br>spring&nbsp; 21:48:56<br>  有一个问题,当我们用jsp作开发时,有时是要用到javascript的。我想知道,在使用struts时,是不是可以完全脱离javascript.比如数据输入的验证之类的?&nbsp; <br>微雨心情&nbsp; 21:49:35<br>  我不觉得开源的一定好。 <br>七彩狼&nbsp; 21:49:37<br>  我们一直在努力!!! <br>郁也风&nbsp; 21:49:41<br>  下次是不是阿古讲ww2啊? <br>无聊神灯&nbsp; 21:49:50<br>  支持吖..... <br>&nbsp;农民 - javen&nbsp; 21:49:55<br>  我相信完全不有 js 是不可能的。 实际上,如果需要灵活性与美观是必须使用 js 的<br>  <br>  但验证多数时候可以不需要。&nbsp; 用 struts validator&nbsp; <br>char&nbsp; 21:49:58<br>  非常赞成<br>微雨心情&nbsp; 21:49:35<br>  我不觉得开源的一定好。&nbsp; <br>无聊神灯&nbsp; 21:49:59<br>   <br>_阿古&nbsp; 21:49:59<br>  开源的<br>  好不好决定在你,<br>  没有人强迫你用噢 <br>微雨心情&nbsp; 21:50:01<br>  不过这些也遥远了,我最近考虑的不是这些,而是业务 <br>郁也风&nbsp; 21:50:04<br>  hoho,js可是博大精深的哦,哪天谁讲讲吧:) <br>七彩狼&nbsp; 21:50:16<br>微雨心情&nbsp; 21:50:01<br>  不过这些也遥远了,我最近考虑的不是这些,而是业务 <br>   <br>摄氏十度&nbsp; 21:50:22<br>  tapestry谁能讲讲? <br>七彩狼&nbsp; 21:50:23<br>  又多了一个伙伴,呵呵 <br>微雨心情&nbsp; 21:50:31<br>  以及业务到实现的中间过程如何更好的结合。 <br>spring&nbsp; 21:50:31<br>  看来我们还是摆脱不了javascript这个令人烦的东东。因为js有时让人不舒服。 <br>郁也风&nbsp; 21:50:34<br>  tapestry估计的magicgod了 <br>七彩狼&nbsp; 21:50:36<br>  还是业务更实际些,呵呵 <br>动物园的猪&nbsp; 21:50:45<br>  一起看企业家够模式吧, <br>郁也风&nbsp; 21:50:48<br>  没有js我们会更不舒服的:) <br>_阿古&nbsp; 21:50:51<br>  js应该让美工来做 <br>char&nbsp; 21:50:57<br>  js动态影射,数组 功能超强<br>郁也风&nbsp; 21:50:04<br>  hoho,js可是博大精深的哦,哪天谁讲讲吧:)&nbsp; <br>微雨心情&nbsp; 21:51:05<br>  总的来看,我们可能过多的在页面花费精力了。 <br>郁也风&nbsp; 21:51:06<br>  汗,美工有几个会js啊:( <br>&nbsp;农民 - javen&nbsp; 21:51:10<br>  阿古:&nbsp; webwork<br>  magicgod :&nbsp; tapestry <br>  <br>  下期:&nbsp; 冰云 讲&nbsp; rbac&nbsp; <br>


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons