最近几天在学习JSF的知识,在学习的过程中有一些很有趣的问题,我遇到了,相信刚刚初学的朋友也会有像我似的要学一些东西,但是确不知如何下手,每前进一步都是一个门槛,所以我就查呀,呵呵呵,最后还是有点收获的,希望我查到的知识能帮助需要的朋友,如果哪里写的不对或不妥还请各位给与指点,谢谢
一:关于使用JSF标签需要注意的
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>
三:在JSF的学习过程中我们会接触到什么是BackingBean,什么是JSF配置文件,JSF的运行机制又是怎么样的.
其实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中的配置包括很多,
四:JSF配置文件
<?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是我假设的)
引用
<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>
五:1.bean的带参数方法?
backingbean的方法一般都不带参数,除了调用Listener的方法。
传递参数可以使用:
<h:commandLink action="" value="传递参数">
<f:param name="参数名" value="参数值"/>
</h:commandLink>
之后在backingbean里面通过FacesContext方法取得参数:
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("参数名")
2.对于使用a.jsp?param1形式传递参数的页面,在backingBean中采用读取requestParameter参数的方式获得。
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
String value = request .getParameter(parameterName);
不知道你们看懂没有,如有不懂可以发贴子给我。
分享到:
相关推荐
JSF(JavaServer Faces)是Java平台上用于构建Web应用程序的一种技术框架,它提供了一种声明式的方法来创建用户界面,并且处理与后端数据...这个简单的例子为初学者提供了一个理解JSF处理用户交互和业务逻辑的基础。
早期版本的JSF在与JSP集成时存在一些问题,例如在处理特定标签时可能会导致意外的结果。然而,随着版本的发展,这些问题得到了有效的解决。例如,JSF 1.2版本中已经彻底解决了这些早期的集成问题,确保了组件之间的...
Seam 是一个为 JSF 提供增强功能的框架,它能够无缝地与 JSF 集成,并且不仅仅局限于 EJB3 和 JBoss 平台。通过添加 Seam 的 Phase Listener,可以显著增强 JSF 生命周期中的异常处理能力。即使不使用 Seam 的其他...
- **运行与测试**:将项目打包成WAR文件,部署到服务器,然后通过浏览器访问JSF页面,测试应用功能。 **6. JSFLangsin 示例** "JSFLangsin"可能是示例项目或文件的名称,具体细节可能包括一个或多个语言学习相关的...
在JavaServer Faces (JSF)框架中,实现全选功能通常是通过使用BooleanCheckbox组件来完成的。这篇博客文章“JSF中使用BooleanCheckbox实现全选功能”可能详细讲解了如何利用这种组件在用户界面中创建一个可以勾选的...
### JSF介绍与技术概述 #### 一、JSF概览 JSF(JavaServer Faces)是一种基于Java的标准Web应用程序框架,它为开发者提供了一种简单的方式来构建动态且交互式的Web应用。本节将深入探讨JSF的核心概念、特点以及与...
同时,JSF社区提供了丰富的资源和插件,如PrimeFaces和RichFaces,这些都可以作为扩展JSF功能和提升用户体验的工具。总之,JSF是一个强大的Web开发框架,掌握了它,就能更好地应对企业级Web应用的挑战。
在这个简单的JSF例子中,我们将探讨JSF2的核心概念和一些关键组件。首先,让我们了解JSF的工作原理。JSF采用Model-View-Controller (MVC) 设计模式,将业务逻辑、视图呈现和用户交互分离。在JSF2中,这个模式得到了...
**JSF(JavaServer Faces)** 是一种Java技术,用于构建Web应用程序,特别是那些具有...这个简单的例子为初学者提供了了解JSF如何处理用户输入和业务逻辑的起点,并为进一步学习和构建更复杂的JSF应用程序奠定了基础。
虽然可以手动实现分页,但使用成熟的JSF组件库(如PrimeFaces、RichFaces等)可以使工作变得更加简单。以PrimeFaces为例,`p:dataTable`组件自带了分页功能,只需配置`rows`属性(每页记录数)和`paginator`属性...
开发者可以将这些库导入到项目中,以便利用JSF的功能。 **使用JSF进行开发**: 1. **环境配置**:首先需要在项目中引入JSF的库,如Mojarra或MyFaces,通常通过添加对应的`.jar` 文件或使用Maven/Gradle依赖来完成。...
**JSF(JavaServer Faces)** 是一种Java技术,用于构建Web应用程序的用户界面。它是一种组件化的MVC(Model-View-...随着对JSF的深入学习,你会发现它是一个功能强大且成熟的框架,适用于开发大型企业级Web应用。
这个压缩包“简单jsf程序 供新手学习”显然是为了帮助初学者入门JSF,通过实践来理解其基本概念和工作原理。 **JSF的核心组成部分**: 1. **组件库**:JSF包含一个丰富的UI组件库,如按钮、表单、输入字段等,这些...
2. **自定义组件框架**:允许开发者创建自己的组件,扩展JSF的功能。 3. **官方标准**:JSF作为官方标准,得到了各大厂商的支持,例如IBM和Oracle,促进了工具和库的发展。 4. **事件驱动**:JSF的组件通过事件...
"jsf最简单例子" 强调了这是一个简化版的示例,适合初级学习者,没有过多复杂的功能和配置。 **文件名称列表:** "jsf1" 可能是指这个压缩包包含了一个名为"jsf1"的文件或目录,这可能是整个JSF应用的主目录,其中...
**JSF框架详解** JavaServer Faces(JSF)是Java平台上的一个标准的、用于构建Web应用程序的MVC(Model-View-Controller...通过熟练掌握JSF和DataGrid的使用,开发者能够更高效地构建出功能丰富、易于维护的Web应用。
在"jsf 最简单的eclipse工程例子"中,我们将探讨如何在Eclipse中创建和运行一个基础的JSF项目。这个例子可能包含了以下几个关键步骤: 1. **创建JSF工程**:首先,你需要在Eclipse中新建一个Dynamic Web Project。...
在与数据库交互时,JSF可以与Java Persistence API (JPA) 或Hibernate等ORM框架结合使用,使得持久化操作变得更加简单。JSF还与JavaServer Pages (JSP)、Servlet和JavaBeans (Javabeans) 兼容,允许开发者利用这些...