Tapestry OGNL 三目表达式2007-02-10 15:02:05
使用场景:
当打开的Page是本身链接时候class是current样式
demo
<a jwcid="@PageLink" page="PostEdit" scheme="http" class="ognl:(page.pageName == 'PostEdit')?'current':''">
Write Page
</a>
| getValue is called on e1 and the result is interpreted as a boolean. getValue is then called on either e2 or e3, depending on whether the result of e1 was true or false respectively, and the result is returned. | getValue is called on e1, and then setValue is called on either e2 or e3 |
Tapestry4Localization本地化/国际化2007-01-31 16:53:08
Tapestry4Localization本地化/国际化
1、方法1 -- 使用Tapestry
1)Home.html
<span jwcid="@Insert" value="message:required"/> //使用message前缀
或者使用ognl:messages
<span jwcid="@Insert" value="ognl:messages.format('required', '第{0}个元素','第{1}个元素')"/>
不要使用
<span jwcid="@Insert" value="ognl:getMessage('required')"/>
因为getMessage方法在T4中被@deprecated
-----the key 'title'---- will be first find in Home_zh.properties or Home.properties
if in Home.properties can not be founded
it will find WEB-INF/myapp.properties,
The specification may also have a message catalog; for instance,
for WEB-INF/myapp.application,
the files would be named WEB-INF/myapp.properties,
etc. Again, the name of the file is based on the servlet name ("myapp").
2)
myapp_zh.properties
required=u8bf7u8f93u5165{0}u7684u503c{1}
3)
Home_zh.properties
required=u8bf7u8f93u5165{0}u7684u503c{1}
2、方法2 --使用spring的MessageSource
1)利用spring加载messges_*local.properties
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!--<property name="basename" value="classpath:messages"/>-->
<property name="basenames">
<list>
<value>classpath:messages</value>
</list>
</property>
</bean>
把messageSource注入到Tapestry Components/Pages中
2)BasePage.java
import org.springframework.context.MessageSource;
//need inject //or direct impl it;
public abstract BasePage extends org.apache.tapestry.html.BasePage{
public abstract MessageSource getMessageSource();
}
3)HomePage.java extends BasePage.java
4)Home.page
<inject property="messageSource" object="spring:messageSource" />
5)Home.html
<span jwcid="@Insert" value="ognl:messageSource.getMessage('required',new java.lang.Object [] {'Login','!'}, 'Default', null)"/>
6)messges_zh.properties
required=u8bf7u8f93u5165{0}u7684u503c{1}
------------------------------------------------------------------
7)或者再封装以下
public abstract BasePage extends org.apache.tapestry.html.BasePage{
public abstract MessageSource getMessageSource();
public String getCustomMessage(java.lang.String arg0,java.lang.Object[] arg1,java.lang.String arg2,java.util.Locale arg3){
return this.getMessageSource().getMessage(arg0,arg1,arg2,arg3);
}
}
then in the Home.html
<span jwcid="@Insert" value="ognl:getCustomMessage('required',new java.lang.Object [] {'Login','!'}, 'Default', null)"/>
Separate Tapestry4 Action Controller from Page 2007-01-19 13:04:31
Separate Tapestry4 Action Controller from Page
方案1
1)HomePage.java
public class HomePage extends BasePage{
public void doAction(){
// do foo
}
}
2)Home.html
<form jwcid="@Form" success="listener:doAction">
<input jwcid="@Submit" lable="doAction"/>
</form>
方案2
1)HomePage.java
public class HomePage extends BasePage{
}
2)增加DoAction.java类
DoAction.java
import org.apache.tapestry.IActionListener;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.IRequestCycle;
public class DoAction implements IActionListener{
public void actionTriggered(IComponent component, IRequestCycle cycle) {
// do foo
}
}
3)Home.html
<form jwcid="@Form" success="bean:action">
<input jwcid="@Submit" lable="doAction"/>
</form>
4)Home.page
<bean name="action" class="DoAction"/>
方案3
1)页面
BasePage.java
public class HomePage extends BasePage{
public static IActionListener getAction();
}
2)增加DoAction.java类
DoAction.java
import org.apache.tapestry.IActionListener;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.IRequestCycle;
public class DoAction implements IActionListener{
public void actionTriggered(IComponent component, IRequestCycle cycle) {
// do foo
}
}
3)规范
Home.page
<inject property="action" object="spring:action"/>
4)Home.html
<form jwcid="@Form" success="ognl:action">
<input jwcid="@Submit" lable="doAction"/>
</form>
5)spring
beans.xml
<bean id="action" class="DoAction" />
方案4
2)
DoAction.groovy
import org.apache.tapestry.IActionListener
import org.apache.tapestry.IComponent
import org.apache.tapestry.IRequestCycle
class DoAction implements IActionListener{
void actionTriggered(IComponent component, IRequestCycle cycle) {
// do foo
}
}
//Action用groovy impl IActionListener并通过spring注入回给Page的abstract IActionListener getAction()
5)
beans.xml
<lang:groovy id="action" script-source="classpath:DoAction.groovy"/>
其余同方案3
Tapestry4 Page Event执行顺序2007-01-11 22:13:14
Page Events
PageAttachListener--->PageValidateListener--->activateExternalPage(if implements IExternalPage)--->PageBeginRenderListener--->PageEndRenderListener--->PageDetachListener
参考 http://tapestry.apache.org/tapestry4/UsersGuide/events.html
Tapestry4 Base ProtectedPage.java2006-09-19 14:59:11
LoginPage extends ProtectedPage extends BasePage
把登陆验证逻辑写在ProtectedPage中
package control;
import javax.servlet.http.HttpSessionEvent;
import org.apache.tapestry.PageRedirectException;
import org.apache.tapestry.callback.PageCallback;
import org.apache.tapestry.engine.state.ApplicationStateManager;
import org.apache.tapestry.event.PageEvent;
import org.apache.tapestry.event.PageValidateListener;
import org.apache.tapestry.web.WebRequest;
import org.apache.tapestry.web.WebSession;
import web.Session;
//Shamelessly taken from the VLib applicattion
public abstract class ProtectedPage extends BasePage implements
PageValidateListener {
public void pageValidate(PageEvent event) {
// TODO Auto-generated method stub
// 判断Session对象
/*
* Registry registry = RegistryBuilder.constructDefaultRegistry();
* registry.getConfiguration("tapestry.state.ApplicationObjects");
*
*
*
*
*
*
*
* Login login = (Login) getRequestCycle().getPage("Login");
*
* login.setCallback(new PageCallback(this));
*
* throw new PageRedirectException(login); }
*/
WebRequest request = event.getRequestCycle().getInfrastructure()
.getRequest();
event.getRequestCycle().getInfrastructure()
.getRequest().getRemoteUser();
ApplicationStateManager asm = event.getRequestCycle().getInfrastructure().getApplicationStateManager();
Session session = (Session)asm.get("registration-session-data");
session.getName();
WebSession webSession = request.getSession(true);
if (webSession.getAttribute("isLogin") != null
&& ((String) webSession.getAttribute("isLogin")).equals("Yes")) {
} else {
System.out.println("Session==null--->Login");
Login login = (Login) getRequestCycle().getPage("Login");
login.setCallback(new PageCallback(this));
throw new PageRedirectException(login);
}
}
Object getASO(HttpSessionEvent event, String asoName) {
//Registry registry = getHivemindRegistry(event);
return null;
}
}
tow tapestry4 Exception2006-08-10 16:51:11
javax.servlet.ServletException: Unable to initialize application servlet: Error: Module tapestry is duplicated! Definition in jar:file:/D:/eclipse-SDK-3.2-win32/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/webapps/FrameWork/WEB-INF/lib/tapestry-4.0.2.jar!/META-INF/hivemodule.xml has been ignored in favor of existing definition from context:/WEB-INF/hivemodule.xml.
org.apache.tapestry.ApplicationServlet.init(ApplicationServlet.java:206)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
java.lang.Thread.run(Thread.java:534)
org.apache.tapestry.util.xml.DocumentParseException: Unable to read context:/WEB-INF/Tapestry4.application: Document root element "application", must match DOCTYPE root "page-specification". [context:/WEB-INF/Tapestry4.application, line 7, column 85]
Tapestry Developer's Guide-Chapter 3. Tapestry Components-Parameters and Bindings2006-07-01 17:45:55
Tapestry Components 组件
参数和绑定
在web程序中,组件被设计用来一起工作,显示页面的过程大致上是把源注入到组件中,并做预处理,并最终把信息显示出来。





