Tapestry4 Blog :)2007-02-10 20:52:48

Tapestry4 Blog
hibernate3 spring2 tapestry4

 

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>

 参考资料
e1 ? e2 : e3

Conditional operator

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程序中,组件被设计用来一起工作,显示页面的过程大致上是把源注入到组件中,并做预处理,并最终把信息显示出来。