You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by ADong <gz...@hotmail.com> on 2005/08/25 04:46:11 UTC
I created a extra function for T3. Please help
Hi,
The extra function is a webflow, like Spring Webflow. T4 is different with
T3 significantly and less documents , I feel at a loss what to do. Please help
me redeploy it into Tapestry4. Thank you very much for any suggestion.
In our company, We have two teams. One team develop projects by stored
procedure + JSP, the other uses Hibernate + Spring + Tapestry. several weeks
ago, we decided to merge the technologies of two teams. So, I created a extra
function for T3, in order to implement the develop way of stored procedure +
tapestry.
tapestry webflow:
I implement some classes and interface. The whole theme is that Tapestry is
undertaking the function similar to Spring MVC, Tapestry is only to render the
datas which come from webflow. The webflow transmits the data from stored
procedure to Tapestry, and the name of the jumped page comes from stored
procedure.
The webflow have double-duty xml files:
One is bean-xml file. There is only one bean-xml file in a project.
<?xml version="1.0" encoding="gb2312"?>
<beans>
<spring location="web/WEB-INF/classes/applicationContext.xml"/>
<bean id="fruitShop" class="com.tapestry.webflow.FlowInitFruitShop">
<property name="location" value="web/WEB-INF/classes/webflow-
fruitShop.xml"/>
</bean>
<bean id="actionBuy" class="com.tapestry.webflow.TransitionBuyFruit"/>
<bean id="actionAccount"
class="com.tapestry.webflow.TransitionAccount"/>
<bean id="actionFruitBuy"
class="com.tapestry.webflow.FlowInitFruitShop"/>
</beans>
The other is flow-xml file.every flow has its own flow-xml file. I consult
Spring webflow to define it.
<?xml version="1.0" encoding="gb2312"?>
<webflow start-state="buyFruit">
<view-state id="buyFruit" page="FirstPage">
<action on="buy" actionId="buy"/>
<action on="account" actionId="account"/>
<action on="checkOut" actionId="checkOut"/>
</view-state>
<action-state id="buy" bean="actionBuy">
<transition on="success" viewId="accountView"/>
<transition on="false" viewId="flowEnd"/>
</action-state>
<action-state id="account" bean="actionAccount">
<transition on="countAll" viewId="accountView"/>
</action-state>
<view-state id="accountView" page="SecondPage">
<action on="fruitBuy" actionId="fruitBuy"/>
<action on="checkOut" actionId="checkOut"/>
</view-state>
<action-state id="fruitBuy" bean="actionFruitBuy">
<transition on="fruitBuy" viewId="buyFruit"/>
</action-state>
<action-state id="checkOut" bean="actionAccount">
<transition on="flowEnd" viewId="flowEnd"/>
</action-state>
<end-state id="flowEnd" page="ThirdPage"/>
</webflow>
Via webflow, MVC structure is more obvious in fact. A responsible one of
Tapestry is view-state state, and action-state bears the responsibility for
Control. The combination of tapestry and webflow is :
First, in tapestry engine:
public class MyEngine extends BaseEngine {
public WebflowManagement getFlowManager() {
return (WebflowManagement) ((MyGlobal) getGlobal()).getFlowManager();
}
public void setFlowManager(WebflowManagement flowManager) {
((MyGlobal) getGlobal()).setFlowManager(flowManager);
}
protected void setupForRequest(RequestContext context) {
super.setupForRequest(context);
WebflowManagement flowManager = getFlowManager();
if (flowManager == null) {
flowManager = new WebflowManagement("web/WEB-
INF/classes/webflow-bean.xml");
setFlowManager(flowManager);
}
}
public void renderResponse(IRequestCycle cycle, ResponseOutputStream output)
throws ServletException, IOException {
Object[] object = cycle.getServiceParameters();
if (!error && object!=null && object.length>2 && object[1]!=null &&
object[1] instanceof String) {
String flowId_actionOn = (String)object[1];
if(flowId_actionOn.indexOf("_flowId=")==0 ||
flowId_actionOn.indexOf("_actionOn=")==0) {
FlowViewState flowViewState = null;
if(object[0]!=null && object[0] instanceof
FlowViewState) {
flowViewState = (FlowViewState)object[0];
}
Map valueMap = null;
if(object[2] instanceof Map) {
valueMap = (Map)object[2];
}
String serviceName = cycle.getService().getName
();
//tapestry corresponds to webflow
this.getFlowManager().activateWebFlow
(flowViewState, flowId_actionOn, valueMap);
//this object descripts <view-state> in flow-xml
flowViewState = this.getFlowManager
().getFlowViewState();
object[0] = this.getFlowManager
().getFlowViewState();
object[1] = null;
//the data which comes from stored
//procedure via webflow
object[2] = this.getFlowManager
().getFlowValueMap();
cycle.setServiceParameters(object);
//<view-state>'s attribute:page
cycle.activate(flowViewState.getPageName());
}
}
this.error = false;
super.renderResponse(cycle, output);
}
private boolean error = false;
protected String getStaleLinkPageName() {
error = true;
return STALE_LINK_PAGE;
}
protected String getStaleSessionPageName() {
error = true;
return STALE_SESSION_PAGE;
}
protected String getExceptionPageName() {
error = true;
return EXCEPTION_PAGE;
}
}
Second:
1)active webflow in DirectService:
public void submit(IRequestCycle cycle) {
Object[] object = new Object[]{null, "_flowId=fruitShop", null};
cycle.setServiceParameters(object);
}
2)active webflow in ExternalService:
<a href="#" jwcid="@ExternalLink" page="SecondPage" parameters='ognl:new
java.lang.Object[]{flowViewState, "_actionOn=account", null}'>å¸ç›®</a>
3)get data from webflow:
public void pageBeginRender(PageEvent event) {
Visit visit = (Visit)this.getVisit();
if (!event.getRequestCycle().isRewinding()) {
Object[] object = event.getRequestCycle().getServiceParameters
();
flowViewState = (FlowViewState) object[0];
Map valueMap = (Map) object[2];
this.setFruitList((List) valueMap.get("fruitList"));
visit.setBuyFruitList((List) valueMap.get("fruitList"));
}else {
//considering Form submit will active pageBeginRender()
this.setFruitList(visit.getBuyFruitList());
}
}
download demonstration :http://www.cdmcs.com/Mytapestry.rar
or http://gzdlw.blogchina.com/inc/MyTapestry.rar.doc(please modify
MyTapestry.rar.doc to MyTapestry.rar after download)
Please tell me how to replant my webflow to T4? Thank you very much for any
suggestion about the transplant or webflow. If there is any confusion about my
depiction, I will tell more details.
ADong
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org