??xml version="1.0" encoding="utf-8" standalone="yes"?> 实现拦截功能的类有:(x) 一、MainInteceptorQ主拦截器,所以DWR的远E调用都?x)被拦截Q当?dng)?调用是细到方法的,可配|的Q该cdC(jin)Spring AOP的MethodBeforeAdvice接口Q该cL一个集合成员变量,成员?sh)IInteceptor?/font> 二、IInteceptorQ是一个接口,仅有一个execute(AopContext context)函数。该接口是拦截器Q与前面的主拦截器不同,本接口定义的拦截器是可以q户去实现Qƈ且可以有多个Q。实现接口只需要实现方法。这?拦截器会(x)被主拦截器回调?比如要实C个n份验证的拦截QSecuityInteceptorQ在配置文g中把q个拦截器设|ؓ(f)L截器的属性即可获得回调?/font> 三、AopContextQAop上下文。在L截器调用IInteceptor的对象时Q把q个上下文对象作为参数来调用子拦截器。从该上下文可获得一pd信息Q如HttpSessionQHttpRequest{。甚至你可以自已讄属性?nbsp; 下面看一些代码片? private List<IInterceptor> interceptors;//定义一pd的子拦截?/font> public void setInterceptors(List<IInterceptor> interceptors) { 在before(Method method, Object[] params, Object target)Ҏ(gu)里:(x) WebContext ctx = WebContextFactory.get();//唯一被DWR污染的地?br /> HttpSession session = ctx.getSession(); IInterceptorQ?/font> public interface IInterceptor { AopContext׃必脓(chung)出来?jin)?随自已定义些什么属性,不过内|了(jin)一个MapQ用来保存数据Ş?jin)?/font> 下面来看看配|文Ӟ(x) <beans> <!--要暴露lDWR的Service--> <!--L截器Q给它设|子拦截?-> ?q样Q在配置DWR的配|文件时Q配|?lt;creator>时用Spring的Creator可以直接用上面的Service?jin)。当 DWRq程hӞ在配|范围内的方法的调用都会(x)被主拦截器拦截,q且遍历、执行所有子拦截器。原有的Service不需要改动,只需要多加一?Spring的配|文Ӟ原有的Service再加一层Aop的轻U?/font> q是一U实现方法。如果有别的Ҏ(gu)让DWR更安全、有效,请一定告知。:(x)Q? 做法是在服务里定义方法的时候,把以上的元素作ؓ(f)参数。在Ҏ(gu)体内直接使用卛_。而不必担?j)它的来源,来源是DWR?x)自已根据参数的cd注入。在客户端调 用的时候不需要提供这个参数。ServletContext之类的东西作为ThreadLocal的变量保存v来的。简单的CZ?/p>
1、服务代?nbsp; 2、spring配置文g <beans> 3、dwr.xml <dwr> ?上的代码?qing)配|文件可以达到目的:(x)DWR与Springl合QDWR直接使用Spring理的Bean作ؓ(f)服务Q当?dng)受Spring理的Bean?能一炚w不减Q复杂的如有着事务理的Bean同样有用?而且管是Spring理的BeanQ方法的参数中有Servlet相关的参敎ͼDWR同样自动注入?/font> 现在去调试页面看看我们暴露的接口?qing)效果如何!在调试页面找到store的服务,点击q去Q可以见到暴露的Ҏ(gu)有两个:(x) 一个是SetAttribute("","",AUTO)Q第三个参数表明自动注入Q客L(fng)只需要提供前两个参数卛_?/font> 一个是GetAttributeQ?ldquo;”QAUTOQ,W二个参数表明自动注入,客户只需要提供一个名字参数取值即可?/font>
]]>
我是一个偶然的Z(x)知道Jmesa,我在做一个数据展现系l的时候想LET的帮?但发现ET׃再更?作者把_֊转移C(jin)新的目?也就是这?
JMesa.q个目的目的是为开发者提供更有效的表格展现的API,而不是简单的TagLib.无论从灵zL?易扩展?易用?均比ET上了(jin)一个层
?最qRelease的版本里?q不包括TagLib.而在下一个版?2.1.0)会(x)加入TagLib,目前TagLibq可用,在SVN里已
?只是{待下一个版本的发布,光?x)有一些更?不过?x)兼容目前的TagLib?
假如我从API开始介lJMesa,恐怕ƈ不是个好的办?像我以前的文章里面有介绍,l果反响不大.q次军_从TagLib入手,来给大家介绍一下Jmesa.
大家可以从附仉拿到一个Demo.注意Demo依赖JMesa以及(qing)其他Lib.在Lib文g夹下有详l说?
现在来看看JMesa的?
估计比较Ҏ(gu)看得懂的代码?
Jmesa
的检{规范当中只有三个Tag:Table,Row,Column.而当前的TagLib实现中只实现?jin)Table和Column两个(Row是可?
?.另加一个Property的Tag.此阶D?Property的Tag是很有用?其v到的作用与Webwork的PropertyTag相差?
? 用来获得对象的某个属?之所以用Property
Tag是因为当前的TagLib有个限制是暂时不支持如JSTL?{}q种写法.来?x)支?届时Property
Tag也会(x)l箋(hu)获得兼容.Jeff比较們于用P代的方式实现Tag,那样可以支持${}q样的写?不过作ؓ(f)TagLib的开?问题?sh)?有时间再
重构一下TagLib,支持JSTL的写?
好了(jin),来说一说这些Tag的用方?
Table:
实际?真正Release的版本里面将?x)加上var以及(qing)Limit属?
Attribute
Description
id
表格的ID(必须)
items
对象或者Map的集?(必须)
caption
表格的标?
theme
表格的主?自定义样?br>
exportTypes
使用逗号分割导出的类?目前支持导出cd有CSV,Excel
width
表格宽度
style
卌格的Style属?br>
styleClass
使用的Css的Class名字
border
表格?br>
cellpadding
表格属?br>
cellspacing
表格属?br>
var属性值即在Column标签里可以获得的对象变量.
Limit属性是保存在当前请求的Limit的对象名.
Row:
该Tag是可选的.实际上Jmesa提供?jin)一pd默认的事件响?有必要的情况下才使用.
Attribute
Description
highlighter
是否高(sh)昄
onclick
点击事g
onmouseout
鼠标Ud事g
onmouseover
鼠标Ud事g
Column:
ColumnTag的用方法有下面几种:
Attribute
Description
property
Java对象或Map的属性名
title
列的名称
filterable
是否可按qo(h)条g查找
sortable
是否要排?br>
width
列宽
style
Style属?br>
styleClass
使用的Css的Class的名?br>
仅仅输出对象中Name属性?列名是Name
q样可以得到自定义的列名,可以让列可查?可排?当然你Server端需要相应提供排序及(qing)查找功能.不过q你不提供,客户端也?x)把当前l果排序和查扄.
q里l合?jin)PropertyTag.实现自定义列昄.可以灉|定制自己的单元格.
在ColumnTag里面,使用PropertyTag的时?可以指定Name属?如果不指定则使用当前Column的Property属性?
以后支?
怿l过上面的一番介l?大家对Jmesa有一定的感性认识了(jin)?q没?下蝲Demo,扔进Tomcat 的App里跑一下就明白?
有什么徏?请一定要告诉?:).
附g?http://www.javaeye.com/topics/download/4eaaa38d-e838-459d-aef2-3be6c4d043df
]]>
]]>
MainInteceptor:
this.interceptors = interceptors;
}
AopContext context = new AopContext(); context.setSession(session);
for(Iterator it = interceptors.iterator(); it.hasNext();){
IInterceptor interceptor = (IInterceptor) it.next();
interceptor.execute(context);
}
public void execute(AopContext context);
}
<bean id="bookManager" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>net.jf.ajax.business.BookManager</value>
</property>
<property name="target">
<ref local="bookManagerImpl"/>
</property>
<property name="interceptorNames">
<list>
<value>dwrAdvisor</value>
</list>
</property>
</bean>
<bean id="bookManagerImpl" class="net.jf.ajax.business.impl.BookManagerImpl"/>
<!--装配器?如果看不懂,先看看Spring的Aop?QP-->
<bean id="dwrAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="dwrInterceptor"/>
</property>
<property name="patterns">
<list>
<value>.*.*</value>
</list>
</property>
</bean>
<bean id="dwrInterceptor" class="net.jf.ajax.iterceptor.MainInterceptor">
<property name="interceptors">
<list>
<ref bean="test"/>
</list>
</property>
</bean>
<!--其中一个子拦截器的实现-->
<bean id="test" class="net.jf.ajax.iterceptor.TestInterceptor"/>
</beans>
]]>
package net.jf.ajax.session;
import javax.servlet.http.HttpSession;
public class Store {
public void setAttribute(String name,String value,HttpSession session){
session.setAttribute(name,value);
}
public String getAttribute(String name,HttpSession session){
return (String) session.getAttribute(name);
}
}
<bean id="store" class="net.jf.ajax.session.Store">
</bean>
</beans>
<allow>
<create creator="spring" javascript="store">
<param name="beanName" value="store"/>
</create>
</allow>
</dwr>
]]>private String file;
private Resource resource;
public void setResource(Resource resource) {
this.resource = resource;
try {
this.file = resource.getFile().getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
public void setFile(String file) {
this.file = file;
}
Spring配置文g如下Q?br /> <bean id="mybean" class="net.jf.mybean">
<property name="resource">
<value>/WEB-INF/config.xml</value>
</property>
</bean>
上面的例子是在WebApplicationAContext中的。Spring?x)根据Context的运行环境决定去哪里加蝲资源。如果是ApplicationE序。即使用cMClassPathXmlApplicationContextq样的ContextQSpring则会(x)使用ClassPathSource来代表资源。将?x)在E序q行时的ClassPath中寻找资源。但要注意一炏VSpring目前能找到的资源是在FileSystem中的。而不能找到Jar包里面的资源Q就你的资源的在ClassPath当中。这一点在JavaDoc里有说明。我又是在犯是同L(fng)错误后才惛_L找文。。。嘿。教训啊?br /> q些只是很粗的用法。记下来以备?。。如果有不正或不妥当的地方q望指正。:(x)Q?br />
]]>
客户端验证的例子可见Webwork自还的例?ldquo;showcase”。用客L(fng)验证大体上跟以前的服务器端验证相|只是多了(jin)一些步骤。完整的有以下几个步骤:(x)
一、编写XXXAction-alias-validation.xmlQ-验证配置文g?/font>文g攑֜需要验证的Actioncd一目录下,alias是可选项Q如果有几个Action使用?jin)同一个ActioncR而你惛_其中一个Actionq行验证Q那么alias是那个Action的名字。如QPersonAction.javaQ被editPerson,savePerson,deletePerson{Action使用刎ͼ而仅需要对savePersonq个动作来验证时Q配|文件名字就是:(x)PersonAction-savePerson-validation.xml。Webwork支持的客L(fng)验证cd有:(x)
二、配|Xwork.xmlQ保证拦截器栈里有Validation的拦截器
三、编写JspQVM或FTLQ?/font>q里有几个需要注意的地方?br /> 1.在Jsp加上一个Head标签Q?/font><ww:head/>的结果是生成两个Css样式的链接:(x)
<link rel="stylesheet" href="/bean/webwork/xhtml/styles.css" type="text/css"/>
<link rel="stylesheet" href="/bean/webwork/jscalendar/calendar-blue.css" type="text/css"/>
主要是获取显C错误是的样式?br /> 2、?lt;ww:form>Q很遗憾我们只能够用Webwork的UI标签Q这h能用到她的客户端验证机制。在q里要抱怨一下。?lt;ww:form>的标{是挺方便,但是在特定的场合Q我们必M用自已的样式和风格的布局。而W(xu)ebwork默认的XHTML主题的标{会(x)把布局搞ؕ。当?dng)我可以用Simple主题的。但是在需要客L(fng)验证的时候,Simple主题是行不通的。也是说要求主题必LXHTML以上。。或者自定义的主题(自已提供错误信息报告功能Q。呵。没办法Q先就着用XHTML吧?br /> ?lt;ww:form>的标{N使用namespace ?qing)Action属性。如果你的Action?foo/bar/new.action那么Q你必须q样写:(x)
<ww:form namespace="/foo/bar" action="new" validate="true"/>
validate="true"一句将?x)在客户端生成一句:(x)
<script src="/bean/webwork/xhtml/validation.js"></script>
如果你这样写Q?br /> <ww:form action="/foo/bar/new.action" validate="true"/>Q你得不到客户端验证。要注意Q这个细节不容忽视。我被这个小问题搞大头了(jin)。后来查文档的时候才知道Webwork已经提醒我们要像上一U写法那样写。因为她要知道哪个名字空间下的哪个Action需要被验证Q看吧。这是心(j)急的错。不看文档后果就自负?br /> 以上两种写法Q在面上生成Js的结果是不一L(fng)。第一U写法会(x)在页面上生成相应的验证规则。第二种写法生成的JsQ只是简单清楚报错信息然后提交请求到服务器,由服务器来验证?br />
只需要这三步QW(xu)ebwork2.2.2的客L(fng)验证功能q是用了(jin)。感觉还?sh)错。唯一U闷的还是Webwork强制我什么用她的模ѝ?br /> Ps:有很多示例代码没同脓(chung)出来Q是有原因D。现在编辑是使用FCKEditorQ另外两个Editor在我的机子上变成?jin)白痴。出错、完全不能编辑。。。手上又没有好的“XML?HTML”的好工具。。所以没把代码脓(chung)上来。。详情,可以看Webwork的Showcase。这东西太出彩了(jin)。:(x)P
]]>
二、该定义的contentType.
其中面的编码是军_性的因素。两者一致是Q浏览器?x)正常显C内容,否则有可能生ؕ码现像?/font>
如果一个Html文gQ文件编码ؓ(f)UTF-8。contentType设ؓ(f)相同。则使用IE或Firefox查看Q两者都?x)自动选择正确的编码Ş式来解释。当我将contentType设ؓ(f)GB2312Q以Z(x)造成qQ结果不?x)。我认ؓ(f)原因是这L(fng)Q文件编码v军_作用Q加上Utf-8包括?jin)GB该有的字W,所以这U情冉|以大的来认识的。没问题。(不知是否有理解错? QPQ?/font>
上述情况Z用浏览器直接把开|页文g的结果。当我用Webwork的ActionӞHtml文g作ؓ(f)l果Ӟl果cd为dispatcherQ,q出现?jin)!文g~码为UTF-8Q页面定义的ContentType为UTF-8。但是偏偏用IE?qing)FireFox均得Cؕ码的l果。郁闷中用Firefox查看?jin)页面的属性,惊奇地发现页面编码居然是GB2312。我猜想是Webwork在Dispatch面的时候用了(jin)默认的编码,把本来UTF-8~码的页面重新用GB2312~码一ơ。于是试着在Action里面获得Responseq把字符~码改ؓ(f)UTF-8。最后发现结果依然一栗这Ӟ我觉得在Action完成后,W(xu)ebwork接下来用了(jin)ResponseQ我的设|被重置?jin)。于是决定自已写一个ServletQ指定字W编码ؓ(f)UTF-8Q结果直接Forward到我的Html面。结果正了(jin)Q再查看面信息Q两者都是UTF-8?jin)?br />
qx(chng)使用Webwork来Dispatch的都是JspQ不曑և现过q样的情c(din)原因是Jsp仍需要编译,~译时会(x)dJsp面指定的ContentType来决定Response里的字符~码。HTML文g则不一栗这时只能用默认编码。如果我的工E是Gb2312Q那Ҏ(gu)׃存在刚才所讲的问题的?/font>