??xml version="1.0" encoding="utf-8" standalone="yes"?>
在网上搜Annotation的学?fn)资料不是很多,q是用的Z?img src="/CuteSoft_Client/CuteEditor/images/emembarrassed.gif" alt="" align="absmiddle" border="0" />Q比较经典的入门是q个Q?a target="_blank" title="实战:(x)设计自己的Annotation" >实战:(x)设计自己的AnnotationQ很清楚Q通俗易懂Q这里我׃赘述了。然而仅仅是弄懂它是怎么回事Q具体还是没什么用处,q也是大多数开发h员的感觉?br />
在现在的公司的经历两ơ框架升U,W一ơ没有用到AnnotationQxml配置文g大行光QAction跌{、Ibatis sqlmapper、Form表单(我们的表单都是从后台生成?Q整个项目xmlD~ؕQ每个模块都有自׃属的配置文gQ然后集中到一起处理,而我们最痛苦的莫q于写那大量重复的配|文件?br />
后来公司接了个ERP的单子,技术ȝ马上意识到框架该升了,他技术很牛,我们公司的框架就是他一人写的,两周之后Q新框架出炉Qxml只保留三分之一QAction跌{、Form表单都不再用xml配置Q而是Annotation横空ZQ给我的感觉Q它?yu)像一个救世主Q让我们的框枉生,它就是这ơ升U的最大亮点,只有sqlmapper依然保留Q这无可厚非Q因为它原本是ibatis装的,Action控制器既不是Struts1QStruts2Q也不是WebworkQ是ȝ自己装的ServletQForm表单都由后台生成jslg抛到前端Q通过反编译看到源码,其实q是很基的,贴些代码上来看下吧:(x)
1.Actionh部分Q?br />
* 昄新增面
* author YuWenLin
* date 2010-5-13 上午10:31:57
* @param data
*/
@Action("/add.shtml")
@Permission("client.ContractType.add")
public void add(ActionData data){
FormBuilder builder = data.getService(FormBuilder.class);
builder.append(Type.class);
builder.setAction("client/contract/type/add.do");
data.put("script", builder);
//向页面抛出cookie提示信息
MessageUtil.putMessage(data);
data.setResulter("template");
data.setPath("client/contract/type/type.shtml");
}
2.再来看看@Action底层的定义:(x)
import java.lang.annotation.Annotation;
public interface Action
extends Annotation
{
public abstract String value();
}
3.JavaBean生成表单Q?br />
@Valider({"notempty","len(2,8)"})
public void setName(String name) {
this.name = name;
}
4.@Widget底层定义Q?br />
public interface Widget
extends Annotation
{
public abstract String value();
public abstract String defaultValue();
public abstract String dataType();
public abstract String dataSource();
}
怎么P看到q些Q似乎觉得Annotation开始v作用了,其实我一直觉得,Annotation是为xml所生,因ؓ(f)它们俩是d_(d)不管单一地用谁,都有~陷Q?br />
只有l合才是完善Q正所谓,没有最好,只有更好Q合理就行?br />
在这里我可能没有贴出什么@Annotation技术含量的东西Q但是我惌表达的是一U思想Q一U框架的思想Qƈ不是什么地斚w能用到AnnotationQ一般的中小型项目根本没必要用它Q因为xml搞定,所以用在需要用的地方,它的能量发挥到最大。。?br />
以上仅ؓ(f)一家之aQ欢q拍砖。。?br />
]]>
]]>
<script type="text/javascript" src="thickbox.js"></script>
<link rel="stylesheet" href="thickbox.css" type="text/css" />
q有是通过thickbox函数调用Q如tb_init()、tb_show()Q见下文?br />
几种不同用法Q?br />
1.点击昄囄Q?br />
<a href="#TB_inline?height=155&width=300&inlineId=div2&modal=true" class="thickbox">Show hidden modal content.</a>
<div id="div1" style="display:none">
<P>
q是一个非模式对话框?br />
</P>
</div>
<div id="div2" style="display:none">
<P>
q是一个模式对话框?br />
<p style="TEXT-ALIGN: center"><INPUT id="Login" onclick="tb_remove()" type="submit" value=" Ok " /></p>
</P>
</div>
怎样做呢一L(fng)Q给d链接加thickbox样式Q?br />
~辑同样是一P(x)先将原信息提取出来,再让用户修改Q?br />
代码也一P(x)
<a href="Pic01.jpg"><img src="Pic01s.jpg" border="0"/></a>
<a href="Pic02.jpg"><img src="Pic01s.jpg" border="0"/></a>
</div>
$(function() {
tb_init("#PicList a[img]");});
如点ȝ图,要显C大?~略图URL只不q在大图URL的后~前加了s:
<img src="Pic01s.jpg" border="0"/>
<img src="Pic01s.jpg" border="0"/>
</div>
$(function() {
$("#PicList img").click(function() {
tb_show("",this.src.substring(0,this.src.length-5)+'.jpg',false);
});});
]]>
首先来说使用步骤Q?/p>
1.在My97DatePicker主页下蝲控gQ?/p>
目前的版本是:4.2 正式?发布?008-12-03
http://www.my97.net/dp/down.asp
2.文件解压包(一个文仉不要删除)拯到classpath/webroot?/p>
3.直接使用<script />引入Q?/p>
<script type="text/javascript" defer="defer" src="<%=request.getContextPath() %>/My97DatePicker/WdatePicker.js"></script>
4.?lt;input type="text"/>中调用:(x)
<input type="text" name="time" onfocus="WdatePicker()">
其次来说一下我在用中到的问题:(x)
1.IE?无法打开internet站点 。。。。。已l止操作
q个问题搞了好半天,|上到处查,最后才在csdn上看到解军_法:(x)
a.如果面?lt;base/>标签的:(x)则要在第3步js引入后添?lt;base target="_self" />;
b.?lt;script/>中添加属性defer="defer"; //是q具属性救了我
2.在步?中调用了Q结果不出来Q?/p>
开始以为是stuts1.2 标签的原因,l果不是Q后来反复测试,才搞定了
其实调用的时候有很多Ҏ(gu)Q然而有的方法不一定出得来Q所以要反复试
q是My97DatePicker的主:(x)http://www.my97.net
里面有控件下载,使用演示Q问题解决等
在用浏览器览|页的时候,当页面刷新很慢的时候,你的览器在q什么?你的屏幕内容是什么?是的Q你的浏览器在等待刷斎ͼ而你的屏q内Ҏ(gu)一片空白,而你在屏q前苦苦的等待浏览器的响应。开发h员ؓ(f)了克服这U尴的局面,不得不在每一个可能需要长旉{待响应的页面上增加一个DIVQ告诉用?#8220;pȝ正在处理(zhn)的hQ请E?#8230;…”?
现在Q有一U越来越行热?#8220;?#8221;技术,可以d改变q种H迫的局面。那是AJAX。如今,随着Gmail、Google-maps的应用和各种览器的支持QAJAX正逐渐吸引全世界的眼球?/p>
一、AJAX定义
AJAXQAsynchronous JavaScript and XMLQ其实是多种技术的l合Q包括Javascript、XHTML和CSS、DOM、XML和XSTL、XMLHttpRequest。其中:(x)
使用XHTML和CSS标准化呈玎ͼ使用DOM实现动态显C和交互Q用XML和XSTLq行数据交换与处理,使用XMLHttpRequest对象q行异步数据dQ用Javascriptl定和处理所有数据?/p>
在AJAX提出之前Q业界对于上q技术都只是单独的用,没有l合使用Q也是由于之前的技术需求所军_的。随着应用的广泛,AJAX也成为香饽饽了?/p>
二、现状与需要解决的问题
传统的Web应用采用同步交互q程Q这U情况下Q用户首先向HTTP服务器触发一个行为或h的呼求。反q来Q服务器执行某些dQ再向发求的用户q回一个HTML面。这是一U不q诏的用户体验,服务器在处理h的时候,用户多数旉处于{待的状态,屏幕内容也是一片空白。如下图Q?
自从采用文本作为Web传输和呈C后,我们都是采用q么一套传输方式。当负蝲比较?yu)的时候,qƈ不会(x)体现出有什么不妥。可是当负蝲比较大,响应旉要很长,1分钟?分钟……数分钟的时候,q种{待׃可忍受了。严重的Q超q响应时_(d)服务器干脆告诉你面不可用。另外,某些时候,我只是想改变面一部分的数据Q那Z么我必须重新加蝲整个面呢?Q当软g设计来讲Ih性化的时候,q么p糕的用户体验简直与q种原则背道而驰。ؓ(f)什么老是要让用户{待服务器取数据呢?臛_Q我们应该减用L(fng)待的旉。现在,除了E序设计、编码优化和服务器调优之外,q可以采用AJAX?/p>
三、ؓ(f)什么用AJAX
与传l的Web应用不同QAJAX采用异步交互q程。AJAX在用户与服务器之间引入一个中间媒介,从而消除了|络交互q程中的处理—等待—处理—等待缺炏V用L(fng)览器在执行d时即装蝲了AJAX引擎。AJAX引擎用JavaScript语言~写Q通常藏在一个隐藏的框架中。它负责~译用户界面?qing)与服务器之间的交互。AJAX引擎允许用户与应用Y件之间的交互q程异步q行Q独立于用户与网l服务器间的交流。现在,可以用Javascript调用AJAX引擎来代替生一个HTTP的用户动作,内存中的数据~辑、页面导航、数据校验这些不需要重新蝲入整个页面的需求可以交lAJAX来执行?/p>
四、谁在用AJAX
在应用AJAX开发上面,Google当仁不让是表率。Orkut、Gmail、Google Groups、Google Maps、Google Suggest都应用了q项技术。Amazon的A9.com搜烦引擎也采用了cM的技术?
微Y也在U极开发更为完善的AJAX应用Q它卛_推出代号为Atlas的AJAX工具。Atlas的功能超了AJAX本nQ包括整合Visual Studio的调试功能。另外,新的ASP.NET控g客户端控件与服务器端代码的捆l更为简ѝAtlas客户脚本框架QAtlas Clent Script FrameworkQ也使与|页?qing)相关项目的交互更?f)便利。但Visual Studio 2005中ƈ不包含此功能?/p>
微Y最q宣布Atlas客户脚本框架包含如下内容(详细资料误问Atlas计划|站Q:(x)
典型的,微YAJAX技术应用在MSN Space上面。很多h一直都对MS Space服务感到很奇怪,当提交回复评Z后,览器会(x)暂时停顿一下,然后在无h的情况下把我提交的评论显C出来。这个就是应用了AJAX的效果。试惻I如果d一个评论就要重新刷新整个页面,那可真费事?
目前QAJAX应用最普遍的领域是GIS-Map斚w。GIS的区域搜索强调快速响应,AJAX的特Ҏ(gu)好符合这U需求?/p>
五、用AJAX改进你的设计
AJAX虽然可以实现无刷新更新页面内容,但是也不是什么地斚w可以用,主要应用在交互较多、频J读数据、数据分c良好的Web应用中。现在,让我们D两个例子Q看看如何用AJAX改进你的设计?a>
例子1Q数据校?br />
在输入form表单内容的时候,我们通常需要确保数据的唯一性。因此,常常在页面上提供“唯一性校?#8221;按钮Q让用户点击Q打开一个校验小H口Q或者等form提交到服务器端,由服务器判断后在q回相应的校验信息。前者,window.open操作本来是比较耗费资源的,通常由window. showModalDialog代替Q即使这样也要弹Z个对话框Q后者,需要把整个面提交到服务器q由服务器判断校验,q个q程不仅旉长而且加重了服务器负担。而用AJAXQ这个校验请求可以由XMLHttpRequest对象发出Q整个过E不需要弹出新H口Q也不需要将整个面提交到服务器Q快速又不加重服务器负担?a>例子2Q按需取数据—联菜?br />
以前Qؓ(f)了避免每ơ对菜单的操作引L(fng)重蝲面Q不采用每次调用后台的方式,而是一ơ性将U联菜单的所有数据全部读取出来ƈ写入数组Q然后根据用L(fng)操作用JavaScript来控制它的子集项目的呈现Q这栯然解决了操作响应速度、不重蝲面以及(qing)避免向服务器频繁发送请求的问题Q但是如果用户不对菜单进行操作或只对菜单中的一部分q行操作的话Q那d的数据中的一部分׃(x)成ؓ(f)冗余数据而浪费用L(fng)资源Q特别是在菜单结构复杂、数据量大的情况下(比如菜单有很多、每一U菜又有上百个项目)Q这U弊端就更ؓ(f)H出?
现在应用AJAXQ在初始化页面时我们只读出它的第一U的所有数据ƈ昄Q在用户操作一U菜单其中一Ҏ(gu)Q会(x)通过Ajax向后台请求当前一U项目所属的二子菜单的所有数据,如果再l请求已l呈现的二菜单中的一Ҏ(gu)Q再向后面请求所操作二菜单对应的所有三U菜单的所有数据,以此cL……q样Q用什么就取什么、用多少取多少Q就不会(x)有数据的冗余和浪费,减少了数据下载总量Q而且更新面时不用重载全部内容,只更新需要更新的那部分即可,相对于后台处理ƈ重蝲的方式羃短了用户{待旉Q也把对资源的浪贚w到最低?/p>
例子3Q读取外部数?br /> AJAX可以调用外部数据Q因此,可以对一些开发的数据比如XML文档、RSS文q行二次加工Q实现数据整合或者开发应用程序?/p>
AJAX不是完美的技术。用AJAXQ它的一些缺陷不得不权衡一下:(x)
1.HTML TagQ?/p>
用来创徏能够和Struts框架以及(qing)其它相应的HTML标签交互的HTML输入表单;
如:(x)<htmlQform></htmlQform>Q?lt;htmlQtext/>Q?lt;htmlQpassword/>Q?lt;htmlQradio/>Q?lt;htmlQcheckbox/>Q?lt;htmlmultibox>
2.Bean Tag
该标{ֺ包含的标{֏以用来创建bean、访问bean和访问bean的属性?/p>
如:(x)<beanQwrite/>Q用于将bean的属性输送到jsp面Q?lt;beanQdefine/>定义一个新的bean
3.Logic Tag
该标{ֺ包含的标{֏以用来进行逻辑判断、集合P代和程控制?/p>
如:(x)<logicQiterate/>Q用来@环P?<logicQeaual/>Q用来进行逻辑判断
4.NestedQ增强对其他Struts标签的嵌套用能?/p>
该标{ֺ建立在前三个标签库的基础上,h前三个标{ֺ的所有功能,只是允许标签间的嵌套?/p>
5.Template Tag
随着Titles框架包的出现,此标记已开始减?/p>
下面介绍几个最常用的标{:(x)
<htmlQcheck box/>一般用于一个选项的复选框
<htmlQmultibox/>一般用于多个选项的复选框
<beanQwrite name="user" property="username"/>{同于EL表达C:(x)${user.username}
<beanQdefine id="inter" name="user" property="interest" type="java.lang.String"/>定义一个bean
<beanQmessage key=" " arg0=" "/> key 定义在资源文件中Qargs0[1,2]为参?/p>
<logicQiterate name="list" id="user"> {同于JSTL的:(x)<cQfoeach item=${list} var="user"/>
<logicQequal name="user" property="sex" value="0"/>{同于JSTL的:(x)<cQwhen test=""/>
<logicQempty />标签是用来判断是否ؓ(f)I的。如果ؓ(f)I,该标{体中嵌入的内容׃(x)被处?/p>
<logic:empty name="listForm" property = "persons">
<div>集合persons为空!</div>
</logic:empty>
1.下面l一个表单的完整代码Q?/p>
使用html标签作ؓ(f)表单输入Q可以方便的使用验证框架卻I(x)<html:errors property="username">
2.下面l一个显C数据的代码Q?/p>
作ؓ(f)昄数据QStruts标签q不比Jstl与EL方便Q因此,本h更习(fn)惯用后?/span>
其实Struts标签的好处,q不是上面这些,而是它可利用ActionForm来填充数?/span>
比如我们在做面数据修改的时候,?x)让当前面数据昄到显CZ攚w面,q样利于客户端修?/span>
以前我们q样做的Q根据id从数据库查出Q然后用html的value属性填充,现在有了Struts标签Q就不需要那么麻烦了
直接在Action里填充ActionForm的数据就搞定?/span>Q?/p>
public ActionForward upd(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;
int userid = Integer.parseInt(request.getParameter("userid"));
UserInfo user = biz.findUser(userid);
String[]interest = StringUtil.stringChange2(user.getInterest());
//用户信息填充到ActionForm
userForm.setUser(user);
userForm.setInterest(interest);
return mapping.findForward("upd");
}
<html:form action="/doupd">
用户名:(x)<html:text property="user.username"></html:text><p/>
密码Q?/span><html:text property="user.pwd"></html:text><p/>
性别Q?/span><html:radio property="user.sex" value="?/span>">?/span></html:radio>
<html:radio property="user.sex" value="?/span>">?/span></html:radio><p/>
城市Q?/span><html:select property="user.city">
<html:option value="">请选择</html:option>
<html:option value="武汉">武汉</html:option>
<html:option value="上v">上v</html:option>
<html:option value="北京">北京</html:option>
</html:select><p/>
爱好Q?/span><html:multibox property="interest" value="看书"/>看书
<html:multibox property="interest" value="游戏"/>游戏
<html:multibox property="interest" value="睡觉"/>睡觉<p/>
<html:submit value="修改"/>
</html:form>
]]>
1.ActionForm
2.ValidatorForm
3.ValidatorActionForm
4.DynaActionForm
5.DynaValidatorForm
6.DynaValidatorActionForm
7.LazyValidatorForm
由命名来看,M使用规律如下Q?/p>
1.带有Validator的,但都可用验证框?
2.以Dyna开头的Q都是自动生成相应的formQ只需在Struts-config.xml中配|属性即?/span>
3.中间是否有Action的,表示validation.xml中的form的name名,是跟formbean的名Uͼq是/path路径
下面按规律逐个介绍Q?/p>
1.ActionForm,DynaActionForm此类不支持验证框Ӟ需手动创徏formQƈ实现自定义的validate()Ҏ(gu)
但DynaActionForm是特?它自动生成form)Q所以没有validate()Ҏ(gu)Q所以也׃能验?br /> 2.ValidatorFormQValidatorActionFormQDynaValidatorForm
DynaValidatorActionFormQLazyValidatorForm 此大c都是支持验证框架的,当然也可以完成自定义的validate()Ҏ(gu),来覆盖验证框架的Ҏ(gu)Q其中:(x)
ValidatorFormQDynaValidatorFormQLazyValidatorForm 没有ActionQ是针对form来验证的Q即凡是用到该form的页面,都必验证;
反之QValidatorActionFormQDynaValidatorActionFormQ则是针对Action的,要验证哪个ActionQ就跟那?path路径Qvalidation.xml代码如下Q?/p>
针对七种ActionFormQ我们要灉|q用Q需要验证谁Q就让它停下Q不需要的Q让它通过?/p>
另外介绍下验证框架的使用步骤Q?/p>
1.在validator-rules.xml中引入验证插件的代码Q?/p>