在使用jsf的时候,它的事件驱动模式是一个很好的开发方法,但是由于jsf毕竟现在的版本才1.2,所以对于有些细节上面处理就不一定如人意了,一般来说,当jsf的页面验证有错或者有其它的错误的时候,我们以前输入的值会在渲染页面的时候,恢复回来,也就是说,一个域我们绑定在后台的属性是一个int值,但是我们前台输入了“abcd”,这个时候,后台在验证阶段就过不去了。然后直接渲染页面,jsf 会把我们输入错误的abcd渲染出来。而不是把我们以前绑定在后台的那个属性的值,取出来,这样也正是我们想要的结果,但是当我们的页面包括了datatable的时候,并且datatable里面的值是可以编辑的时候,当页面上有错误的时候,别的域都会显示刚才我们输入的值,唯有datatable里面的输入域的值没有还原为我们刚才输入的值,而是绑定在后台的值,这显然不是我们想要看到的。但是当datatable有错误的输入的时候,datatable才会把它的值恢复回来。说了这么说,感觉有点语无伦次了,还是拿代码说话吧。
<%@page contenttype="text/html"%>
<%@page pageencoding="utf-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
doctype html public "-//w3c//dtd html 4.01 transitional//en"
"http://www.w3.org/tr/html4/loose.dtd">
<%--
this file is an entry point for javaserver faces application.
--%>
<f:view>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>jsp pagetitle>
<style>
.header{
background-color:white;
}
#mainform\:data input{
border:0;
color:red;
}
style>
head>
<body>
<h:form id="mainform">
<h:messages style="color:red" />
名字:<h:inputtext id="listname" value="#{test1.listname}" >
<f:validatelength maximum="5"/>
h:inputtext>
<h:commandbutton value="submit" action="#{test1.save}"/>
测试用的:<h:inputtext id="testname" value="#{test1.testname}"/>
<h:datatable headerclass="header" rowclasses="header" bgcolor="blue" cellspacing="1" cellpadding="0"
border="0" value="#{test1.listdatamodel}" id="data" var="p">
<h:column>
<f:facet name="header">
<h:outputtext value="name"/>
f:facet>
<h:outputtext style="background-color:white;width:100%" id="name" value="#{p.name}"/>
h:column>
<h:column>
<f:facet name="header">
<h:outputtext value="sex"/>
f:facet>
<h:inputtext id="sex" value="#{p.sex}"/>
h:column>
<h:column>
<f:facet name="header">
<h:outputtext value="age"/>
f:facet>
<h:inputtext id="age" value="#{p.age}"/>
h:column>
<h:column>
<f:facet name="header">
<h:outputtext value="email"/>
f:facet>
<h:inputtext id="email" value="#{p.email}"/>
h:column>
h:datatable>
h:form>
body>
html>
f:view>
通过以上的代码我们就可以发现问题了。在查看了jsf的源代码才发现,datatable有一个特殊的处理机制,那就是只有它自己包含在另外一个datatable的时候,或者它自己内部的值有错的时候,才会渲染submittedvalue,否则,它只会渲染绑定在后台的值。知道这一点以后,就非常好解决了,那就是在我们的datatable有外层再包括一个datatable,当然,它外层的datatable最好不要有具体的值,所有我们就包含一个空的datatable来实现它了,这样解决有点不太好看,但是也是没有办法的办法了。呵呵,希望jsf2.0中对此会有一些改进。
改后的代码如下:
<%@page contenttype="text/html"%>
<%@page pageencoding="utf-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
doctype html public "-//w3c//dtd html 4.01 transitional//en"
"http://www.w3.org/tr/html4/loose.dtd">
<%--
this file is an entry point for javaserver faces application.
--%>
<f:view>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>jsp pagetitle>
<style>
.header{
background-color:white;
}
#mainform\:data input{
border:0;
color:red;
}
style>
head>
<body>
<h:form id="mainform">
<h:messages style="color:red" />
名字:<h:inputtext id="listname" value="#{test1.listname}" >
<f:validatelength maximum="5"/>
h:inputtext>
<h:commandbutton value="submit" action="#{test1.save}"/>
测试用的:<h:inputtext id="testname" value="#{test1.testname}"/>
<h:datatable value="1">
<h:column>
<h:datatable headerclass="header" rowclasses="header" bgcolor="blue" cellspacing="1"
cellpadding="0" border="0" value="#{test1.listdatamodel}" id="data" var="p">
<h:column>
<f:facet name="header">
<h:outputtext value="name"/>
f:facet>
<h:outputtext style="background-color:white;width:100%" id="name" value="#
{p.name}"/>
h:column>
<h:column>
<f:facet name="header">
<h:outputtext value="sex"/>
f:facet>
<h:inputtext id="sex" value="#{p.sex}"/>
h:column>
<h:column>
<f:facet name="header">
<h:outputtext value="age"/>
f:facet>
<h:inputtext id="age" value="#{p.age}"/>
h:column>
<h:column>
<f:facet name="header">
<h:outputtext value="email"/>
f:facet>
<h:inputtext id="email" value="#{p.email}"/>
h:column>
h:datatable>
h:column>
h:datatable>
h:form>
body>
html>
f:view>
如果大家还有什么更好的方法,也希望能分享一下,这里只帖出来了jsp的代码,java代码就没帖了,因为都是一些getter,setter方法。
尽管千里冰封
依然拥有晴空
你我共同品味java的浓香.
posted on 2009-02-28 11:17
千里冰封 阅读(5760)
评论(2) 编辑 收藏 所属分类:
javaee