我目前正在为我的公司研究Tapestry,并试图决定我是否认为我们可以将已有的专有Web应用程序移植到更好的位置.目前我们正在运行Tomcat并使用JSP作为我们自己的框架支持的前端,最终使用JDBC连接到Oracle数据库.
我已经完成了Tapestry教程,这个教程非常简洁,让我感兴趣,但现在我面临着一个常见的文档问题.在我准备完全承诺之前,我需要确保有很多事情可以确保我可以用Tapestry完成.有没有人有任何好的资源,无论是书籍或网络文章还是其他任何东西,除了Tapestry教程解释之外还有更详细的内容?
我也在考虑与Hibernate集成,并且已经阅读了一些关于Spring的内容.我仍然很难理解Spring如何比Tapestry更加繁琐,因为它们似乎有很多重叠的功能.我读过的一个例子似乎是使用Spring来连接Hibernate,然后使用Tapestry连接到Spring,但我认为Tapestry与Hibernate的集成程度相同.我所说的资源是
http://wiki.apache.org/tapestry/Tapstry5First_project_with_Tapestry5,_Spring_and_Hibernate.我感兴趣的是因为我之前没有在其他任何地方找到有关如何通过Tapestry应用程序维护用户级别和会话的信息,但是在示例中不需要使用Spring.
我正在尝试关注Tapestry的教程.(http://tapestry.apache.org/tapestry5.1/tutorial1/env.html)本教程推荐使用Jetty 5.1,因此我可以使用一个名为JettyLauncher的插件从Eclipse内部运行Jetty应用程序.但是现在,我认为Jetty的版本是7.我不想从过时的Web服务器开始.Jetty 7是否有任何类似于我想象的Jet Eclipse 5.1 + Jetty Launcher应该做的eclipse插件?
谢谢
编辑:我正在尝试Run Jetty Run和m2eclipse.我们将看到它是如何工作的
我有一个页面显示一些客户端的详细信息.我t:loop用来显示一些数据.在t:loop我只是路过source和value.到目前为止,我的页面工作得很好.但是当我尝试提交页面时,它会突然给我一个例外.
"找不到类型java.lang.String到类型[addressUsageValue]的强制可用强制:.........."
下面是示例代码
<t:loop source="addressUsageInfo" value="addressUsageValue">
<tr>
<td>${addressUsageValue?.usage}</td>
<td>${addressUsageValue?.address}</td>
<td>${addressUsageValue?.postCode}</td>
<td>${addressUsageValue?.city}</td>
<td>${addressUsageValue?.country}</td>
</tr>
</t:loop>
Run Code Online (Sandbox Code Playgroud)
我做了一些调查,找到下面的参考.
http://tapestry.apache.org/5.3.3/apidocs/org/apache/tapestry5/corelib/components/Loop.html https://issues.apache.org/jira/browse/TAP5-609
所以我为Loop创建了编码器.下面是示例代码.在下面的toClient()方法中,我随机返回任何值,在toValue()方法中我返回null.
private final ValueEncoder<DtoAddressUsageInfo> addressUssageEncoder =
new ValueEncoder<DtoAddressUsageInfo>() {
public String toClient(DtoAddressUsageInfo value) {
return String.valueOf(value.getUsage());
}
public DtoAddressUsageInfo toValue(String clientValue) {
return null;
}
};
Run Code Online (Sandbox Code Playgroud)
现在我的代码工作正常,我可以提交表单.
我怀疑来了
首先 - 我无法理解为什么在使用循环时需要编码器?如果需要提交表单,那么为什么它不是必需参数?
第二 - 我刚刚实现了没有任何逻辑的编码器.我无法理解在哪里使用toValue()和toClient()方法,目的是什么?
第三 - 当我提交页面为什么表格需要编码器?
哪个Java Web框架最能支持"Web UI设计器"角色?也就是说,哪个框架可以让你:
和许多其他人一样,我发现这些功能在我使用大量JSP片段和包含的大型遗留Struts 1.x应用程序中非常缺乏.
我决定将我的应用程序移植到JSR-168/268门户环境,但尚未确定哪些Java Web框架将为portlet提供支持.我对任何形式开放(基于行动,基于组件等),关键标准是它如何支持上述角色.
我对Tapestry很感兴趣,Tapestry声称它的视图是符合XHTML标准的页面(它只是添加了额外的Tapestry特定属性,以便在运行时进行处理).这听起来像是一个Web UI设计工具包.但是,我想知道这是否是现实世界中实际发生的事情,或者是否需要妥协.
当然,如果有比Tapestry更好的东西,我很乐意听到它!
怎么做?
<t:output format="literal:dd.MM.yyyy" value="myItem.activity.do_create_date"/>
Run Code Online (Sandbox Code Playgroud)
我想知道如何格式化日期输出?
我正在开发一个基于Tapestry 5的Web应用程序,它应该向iPhone和Android设备公开API.目前,API是使用tapestry的内置MVC功能实现的.例如,所有服务都是处理程序方法,它们在专用于移动访问的Tapestry页面类中返回JSON字符串.使用Spring Security进行身份验证,并且每个用户都绑定到会话.我对这些东西比较新,所以如果我错了,请纠正我,但这似乎不是一个非常干净的解决方案.
这个解决方案有哪些可能的缺点?使用REST-API时有什么显着优势?在这种情况下最佳做法是什么?
我想指定一个挂毯网格的默认排序列.
我知道我可以在服务器端对我的getter中的记录进行排序,但这似乎是不必要的努力,因为网格完全能够对它自己进行排序.
所以我的网格定义如下:
<t:grid source="queues" inPlace="true"> </t:grid>
Run Code Online (Sandbox Code Playgroud)
getQueues返回对象集合,如:
public class Queue {
public String getName();
public float getOccupancy();
}
Run Code Online (Sandbox Code Playgroud)
我希望默认情况下按照"占用"属性以后代顺序对网格进行排序.
从我看到的Tapestry文档中,Grid具有属性sortModel,它似乎是正确的选项.但是我找不到很好的解释,将它设置为正确的值.
我需要在一个 Tapestry 表列中获取 2 个 java 字段。我的每个字段都可以为空。我可以在单行中编写 if 条件(一个 IF 运算符中的两个字段),还是必须为第二个字段编写内部条件?
现在我有这个:
<t:if test="${subject.subjectQuantity}">
<t:if test="${subject.unitMeasure}">
<tr>
<td>Subject count:</td>
<td>${subject.subjectQuantity} ${subject.unitMeasure}</td>
</tr>
</t:if>
</t:if>
Run Code Online (Sandbox Code Playgroud) 我正在使用带有弹簧启动的tapestry 5,使用这个很棒的小库:https://github.com/code8/tapestry-boot
然而,尽管我使用了OpenSesionInViewFilter,但我得到了臭名昭着的LazyInitializationException.除了OpenSesionInViewFilter的优点和缺点之外,我还想在OpenSesionInViewFilter中使用它,因为我正在移植一个大型遗留应用程序.
我的春季启动配置是
@SpringBootApplication
public class Launcher {
public static void main(String[] args) {
new SpringApplicationBuilder(Launcher.class)
.web(true)
.run(args);
}
@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
return new HibernateJpaSessionFactoryBean();
}
@Bean
public FilterRegistrationBean registerOpenSessionInViewFilterBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
OpenSessionInViewFilter filter = new OpenSessionInViewFilter();
registrationBean.setFilter(filter);
registrationBean.setOrder(5);
return registrationBean;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经确保在TapestryFilter之前加载了OpenSessionInViewFilter,并在启动时通过spring的输出验证了这一点.我在TapestryFilter上编辑了tapestry-boot库到setOrder(10).
我还通过调试验证了OpenSessionInViewFilter实际上正在创建一个会话.
在下面的LIE的示例堆栈跟踪中,您可以看到正在使用OpenSessionInViewFilter.
我有2级服务层:
Tapestry Pages --> XXManagerImpl (e.g, UserManager) --> JpaRepository
Run Code Online (Sandbox Code Playgroud)
我的经理服务注释如下:
@Service
@Transactional(propagation = Propagation.REQUIRED)
public class UserManagerImpl implements UserManager, Serializable
Run Code Online (Sandbox Code Playgroud)
我的JpaRepositories没有注释@Transactional和@Repository(如果它很重要).
初始数据访问按预期工作,但是当我尝试访问Lazy初始化字段时,我得到了LIE.
根异常:
Caused …Run Code Online (Sandbox Code Playgroud) tapestry ×10
java ×3
ajax ×1
api ×1
eclipse ×1
grid ×1
hibernate ×1
if-statement ×1
jetty ×1
mobile ×1
resources ×1
sorting ×1
spring-boot ×1
spring-data ×1