精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-09-30
public class ValidatePage extends BasePage{ public boolean IValidate(.....);{ //这里做验证 .................................. } ..................................................... } 然后我得其他page extends 这个 ValidatePage类就可以了。不知道有没有更好的方法? 比如使用 他的 全局 Engeen类做统一处理会不会更合适? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-10-07
lyo 写道 在 struts中由于框架使用了 ActionServlet,可以在里面做统一的权限验证,但是在 tapestry中,url请求的方式变了,它有没有集中控制页面跳转的类可以做权限验证呢? 我看到它在Page接口中有 IValidate方法可以覆盖,做验证,但是这需要每一个page都这样, 现在想得最好的方法就是 做一个 类继承自 BasePage,在我这个类里面覆盖 Validate方法做验证,然后其他所有的page类都继承自这个 验证类:
public class ValidatePage extends BasePage{ public boolean IValidate(.....);{ //这里做验证 .................................. } ..................................................... } 然后我得其他page extends 这个 ValidatePage类就可以了。不知道有没有更好的方法? 比如使用 他的 全局 Engeen类做统一处理会不会更合适? 恩,好象IValidate不是做这个用处的吧。 实现PageValidateListener的pageValidate就可以了 Tapestry会自己校验 可以这样 public abstract class ProtectedPage extends BasePage implements PageValidateListener { public abstract boolean hasPermission();; public void pageValidate(PageEvent event); { Visit visit = (Visit);getVisit();; if(visit == null || !visit.isUserLoggedIn();); { LoginPage login = (LoginPage); getRequestCycle();.getPage("Login");; login.setCallback(new PageCallback(this););; throw new PageRedirectException(login);; } if(!hasPermission();); { throw new PageRedirectException(NO_Permission_Page);; //或者直接记录下来,显示错误信息 // } } } |
|
返回顶楼 | |
发表时间:2005-10-07
多谢,那我以后的所有类都继承自这“ProtectedPage “ 类就可以了. IValidate不可以么 ;-( 我一直认为 Tapestry中的 IEngine类相当于 Struts中的ActionServlet,是整个框架的控制中心,不知道这样理解对不对,如果能在这里面做验证就很优雅了,也符合T4的设计原则,还不用继承这个ProtectedPage类了。这个地方 :
if(!hasPermission();); { throw new PageRedirectException(NO_Permission_Page);; //或者直接记录下来,显示错误信息 // } 如果不用抛异常的方式,用IValidate可以做到重定向页面的效果么? |
|
返回顶楼 | |
发表时间:2005-10-08
还有个问题请教一下,如果我不使用“<page-specification>”的形式,用了 “page-class-packages”模式,那麽Tapestry查找 Class对应的html模板文件的时候,是不是 *.java和 *.html的文件名一定要一致? 否则T4怎麽知道html模板对应的是哪个java类?
|
|
返回顶楼 | |
发表时间:2005-10-08
lyo 写道 还有个问题请教一下,如果我不使用“<page-specification>”的形式,用了 “page-class-packages”模式,那麽Tapestry查找 Class对应的html模板文件的时候,是不是 *.java和 *.html的文件名一定要一致? 否则T4怎麽知道html模板对应的是哪个java类? ![]() T4还没研究过,召唤gzdlw达人 |
|
返回顶楼 | |
发表时间:2005-10-08
可以看一下以前的帖子
http://forum.hibernate.org.cn/viewtopic.php?t=13718&highlight= 粘贴过来: Tapestry4新特性(六)-自动定位页面类文件 说明: 通俗点说就是您可以不定义.page文件或者定义的.page文件中不指定class 属性,而让服务器自动根据.html文件的路径来寻找对应的类文件。 配置: 在.application的定义文件中添加: <meta key="org.apache.tapestry.page-class-packages" value="org.edynasty.pages"/> 这样如果在文档根目录下有个Home.html文件,你就可以将Home.java放到 org.edynasty.pages(实际开发中配置为您自己的包名)包中,tapestry自动根据 Home.hmtl构造org.edynasty.pages.Home来定位页面的类文件,当然您也可以在WEB -INF目录下放一个Home.page,不需要定义class属性,tapestry自动按照上边的原 理定位。 效果: 这样您可以不需要维护.page中的class属性,直接根据.html文件来写对应 的类文件。而且可以根据业务逻辑来定义目录结构,例如将 org.edynasty.pages.user定义为user相关的类,.html也就可以放到user目录下 边,目录结构如下: user/ListUsers.html user/EditUser.html course/ListCourses.html course/EditCourses.html Home.html |
|
返回顶楼 | |
发表时间:2005-10-08
在T4里面,我所知道的服务器端效验有很多种方式,而且用途不同的话,效验方式也可以不同。一般情况下,使用得最多的情况是在表单提交时。
1)进行表单提交时最为简单的一种就是在Form或者Submit的监听方法里面进行效验;当然,这种方式虽然简单,但是不利于进行统一的效验。 2)由于Form进行效验时,一般都会使用delegate(在T3中是必须使用的,在T4中则可以不用)。那么,自定义一个类extends org.apache.tapestry.valid.ValidationDelegate,那么以后凡是在使用delegate的地方使用自定义的这个delegate类,就可以实现统一效验。这种方式在T3时代,比较常用。关于这种方式的详细用法,可以查看一下官方的Workbench示例 3)在T4中,大家可能会发现TextField组件多了一个参数validators。不光TextField组件,其他关于表单效验的组件比如TextArea等,都多了类似的参数。这个参数的作用,实际上是将delegate的功能细化,仅仅针对某个特定的组件。举例如下: <bean name="patronCodeValidator" class="com.tapestry4.test.PatronCodeValidator"> <set name="knownPatrons" value="ognl:knownPatrons"/> </bean> <component id="patronCode" type="TextField"> <binding name="value" value="patronCode"/> <binding name="validators" value="bean:patronCodeValidator"/> </component> public class PatronCodeValidator implements Validator { private KnownPatrons knownPatrons; public void validate(IFormComponent field, ValidationMessages message, Object object); throws ValidatorException { String patronId = (String);object; if(!knownPatrons.isKnown(patronId);); { throw new ValidatorException("当前Patron不存在,请重新输入!", null);; } } /** * 是否把null作为效验的值。如果返回true,则不输入任何值也会触发validate方法,只是第三个参数为Object的值null。 * 如果返回为false,则不触发validate方法。 */ public boolean getAcceptsNull(); { return false; } /** * tapestry并不会使用这个方法,该方法只是为了方便自己标识。 */ public boolean isRequired(); { return true; } /** * 这个方法可以用来放置JavaScript。 */ public void renderContribution(IMarkupWriter arg0, IRequestCycle arg1, FormComponentContributorContext arg2, IFormComponent arg3); { } public void setKnownPatrons(KnownPatrons knownPatrons); { this.knownPatrons = knownPatrons; } } 上面的knownPatrons仅仅是一个成员变量,也许<set name="knownPatrons" value="ognl:knownPatrons"/>的方式看起来很奇怪,它仅仅是用于给PatronCodeValidator类的成员变量赋于任意你向给定的值。这个PatronCodeValidator类必须实现Validator接口,该接口最重要的是方法: public void validate(IFormComponent field, ValidationMessages message, Object object); throws ValidatorException { } 一旦表单进行提交的时候,就可以在这个方法中进行效验。 4)第四种就是楼主提到的方式,如果进行的效验并非针对表单提交,比如一个业务系统里面,可能必须对用户点击的每一个页面进行用户效验,那么我就会使用楼主提到的这种方式。 对于T4,我目前在刚开始使用到第一个项目,而且该项目与业务系统关联非常密切。所以更多的功能我也正处于探索中。 对于T4中所谓“自动定位页面类文件”,其实很好理解,如果在application中定义了page-class。那么page就会自动去该类包寻找相同的java类,如果找不到,就自动使用BasePage类。。。。同样Html会自动寻找同名的page。。。。所以如果为了方便,可以将html,page和java设置为相同名称。。。。如果想设置不同的名称,可以沿用T3中在application中指定html与page的关联,在page的class属性里面指定page与java的关联。 |
|
返回顶楼 | |
发表时间:2005-10-10
gzdlw 写道 如果在application中定义了page-class。那么page就会自动去该类包寻找相同的java类,如果找不到,就自动使用BasePage类。。。。同样Html会自动寻找同名的page。。。。所以如果为了方便,可以将html,page和java设置为相同名称。。。。如果想设置不同的名称,可以沿用T3中在application中指定html与page的关联,在page的class属性里面指定page与java的关联。
这种情况的局限就是 *.page文件和*.html与 *.java的名称必须一致?因为我没有在 .page中指定 class属性,否则 t4是无法知道 page对应的java类吧? 而且如果不使用 t3的方式(在.application中指定 html和page的对应关系),那麽好像只有 *.page必须放到 WEB-INF 下 t4 才能找到,而且 html和page必须放到一起,否则page会报错说找不到 html模板文件的。 如果 page,html,java的文件名称可以不一致,而且 page文件可以不放到 WEB-INF 下就好了(应该能放到指定的目录下,比如 context/html/test.html, context/page/test.page ),不知道有没有其他好的方法解决? |
|
返回顶楼 | |
发表时间:2005-10-10
引用 这种情况的局限就是 *.page文件和*.html与 *.java的名称必须一致?因为我没有在 .page中指定 class属性,否则 t4是无法知道 page对应的java类吧?
是 引用 而且如果不使用 t3的方式(在.application中指定 html和page的对应关系),那麽好像只有 *.page必须放到 WEB-INF 下 t4 才能找到,而且 html和page必须放到一起,否则page会报错说找不到 html模板文件的。 如果 page,html,java的文件名称可以不一致,而且 page文件可以不放到 WEB-INF 下就好了(应该能放到指定的目录下,比如 context/html/test.html, context/page/test.page ),不知道有没有其他好的方法解决?
page默认的放置目录是web-inf下,如果想要把page放到任意目录,就必须在application里面指定html与page的关联。 而html可以放在context/下或者context/web-inf/下,如果有多个项目的情况,可以将同一个项目的所有HTML放在同一个子目录中,但是需要在web.xml中设置tapestry的启动路径: <servlet-mapping> <servlet-name>athena</servlet-name> <url-pattern>/xxxx/app</url-pattern> </servlet-mapping> 同一个项目的所有HTML页面必须放在同一个目录下,不能够再分包。 |
|
返回顶楼 | |
发表时间:2005-10-11
多谢回复,我还是用 “在application里面指定html与page的关联” 的方式吧,最灵活~
|
|
返回顶楼 | |