应用的数据一方面显示给用户看,另一方面需要保存到数据库中。而这两个用途数据的表现形式可能不同。
举例来说:
1,用户看到的性别是“男”,而数据库中存储的是“0”--这种类型的数据属于代码数据;
2,用户看到的数量是“1,214,235.30”,而数据库中存储的是“1214235.3”--这种类型的数据属于格式上的控制,可能与本地化有关。
对于以上关于数据显示和存储的差异Tapestry是如何设计与解决的呢?请接着往下看...
一、数据显示的格式化
1,输入域
用户可以输入数据的组件,如:TextField。
需要设置translator属性,如果是代码数据的转换则继承于AbstractTranslator,如果是数据格式的转换则继承于FormatTranslator。
如果是继承于AbstractTranslator,则需要实现formatObject方法和parseText方法.
其中formatObject方法是为了显示而进行的转换,它是将对象转换为字符串,因为客户端显示的都是字符串;
parseText方法是为了存储以及后台处理而进行的转换,它是将字符串转换为对象,因为后台处理的都是对象。
2,输出域
用户不可以输入
Tapestry的每个page需要将引用的图片或CSS写入配置中,比较麻烦,本文提供了一种统一管理各种资源的做法。
一、图片和CSS资源
1,在自定义的ApplicationServlet的init方法中初始化各图片资源:
| String path =
config.getServletContext().getResource('/').getPath();
path =
path.substring(path.indexOf('/') + 1);
path =
path.substring(path.indexOf('/'));
GlobalAssets.init(path); |
2,在GlobalAssets中:
eclipse的远程调试功能配置(2006-04-14 09:00)
用途:web应用部署并运行于外部(区别于eclipse环境中启动的)应用服务器中,当出现问题时,可以使用eclipse工程的源代码进行跟踪调试。
这样就不需要任何插件(MyEclipse等)就可以实现跟踪调试了!
1.修改catalina.bat(5.0以上版本需要修改catalina.50.bat)
goto setArgs
:doneSetArgs
rem 以下为增加的代码,端口为8000
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000;%CATALINA_OPTS%
2.在eclipse中 Run/Debug.../Remote Java
Application/New/,选择要进行调试的工程,Host为运行web应用的服务器地址,Port为端口(8000)
3.启动应用服务器Tomcat
4.Run/Debug.../Remote Java
Application/,选择刚才新建的配置,点击Debug按钮即可。
1.修改startWebLogic.cmd
set JAVA_OPTIONS=-Xdebug -Xnoagent -Djava.comp
Weblogic的JSP预编译问题(2006-04-13 12:14)
JSP在初次访问时一般都要进行编译,生成class文件或java文件,这个过程会比较慢,所有可能影响访问效率。本文提供了一个脚本,可将Web应用的所有jsp文件进行预编译,部署到weblogic上之后就不需要再次编译了,可以提高运行期JSP的访问性能。
具体操作步骤如下:
@echo off
rem 指定weblogic的类库文件
set CLASSPATH=.\weblogic.jar;.\webservices.jar
rem 指定需要JSP预编译的web应用根目录
set WEBROOT=D:\MyWeb\WebRoot
rem 设置所依赖的jar文件入类路径中
for /R %WEBROOT%\WEB-INF\lib %%j IN (*.jar) do call setclasspath
%%j
rem 递归编译应用下所有目录及子目录的JSP文件,编译后的文件在classes/jsp_servlet目录下
for /R %WEBROOT%\ %%f IN (*.jsp) do java weblogic.jspc
-webapp %WEBROOT% -compiler javac -forceGeneration -classpath
%CLASSPATH% -d %WEBROOT%\WEB-INF\classes -k -keepgenerated %%f |
Web应用数据校验的分类的讨论(2006-04-10 15:36)
本文对web应用的数据校验进行分类。
1,前端校验和后端校验
web应用程序前端为HTML页面,后端是各种动态程序(JSP/Servlet,ASP,PHP等)。数据校验可放置在前端(javascript),也可以放置到后端(服务器端程序)。
2,声明式校验和编程式校验
这是根据校验代码编写的方式进行划分的,提供一些通用的校验规则,然后组合这些基本的校验规则写入配置文件中,这种方法是生命式校验,而将校验以代码的形式写入程序中则为编程式校验。具体开发中,声明式校验可以满足大多数的校验需求,而对于复杂的校验还是需要编程进行实现的。
3,表单级校验和提交级校验
根据校验作用范围的不同可分为以上两类,前者是所有的提交按钮都使用表单级校验,而提交级校验仅仅应用于某个提交按钮。本人认为这种分类没
1,Body.java:
protected void renderComponent(IMarkupWriter writer,
IRequestCycle cycle) {
TapestryUtils.storePageRenderSupport(cycle, this);
this.addExternalScript(TapestryUtil.getResource(
'/com/web/tapestry/html/Body.js',cycle));
IMarkupWriter nested =
writer.getNestedWriter();
renderBody(nested,
cycle);
// Start the body tag.
writer.println();
writer.begin(ge |
浏览器的两个默认处理:
1,当表单存在多个提交按钮,用户按下回车键,浏览器默认是提交左上角那个按钮;
2,如果在javascript中document.forms[0].submit()则同样提交表单,但不传递任何提交按钮的信息。
用户可能会要求设置一个默认提交按钮,而不是浏览器默认的动作。如果用户在页面上按回车键,则相当于点击其中一个提交按钮。
本文提供了解决回车键提交问题(兼容Firefox和IE)的办法。
1,首先提供了javascript代码,Script类;
public static String
getDefaultSubmitScript(String submitName) {
StringBuffer buffer = new
StringBuffer();
buffer.append('addEventListener(');
buffer.append('\'document\',');
&
Required的修改遇到麻烦事,因为BaseValidator有一个方法isRequired,这样增加一个属性required的getter和
setter,page文件中设置required=searchId时,总是去匹配isRequired方法,这样出现字符串转换为布尔型错误。
为了对其它校验器不产生影响,我增加了一个校验器Required2,配置时required2=searchId。
同时,required类型的校验器本来不需要参数,所以现在参数值就是提交按钮的ID,因而可以使用BaseValidator的submitName属性。代码如下:
public class Required2 extends BaseValidator {
public String getRequired2() {
return
this.getSubmitName();
}
public void setRequired2(String required)
{
this.setSubmitName(required);
}
|
1,BaseValidator的修改非常简单,增加了一个submitName属性及其getter和setter。用于保存校验器适用的提交按钮的ID。
// whether skip this validator
public boolean isSkipValid(IFormComponent field)
{
IPage page =
field.getPage();
return (page instanceof
XtradeBasePage && this.getSubmitName() != null &&
!this
.getSubmitName()
.equals(((XtradeBasePage)
page).getSubmitName()));
}
// whether form range's validator
public boolean isFormValid() {
return this.getS |
上篇文章的做法,不需要修改tapestry框架,但是前端javascript的校验功能丢失了。可以满足只需要后端校验的需要。
本文对“配置一次,前后都用”的理想模式进行实现,经测试表明成功了!
1,需要修改以下几个类和文件:
Body.java
Form.java
AbstractSubmit.java
Submit.java
ImageSubmit.java
Submit.jwc
ImageSubmit.jwc
BaseValidator.java
MinLength.java
......
2,增加BasePage的子类:
SubBasePage.java,其中增加一属性submitName,保存提交组件的名字,用以各validator根据提交组件的名字决定是否需要进行校验。
3,page中对各个输入组件配置validators时也发生了变化:
如,minLength=12 --->>> minLength=OneSubmit_12
表示当点击名字为OneSubmit提交组件的时候,需要校验该输入
组件的值的长度至少为12。
4,其它Validator都需要作相应的修改。
目前只完成了MinLength和MaxLength的修改和测试。
结论:这样修改以后校验规则还是在page中进行配置。客户端javascript校验和后台校验两