简要介绍JSF的一些功能

[color=darkred]最近几天在学习JSF的知识,在学习的过程中有一些很有趣的问题,我遇到了,相信刚刚初学的朋友也会有像我似的要学一些东西,但是确不知如何下手,每前进一步都是一个门槛,所以我就查呀,呵呵呵,最后还是有点收获的,希望我查到的知识能帮助需要的朋友,如果哪里写的不对或不妥还请各位给与指点,谢谢[/color]

[color=olive]一:关于使用JSF标签需要注意的[/color]

1.我们要使用JSF标签必须在我们需要用的JSP的页面中导入标签:
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

2.<h:panelGrid columns="1">可以控制JSF的列,而columns可以控制JSF的列数,而此处的列数只对JSF可以显示图标的标签使用,例如:<h:inputText>或者<h:inputSecret>或者<h:inputTextarea>等等,但是对<h:outputLabel>这样的只为了显示数字,或者数据的标签确不算为列

3.<h:panelGroup>######<h:panelGroup> 凡事在标签之中的#####无论有<h:inputText>、<h:inputTextarea>等等此标签会使他们排列在一行,这个标签很妙的。

4.<h:outputLabel for="userName" value="用户姓名:"/>只是在JSP页面中单纯的显示用户姓名

5.<h:inputText></h:inputText>相当于JSP中的<input type="text"/>

6.JSF标签中<f:view><h:form>#####</h:form></f:view>两个也很有意思的,我们写的所有标签必须包含在他们之间,也就是####的位置,否则会出错的。

7.<h:inputSecret></h:inputSecret>相当于JSP中的<input type="password"/>

8.h:commandButton></h:commandButton>相当于JSP中的<input type="button"/>

二:当我们在普通的JSP页面想要迭代数据库表里所有的数据相信大家都已经熟练备至,但是在JSF中你有想过要用什么迭代吗,还是连接数据库?用<c:forEach>?,连接数据库是一定的,有的朋友说c:forEach也可以,但是要在JSF 1.2 之后可以和JSTL的foreach循环一起用,这个我倒是没有试过,但是我在网上找到了一个更好的更简便的方法,也要感谢那位网友啊,看来知识的学习真实永无止境啊
.
在JSF标签中有一个h:dataTable,就是用它,<h:dataTable border="1" id="users" value="#{UMDelegater.allUsers}" var="user"></h:dataTable>(h:dataTable和c标签的用法倒是基本上一致 var变量声明的意义一样,dataTable的value定义和items意义是一致的)的声明加上我们在BackingBean中要定义一个private DataModel allUsers = new ListDataModel(); 对象,并且要写上下面这个方法,就能完成我们要迭代所有信息的功能,其实下面的这个方法也很简单,参数list是我们要用sql语句查找出所有的我们要查出的数据库信息集合,allUsers.setWrappedData(list);就相当于先搭一个装集合信息的架子,list就相当于数据,他们组合起来就是一个实体,然后我们在下面body中的信息就可以直接的用了

public void setAllUsers(List<UserInfo> list) {
allUsers.setWrappedData(list);/*将集合中的数据填充进去备用(当在findUsers的时候我们会用到)*/
}


<body>
<div align="center">
<br/><br/><br/>
用户信息列表
<f:view>
<h:form>
<%--h:dataTable中的var="user" value="#{UMDelegater.allUsers}"相当于C标签中的var 和items--%>
<h:dataTable border="1" id="users" value="#{UMDelegater.allUsers}" var="user">
<%-- h:column相当于一个td--%>
<h:column>
<%--<f:facet><h:outputText value="用户姓名:"></facet>相当于在td的显示数据的上面加一个用户姓名
(f:outputText需要和f:facet配合使用,而h:outputLabel单独就可以)
而<h:outputLabel value="相当于在td的前面加上一个用户姓名"></h:outputLabel> --%>
<f:facet name="header">
<h:outputText value="用户姓名"></h:outputText>
</f:facet>
<h:outputText value="#{user.userName}"></h:outputText>
</h:column>

<h:column>
<f:facet name="header">
<h:outputText value="用户密码"></h:outputText>
</f:facet>
<h:outputText value="#{user.password}"></h:outputText>
</h:column>

<h:column>
<f:facet name="header">
<h:outputText value="用户性别"></h:outputText>
</f:facet>
<h:outputText value="#{user.sex}"></h:outputText>
</h:column>

<h:column>
<f:facet name="header">
<h:outputText value="编 辑"></h:outputText>
</f:facet>
<%--表现的形式和<a href="edit.jsp">编辑用户</a>类似,
jsp的a标签相对于简单,当我们点击编辑的时候就可以直接导航到edit.jsp的页面,
而JSF中的h:commandLink则是通过faces.config.xml中注册的UMDelegater调用该类中的updateUser的方法,
然后在通过返回值(在faces.config.xml也有相应的配置),根据faces.config.xml导航到相应的页面 --%>
<h:commandLink action="#{UMDelegater.updateUser}" value="编 辑">
<f:param name="userID" value="#{user.userID}"></f:param>
</h:commandLink>
</h:column>

<h:column>
<f:facet name="header">
<h:outputText value="删 除"></h:outputText>
</f:facet>
<h:commandLink action="#{UMDelegater.delUser}" value="删 除">
<f:param name="delUser" value="#{user.userID}"></f:param>
</h:commandLink>
</h:column>
</h:dataTable>
</h:form>
</f:view>
</div>
</body>


[color=olive]三:在JSF的学习过程中我们会接触到什么是BackingBean,什么是JSF配置文件,JSF的运行机制又是怎么样的.[/color]

其实JSF中的Backing和我们普通的JavaBean没有什么区别,都是用户需要的一些属性或者方法信息,其它的也没有什么新奇的,而JSF配置文件则是将我们定义的用户信息和页面信息的一个桥梁,有了JSF配置文件将使我们的程序组合的更好,这也是JSF本身设计的一个优点,这几天的书写颇有感触,感觉和Struts的配置文件原理差不多。

对于JSF的运行机制,我就简单的给大家说一下,当我们由一个页面发送一个请求到另一个页面回应请求的时候,我们要经历至少三关,首先就是我们要有关于用户信息的属性和方法的定义,也就是我们所有的BackingBean(普通的java类),接下来就是JSP页面需要完成的请求任务的书写,但最关键的在于faces.config.xml(JSF配置文件)的配置。

关于JSP请求页面的完成需注意:在请求的过程中JSF标签的一些属性的书写会将JSF和BackingBean做一个初期的绑定,举个两个小例子,属性的绑定:<h:inputText value="{user.userName}"></h:outputText>这里面相当于页面输入的值付给了user用户的getUserName方法,当我们想要在名为user的BackingBean中想要获取userName的信息,直接取就可以了,再举一个方法绑定的例子:<h:commandButton value="编 辑" action="#{user.updateUserOk}"></h:commandButton>相当于调用了user类的updateUserOk方法,然后根据返回值的定义决定到底是去那个页面(需要配置文件的配合决定去那个页面),之后的绑定是要在JSF的配置文件中配置才能将其真正的绑定在一起,在faces.config.xml中的配置包括很多,


[color=olive]四:JSF配置文件[/color]
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>

<!--配置java类(BackingBean -->
<managed-bean>
<!--相当于给Java类定义的名字,可以随便定义,但是上面标签中的value="#{user.userName}中的user必须以这个定义的名字一致 -->
<managed-bean-name>user</managed-bean-name>
<!--指定Java类的路径,名字和路径的定义可以是BackingBean和应用标签的类和BackingBean自动绑定,JSF会帮我们将值进行传递,我们要用直接取就可以了 -->
<managed-bean-class>com.jsf.bean.UserInfo</managed-bean-class>
<!--设置该类的范围 -->
<managed-bean-scope>request</managed-bean-scope>
<!-- 将userID设置到request范围中,但是#{requestScope.userID}中的userID在BackingBean必须有其属性与之一致,否则会出现NotFoundPropertyException-->
<managed-property>
<property-name>userID</property-name>
<value>#{requestScope.userID}</value>
</managed-property>
</managed-bean>


<!--<navigation-rule></navigation-rule> 导航规则 :<from-view-id>/registUser.jsp</from-view-id>来自哪一个一面(在我们想要导航到目标页面的时候我们要知道该导航的页面来自哪个页面,

也就是目标页面的上一页),<navigation-case></navigation-case>是导航实例,<from-outcome>addUserSuccess</from-outcome>中的addUserSuccess是指我们BackingBean中肯定有一个方法的返回值

是"addUserSuccess"类型的,当我们页面请求这个方法的时候,我们就知道,请求完方法之后要根据配置文件的addUserSuccess这个配置导航到/findUser.jsp的页面,也就是
<to-view-id>/findUser.jsp</to-view-id>标签中间的页面
-->

<!--当我们在多个页面之间进行导航的时候,配置文件中要记录每两个页面间的导航规则,否则就会出错的,例如:当我想要从aa.jsp到bb.jsp再到cc.jsp最后到dd.jsp 时,我的配置文件要这样写
(<from-outcome>aabb</from-outcome>是我BackingBean中的一个方法的返回值,<from-outcome>aabb</from-outcome>中的aabb是我假设的)
[quote]
<navigation-rule>
<from-view-id>/aa.jsp</from-view-id>
<navigation-case>
<from-outcome>aabb</from-outcome>
<to-view-id>/bb.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<navigation-rule>
<from-view-id>/bb.jsp</from-view-id>
<navigation-case>
<from-outcome>bbcc</from-outcome>
<to-view-id>/cc.jsp</to-view-id>
</navigation-case>
</navigation-rule>


<navigation-rule>
<from-view-id>/cc.jsp</from-view-id>
<navigation-case>
<from-outcome>ccdd</from-outcome>
<to-view-id>/dd.jsp</to-view-id>
</navigation-case>
</navigation-rule>
-->
<navigation-rule>
<from-view-id>/registUser.jsp</from-view-id>
<navigation-case>
<from-outcome>addUserSuccess</from-outcome>
<to-view-id>/findUser.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<navigation-rule>
<from-view-id>/findUser.jsp</from-view-id>
<navigation-case>
<from-outcome>delUserOk</from-outcome>
<to-view-id>/deleteUserOk.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<navigation-rule>
<from-view-id>/findUser.jsp</from-view-id>
<navigation-case>
<from-outcome>updateUser</from-outcome>
<to-view-id>/updateUser.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<navigation-rule>
<from-view-id>/updateUser.jsp</from-view-id>
<navigation-case>
<from-outcome>updateUserOk</from-outcome>
<to-view-id>/updateUserOk.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>[/quote]


[color=olive]五:1.bean的带参数方法?[/color]
backingbean的方法一般都不带参数,除了调用Listener的方法。
传递参数可以使用:
<h:commandLink action="" value="传递参数">
<f:param name="参数名" value="参数值"/>
</h:commandLink>
之后在backingbean里面通过FacesContext方法取得参数:
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("参数名")

[color=olive]2.对于使用a.jsp?param1形式传递参数的页面,在backingBean中采用读取requestParameter参数的方式获得。[/color]

FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
String value = request .getParameter(parameterName);
不知道你们看懂没有,如有不懂可以发贴子给我。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值