![]() |
|
Spaces home 蚯蚓PhotosProfileFriendsMore ![]() | ![]() |
蚯蚓理想,现实,自由,人性,思想,分享,和谐,美丽
|
|||||
|
March 26 终于实现了Tapestry4 EntityForm和QueryTable的组件化取代以前的BaseEditPage 和 BaseListingPage 两个基础抽象类,所有的Page统一继承自 BasePage(自定义的继承自org.apache.tapestry.html.BasePage)
实现BasePage的单一化
QueryTable的实现思路
传入Query和Parameters 取代掉source参数,用Query和Parameters构建一个model提供给TableView
看下demo 类
EmployeeList.java
package app.demo.web.pages;
import java.util.HashMap;
import java.util.Map; import org.apache.commons.lang.StringUtils;
import org.apache.tapestry.IRequestCycle; import org.apache.tapestry.event.PageBeginRenderListener; import org.apache.tapestry.event.PageEvent; import common.tapestry.components.table.QueryTable;
import common.tapestry.html.BasePage; public abstract class EmployeeList extends BasePage implements
PageBeginRenderListener { public abstract String getName(); public void pageBeginRender(PageEvent event) {
} QueryTable getTable_1() {
return (QueryTable) getComponent("table1"); } public void doSubmit() {
Map map = new HashMap(); map.put("A", "1"); String hql = "select a from Employee a where 1=:A"; if(StringUtils.isNotBlank(getName())){ hql = hql +" and a.Name like :name"; map.put("name", "%" + getName() +"%"); } getTable_1().setQueryAndParameters(hql, map); } public void activateExternalPage(Object[] obj,IRequestCycle cycle){
super.activateExternalPage(obj, cycle); getTable_1().setQueryAction(false); } } html模板 <t3 jwcid="table1@ext:QueryTable" title="ognl:components.border.title" columns="a_Name:名字:Name,a_Age:年龄:Age,a_Remark:备注:Remark,a_Birthday:生日:Birthday,!Operate:操作:operate" class="data_window" cellSpacing="1" cellPadding="3" border="0" pageSize="10"> <t3 jwcid="OperateColumnValue@Block"> <a jwcid="@ExternalLink" page="EmployeeEdit" parameters="ognl:{components.table1.row.Id}" > 查 看</a> <a jwcid="delete@ext:EntityDeleteLink" entity="ognl:components.table1.row">删除</a> </t3> </t3> March 24 Extension Tapestry4`s restart service to clear my login cookies接上篇,自定义一个logout service 把我的login cookies 清楚掉 Tapestry .java package common.tapestry; public final class Tapestry { LogoutService.java import java.io.IOException; import org.apache.tapestry.IRequestCycle; import common.tapestry.Tapestry; public class LogoutService extends RestartService {
public void service(IRequestCycle cycle) throws IOException { public String getName() { hivemodule.xml <!-- extends tapestry RestartService and clear the login cookies info--> <contribution configuration-id="tapestry.services.ApplicationServices"> </module> in your Pages How to use cookies in tapestry4? my Tapestry4.1.5`LoginCookiesManagerImplHow to use cookies in tapestry4? my Tapestry4.1.5`LoginCookiesManagerImpl 思路 实现代码如下 package common.tapestry.engine; public interface LoginCookiesManager { public static final String COOKIES_KEY_LOGIN_USERNAME = "USERNAME"; LoginCookiesManagerImpl 实现 package common.tapestry.engine; import org.apache.hivemind.ApplicationRuntimeException; public class LoginCookiesManagerImpl implements LoginCookiesManager { public void setApplicationPropertySource( private String decrypt(String value) { private String encrypt(String value) { private String getCookiesEncryptionKey() { private boolean isCookiesEncryption() { public void removeCookies() { public void writeCookies(String username, String password, int maxAge) { public String getUsername() { public String getPassword() { private void writeCookiesValue_Login__Username(String username, int maxAge) { private void writeCookiesValue_Login__Password(String password, int maxAge) { private String generateApplicationCookiesKey_Login__Username() { private String generateApplicationCookiesKey_Login__Password() { private String generateApplicationCookiesKey(String key) { public void setCookieSource(CookieSource cookieSource) { public void setRequest(WebRequest request) { public void setAbsoluteURLBuilder(AbsoluteURLBuilder absoluteURLBuilder) { } hivemodule.xml配置 <?xml version="1.0"?> <contribution configuration-id="tapestry.Infrastructure"> 使用 在BasePage中获得该service public LoginCookiesManager getLoginCookiesManager() { if (!(asmVisit instanceof IVisit)) {
import org.apache.tapestry.IRequestCycle; public interface IConstructVisit {
Tapestry4.1.5`s common Base Border ComponentTapestry4.1.5`s common Base Border Component 考虑到每个项目都必须具有Border组件,所以把这个组件提到Base项目的ext组件库 来看我们的Border.jwc规范 <?xml version="1.0" encoding="UTF-8"?> <component-specification allow-body="yes" allow-informal-parameters="no" class="common.tapestry.components.Border"> <component id="shell" type="Shell"> <inject property="httpServletRequest" object="service:tapestry.globals.HttpServletRequest"/> <!-- html模板 <html jwcid="shell">
package common.tapestry.components; import java.io.IOException; import javax.servlet.ServletContext; import org.apache.tapestry.BaseComponent; public abstract class Border extends BaseComponent { public abstract HttpServletRequest getHttpServletRequest(); public abstract WebContext getWebContext(); public static final String APPLICATION_META_KEY_DEFAULT_BORDER_STYLE = "common.tapestry.components.border.stylesheets"; public String getStylesheetResource() { public abstract IAsset[] getCssAsset(); public abstract void setCssAsset(IAsset[] oo); public IAsset[] getStylesheets() { if (getCssAsset() == null) { String _stylesheetResource = (getStylesheetResource() != null) ? getStylesheetResource() String[] _stylesheetResources = _stylesheetResource.split(","); for (int i = 0; i < _stylesheetResources.length; i++) { try { for (int j = 0; j < resources.length; j++) { WebContextResource _resourceLocation = new WebContextResource( } catch (IOException e) { IAsset[] tmp = (IAsset[])list.toArray(new IAsset[list.size()]); March 21 Tapestry4.1.5 how to inject spring`s bean to pagesTapestry4.1.5 how to inject spring`s bean to pages 1、in web.xml config spring <context-param> <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener> 2、put the tapestry-spring-1.0.0.jar to your classpath
but how to get the spring`s beans in the java code ? 3、config your ${yourApp}/WEB-INF/hivemodule.xml <contribution configuration-id="tapestry.Infrastructure"> put the springObjectProvider to the tapestry.Infrastructure ok in your code you can org.apache.hivemind.service.ObjectProvider springprovider springprovider = (ObjectProvider) infrastructure.getProperty("springprovider"); YourSpringBean yourSpringBean = (YourSpringBean)springprovider.provideObject(null, null, yourSpringBeanId, null);
皮鞋又坏了皮鞋又坏了,该买新的了 May 14 Tapestry5的无侵入式框架实现use Annotations?Tapestry5称使用JDK5的Annotations实现无侵入式的框架,我看起来Annotations依然是侵入到了类,:(
敏捷的思维正在一步步渗透到Java Framework中,现在不仅要求类与类之间要解藕,类和Framework之间也要解耦,
途径:1)硬编码,extends/implements
2)xml
3)Framework的实践约定,比如说 public void **doActionListener(),方法名称的匹配说明了这是个Action监听器,够敏捷吧
我期待的Tapestry Control BackingBean是更纯的Java类,看来这个实现除了xml + implments,只剩下Framework的约定才能实现了,毕竟不用xml,不用Annotations,不用extends/implements 你得告诉Framework container 这个BackingBean 是怎么跟template粘起来的!
May 06 革命“在我们力图改善文明这个整体的种种努力中,我们还必须始终在这个给定的整体中进行工作,旨在点滴建设,而不是全盘的建构,并在发展的每一个阶段中都运用既有的历史材料,一步一步地改进细节,而不是力图重新建设这个整体。” ——著名政治思想家弗里德里希·冯·哈耶克 April 28 DAO exception/business exception 粒度Interface UserInfo{
public void login(String userName,String password) throw Exception/RuntimeException/or CustomException/or CustomRuntimeException
}
UserNotFonundException extends Exception ?
PassWordWorngException ?
Whe in Action/listener
use try{
}catch(){
throw new ApplicationRuntimeException(e.getMessage());
}
困惑中~
DAO / Service层的划分由于Hibernate等ORM映射tools的出现,DAO并不在直接跟数据库RDB打交道,而是多了 应用服务器持久层,从广义上讲RDB也算是持久,
应用服务器对象持久层 是为了能管理ORM映射的对象的状态和周期而存在的
DAO ---> Persisent ---->RDB
|
|||||
|
|