当前位置: 代码迷 >> JavaScript >> jsf的总结下
  详细解决方案

jsf的总结下

热度:341   发布时间:2012-11-06 14:07:00.0
jsf的总结上

最近一直在看JSF的网站学习,写了点心得,内容是乱七八糟。

?

JSF的过程:别人说是恢复视图,我也不知道恢复试图是什么意思.但是我的感觉就是,我想恢复视图的意思就是,将他的JSF动作通过html解析器解析成html的动作,例如如果用户这个时候只是点击了一个链接等简单的事情的话(也就是说我们没有必要进行验证,更新模型值等的操作),就直接跳出(execute complite),整个生命周期完 成,跳到render的周期。
第二个阶段是获得请求值,如果这个阶段发生了不可预知的错误,应该就响应完成了。

就算你的请求值是为空的话,也没有什么关系的,依旧去执行下一个阶段。

第三个部分才是调用validation的阶段
验证成功的话,就更新模型值阶段了,更新模型值没有什么错误的话,就调用你的action的方法了。

?

1.

rendered 这是一个逻辑判断表达式的属性,通过这个表达式结果是true,或者false来验证拥有该render的这个组件是不是要呈现到这个View中.

2.
JSF中我们进行导航的标准是faces-config.xml中进行配置,比如说,我们可以使用from-outcome 来进行调控
然后我们在写一个action中返回在faces-config.xml中form-outcome的值
但是在JSF2中,我们可以直接用action=“xxx"来进行导航。
JSF中我们可以采用h:selectBooleanCheckbox 的true或者false确定属性的显示
我们应该是用的是property-'is'来和后台的bean进行交互,这个无关规则,只是我们Java property 书写的规范罢了。

3.
Facelts里的ui:repeat 和h:datatable中的区别在于ui:repeat仍然是一种迭代的关系,而datatable确是一种表现结构了。

4.
标签<f:param/>这个就是用来进行传递参数的
5.
默认的我们使用的是action来进行导航,默认的是action是用来进行forward的命令的,但是我们可以使用
return ****?faces-redirect=true来将视图的请求由forward变成rediect命令.
6.
依赖注入的关系,managerbean是支持依赖注入的虽然没有spring有用但是,还是非常有用的,举个例子,通常注入的最好是一个ApplicationScoped的范围
@ManagedBean(eager=true)//这个是声明,这个managerBean是可以提供给managedbean注入的
public class Bean1{

....
}
@ManagedBean
public class Bean2{

@ManagedProperty(value="#{bean1}")
private Bean1 bean1;
.....
}
7.
JSF页面默认的predefinde variables
facesContext
param
header Request Headers
cookie
request,session
initParam
requestScope,SessionScope,ApplicationScope
8.
JSF2在Tomcat6(及以下版本)是不会支持EL中的方法带参数的表达式? 比如说#{bean.method(args)}这个会报错的。
但是在Java ee 6的环境(或者是tomcat7)是可以运行成功的.
9
faces-config.xml中 我们可以在Application中加入Resource-bundle属性来将我们classpath路径下的properties文件.
比如说我们约定在Resources这个目录下存放properties文件,那么我们就可以在写成
<base-Name>Resources.propertiesFileName
10.
我们可以使用properties中的{0} 与页面中的<f:param>结合来使用还有一个<h:outputFormat>结合来使用。
11.
当我们使用国际化的时候,我们应该注意的是使用
<f:view locale="#{facesContext.externalContext.requestLocale}">进行声明,值得注意的是,

view设置local的时候,只是在reload page的时候有用。但是不会在后台执行action后从新render页面的时候有用

但是我们在后台使用UIViewRoot对象设置local的时候,是相反的,只能在从新展现render页面的时候有用,但在reload页面的时候,是没有用的。解决的办法就是,如果我们真的想人为的操控local,前台后台,都写上代码。
12.
actionListener与action的区别
action 通常是将所在的form表单进行了提交,而并不是将所有的关于后台的数据都进行提交。
actionListener 一般自动将表单的值进行提交。
action = action controller
actionListener = action listener
actionListener 用来处理当前页面的变化,一般不会用于对页面跳转的控制,既然是listener就必须会监听什么东西,那么监听的就是一个事件ActionEvent,是一个单一的组件
action用来处理函数之后对页面进行控制比如说forward或者是redirect

actionListener会有一个ActionEvent参数,这个对象bunding 了它绑定的UIComponenet
我们再后台可以直接访问这个UIComponenet的attr的当前的属性
例如
event.getComponent().getValueExpression("attr").getValue(FacesContext.getCurrentInstance.getELContext());
我们还是可以查看这个属性上的表达式写法,比如说value="#{person.name}"
event.getComponent().getValueExpression("value").getExpressionString();
13.
valueChangeListener这个属性是用来产生一个valuechangeevent
我们可以使用getNewValue()来获得这个新的属性
这个属性基本上运用于flag true这样的组件中
14.
valueChangerListener ActionListener的区别
ActionListener发生的时候,会自动的提交form组件
valueChangerListener orrcur 的时候,是提交form组件的。
valueChangerListener的时候,我们通常需要写一个 onclick="submit()"配合一下,这个是主要用于处理浏览器的不兼容问题。
15.
JSF与AJAX相信这个是最让人兴奋的例子了
action 通常与ajax标签进行使用,由于是ajax,那么我们的action 肯定是不能返回一个值了。
<ajax render="@form"/>将这个表单进行全部更新
当我们在一个表单使用了<f:ajax/>的标签的时候,它是将(action默认将form里的数据提交的功能)废弃,只是执行action的方法,并不对bean进行赋值,这一定需要注意。
16.
ajax+JSF+js的运用,再好的jsf界面都必须有js的铺垫,
<f:ajax/>的属性是render,execute,event,onevent的其中event是表示我们使用的ajax的属性,而onevent表示的是event发生之后,我们采用的js函数名称
其中onevent的函数有一个data的参数,data有三个status
begin;complete;success;
例如
function jsfunction(data){
??? if(data.status == "begin"){
??? ????? dosomething......
??? }else if(data.status == "success"){
????????????? dosomething....
??? }
}
17.
<h:outputText/>是不和后台进行交互的
正常的情况下,<h:outputText/>里面有一个escape的属性,这个属性是决定<h:outputText/>是不是要转义,如果需要转义就会变成<span></span>,如果不需要转义的话就会成为一个文本
18.
<form pretendID=""/>表示的是我们是不是要在<form/>里面的子元素中增加一个form的id
19.
关于validation的用法
用在后台action 阶段:这种可操作的范围就比较大。
<h:messages/>用来输出有关的信息格式不正确
将自己的信息加入到validation中使用FacesContext.getCurrentInstance().addMessage(“”,"message");
<h:inputText/> 有一个required的属性 requiredMessage的属性
缺点是:只能是不能为空,但是就是判断是不是为空,功能比较鸡肋。
好像还是和后台打交道。只不过在validation的阶段
convertMessage
validatir=#{bean.validatorMethod}
20.
validation的四个过程
?? required???? type???? validators?????? bapassing validator
最后一个我们可以用immediate="true"来跳过这个检查。
21.immediate是什么意思,他并不是跳过validation的意思,是快速的意思
immediate如果在该组件设定了true的话就会对该组件进行优先执行,将标记为immediate为true的组件都执行一遍之后,如果没有addMessage(出错)的话,就会马上执行别的组件的validation过程,否则响应完成(就是说发生了错误),回到响应的页面。
22
我们还可以自定义validatormethod不过需要在view的页面制定一个validator的指令,然后在后面的方法中加入参数,最后如果没有完成我们的validation,我们增加一个FacesMessage,并且throw new ValidationException(message);
23.
在xhtml中自定义复合标签-----这个我认为是最让人兴奋的特点,至少不用自己敲写Java代码了
我们需要在/的虚拟主机的根路径下创建一个resources文件,然后创建一个文件夹的名字
如果你在别的页面引用这个复合组件的时候
比如说
xmlns:aaa="http://java.sun.com/jsf/composite/utils
我们就必须创建一个叫utils的文件夹
然后在这个文件夹下面创建一个xhtml的文件,假如你的组件叫做<aaa:bbbb/>
那么你的文件名叫做bbbb.xhtml
然后我们需要引用在bbbb.xhtml中设置我们组件的属性了
比如说我们的组件是有两个属性<aaa:bbbb ccc="" dddd=""/>
那么我们这么写
。。。。。html head body
<composite:interface>
????? <composite:attribute name="ccc"/>
????? <composite:attribute name="dddd"/>
</composite:interface>
<composite:implementation>
??? 你的结构。。。
??? 注意的是你可以使用#{cc.attrs.ccc}对attribute的引用
</composite:implementation>

还有一些可用的参数是
cc.parent --- 这个经常用于复合(nested)组件
cc.children
cc.childId
24.
通常我们使用一个select的值去ajax一个datatable对象,我们需要的是传入一个名字,根据这个名字Map.get(name);

25.
Facelets模板技术,就是说我们可以吧不同的页面的表现形式先定义下来,这个就是一种模板的方式。先把表现形式确定下来,然后再将数据的表现层用组件表示出来。
不同的是模板,而相同的却是组件的结构,而组件的结构的表现形式css却还是由模板里的css提供这就真正实现了,组件就是封装数据的容器,而容器的表现形式却是有css控制的,这个也是实现了表现层,容器层的分离。很好很强大。

我们首先定义模板,然后用
首先我们的页面是一个<ui:composition/>将模板加进来之后,只是在页面写出来我们<ui:define/>的容器.那么我们的容器,也有可能是一个复杂的<ui:composition/>
那么我们可以使用<ui:include/>将别的<ui:composition/>加进来。
这个过程就是,
我们首先写出来页面的模板,
然后再定制各种各样的容器
在访问的页面显示我们定制的容器,或者是官方第三方提供的容器。
通常,第二步是可以省略的,因为我们可以直接用第三方封装好的,或者直接在第三步中写出来。
<ui:define>...</ui:define>加进我们的组件

26.
还有就是我们在模板中引入js的时候,我们要注意的就是默认的是我们要建立一个resources的文件夹,然后我们在文件夹下面建立css/scripts/xx
也就是说,标准的jsf里面是有根目录下面有显示的文件,然后又一个resources文件存放各种各样的资源。但是properties文件除外,默认情况下,properties就是一个Java的文件,应该属于源代码的。
27.
JSF接收来自的页面的params参数
<f:view-Param/>
举个例子
<f:metadata>
? <f:viewParam name="fg" value="#{colorPreferences.foreground}"/>
? <f:viewParam name="bg" value="#{colorPreferences.background}"/>
</f:metadata>这个是接收的JSF的页面
发送的页面可以这么些
<h:link outcome="URL?xxx=xxx&amp;xxxx=xxxx...."/>
或者使用<h:button outcome=""/>
如果这个值fg不为空的话,就将这个参数代表的值,给colorPreferences.foreground这个参数值。这种特性满足我们可以使用GET的方法代替默认的POST的方法
<h:link/>和<h:commandLink/>的区别就是,都表示<a/>但是<h:commandLink/>点击的时候,会触发一个提交<h:form/>的命令。
<h:button/>和<h:commandButton/>的区别在于<input type="button/submit"/>的区别
你还使用<f:viewParam><f:convert.../></f:viewParam>

JSF2允许你使用NON-JSF的页面向JSF传递参数
比如说
<form action="xx.jsf">
??? <input text name="fg"/>
??? <input button name=""/>
</form>

xx.jsf的页面可以是
<f:metadata>
??? <f:viewParam .../>
</f:metadata>
总结一下就是,我们可以通过JSF---》JSF(只能是link,button),NO-JSF---JSF,
但是可不可以进行back-ground---javacode---->JSF,或者说是JSF(Text)----GET--->JSF呢
我们可以采用在action的方法中
return url?faces-redirect=true&amp;includeViewParams=true的方法进行确定

?

?

  相关解决方案