所有谈到的JSF定制标记库都是不错的,但是,如果我有自己的定制标记,或有第三方的标记库应该怎么办?或者我要使用JSP标准标记库 (JSTL)?它是一组能做我们刚提到的所有事情的标记库。 在极大程度上,这些标记能与JSF标记混合使用。 Faces标记能在其它标记的内部嵌套使用,反之亦然。 一些产品,象IBM的 WebSphere Application Developer, 鼓励这种方法。其它的如 Sun的 Java Creator Studio则选择纯的JSF标记, 另一方面,Oracle的 JDeveloper 让你混合和配合使用,但也鼓励使用纯JSF标记。
注意: 无论何时,你将JSF 标记嵌套在非JSF定制标记内时,你必须分派一个组件标识符到JSF 标记。 因为JSTL 是标准的并且许多人熟悉它,我们将用它示范如何将它与 JSF定制标记一起使用。 (如果你想全面了解JSTL, 请看 Shawn Bayern写的一本极好的书, JSTL in Action.) 让我们从简单的例子开始 (显示在清单1) JSTL 标记和 JSF 标记混合和配合使用。代码引入了两个 JSF 标记库和核心 JSTL 标记库。
清单 1. JSTL 标记与 JSF 标记混合使用
代码内容
代码内容 <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> <html> <head> <title>JSF in Action: JSTL Example 1 - Mixing JSF with other custom tags</title> </head> <body bgcolor="#FFFFFF"> <f:view> <h1> <h:outputText value="Example of using JSF tags with other custom tags"/> </h1> <p> <b> <c:out value="Here’s the value of your web.xml (don’t do this at home):"/> </b> <blockquote> <f:verbatim> <c:import url="WEB-INF/web.xml"/> </f:verbatim> </blockquote> </p> </f:view> </body> </html></code> |
在这个例子里, JSTL 和JSF 标记嵌套在 JSF标记 <f:view>内, <f:view>定义了JSF组件树的开始。这个例子使用了 JSF 的h标记 (<h:outputText>) 和JSTL <c:out> 标记显示文本。 在这个页面内,JSTL <c:import> 标记包含系统的 web.xml 文件 (这不是你想与其它人共享文件的正确方法,所以,不要在一台真实的服务器上这样做). 因为 web.xml 是一个XML 文件, <c:import>标记要嵌套在<f:verbatim> 内, <f:verbatim>是一个 JSF UIOutput组件并且绘制时转义XML元素,所以能在HTML页内正确显示。这个例子没有太多的内容,但它示范了在同一页面内不同的标记能一起使用。注意我们把JSTL 标记嵌套在 JSF <f:verbatim> 标记内,一般而言,它比将 JSF 标记嵌套在其它标记内容易。事实上,任何有子组件的组件如 HtmlDataTable和 HtmlPanelGrid需要将模板文本嵌套在一个<f:verbatim> 标记内。 JSTL 标记与 JSF 标记一起使用使JSF变得更强大,这两者都使用类似的表达式语言。 (对 JSP 2.0’s 表达式也是如此l). 这允许你以一种直观的方式在JSTL 和 JSF 标记间共享数据。 这里举例说明这一点,让我们看另一个例子, 它允许用户在 HtmlInputText 控件中输入一个值,然后利用这个值用 JSTL <c:forEach>标记重复输出一个字符串。 代码在清单2列出。
清单2. JSF 、JSTL 标记和同一个 backing bean
代码内容
代码内容 ... <f:view> <jsp:useBean class="org.jia.examples.TestForm" id="exampleBean" scope="session"/>
<h1> <h:outputText value="Example of using JSF and JSTL expression languages"/> </h1>
<h:form> <h:outputLabel for="inputInt"> <h:outputText value="How many times do you want to repeat the Oracle’s prophecy?"/> </h:outputLabel>
<h:inputText id="inputInt" value="#{sessionScope.exampleBean.number}"/> <h:commandButton value="Go!"/> <p> <c:if test="${sessionScope.exampleBean.number > 0}"> <c:forEach begin="0" end="${sessionScope.exampleBean.number - 1}" var="count"> Queen Tracey will achieve world domination.<br> </c:forEach> </c:if> </p> </h:form> ... </f:view> ... |
警告: 如果你用 JSP 或 JSTL 表达式访问 managed beans, 你必须确保 beans 已经被创建,这是因为这些旧的表达式语言不知道JSF中的Managed Bean如何创建。这个例子中定义了一个叫exampleBean的JavaBean, 它有一个int类型的 number 属性。使用HtmlInputText 组件基于用户的输入更新bean的属性值。当用户点击Go! 按钮时 (一个 HtmlCommandButton 组件), 更新number属性的值并重新显示页面。 当这一切发生时, JSTL <c:forEach> 标记通过 JSTL <c:out> 标记重复显示文本 exampleBean.number 次。当exampleBean.number的值大于0时,<c:forEach> 标记才执行,这通过JSTL <c:if>进行测试。
你不能在叠代主体的循环标记内部使用 JSF 组件标记,象JSTL 的 <c:forEach>标记。 推荐的方法是使用 HtmlDataTable 组件或其它的组件叠代一个数据集或集合,在这个例子中,没有 JSF 组件 嵌套在 JSTL <c:if>标记内。 但是如果组件显示一次然后当页面再次显示时被条件标记(如 <c:if>)隐藏会发生什么呢? 第一次显示组件时,组件被添加到视图,第二次如果<c:if> 标记不显示组件, JSF 将从视图中删除它。意思就是任何输入控件会丢失他们的本地值,你不能再引用这些组件,举一个例子,看清单3, 它来自清单2的同一页.
清单 3. 用JSTL标记条件显示JSF 组件
代码内容
代码内容 ... <h:form> <h:outputText value="If you entered a number greater than 10, two input controls will display below."/> <p> <c:if test="${sessionScope.exampleBean.number > 10}"> <h:outputLabel id="inputStringLabel"for="inputString"> <h:outputText id="outputStringLabel" value="Enter in your string. JSF will remember the value unless this control is hidden."/> </h:outputLabel> <h:inputText id="inputString"/> <h:commandButton value="Go!"/> </c:if> </p> </h:form> ... |
如果
exampleBean.number的值比10大, JSTL <c:if> 标记将会执行它的主体。如果主体被执行,那么所有嵌套其中的组件将增加到视图并显示。 如果没有执行,组件将会删除 (如果先前已增加). 这显示在图1. 如果你用JSTL 条件标记(或其它的定制标记)控制组件的可见性。如果它们没有显示,组件将被从视图中移走。这意思是说组件会忘记他们的本地值。
Figure 1. The JSTL <c:if> tag will execute its body if the value of exampleBean.number is greater than 10. Click on thumbnail to view full-sized image.
图 2 显示了清单2和清单3的输出。顶部输入域(一个 HtmlInputText 组件)的值关联到了 exampleBean.number的属性, JSTL <c:forEach>使用它显示一个字符串exampleBean.number次,在页面底部,如果exampleBean.number的值大于10, JSTL <c:if>标记显示一个带有JSF组件的表格。 否由,组件将不会显示, 并从视图中移出 (输入控件将丢失它的值).
Figure 2. The output of the JSP page shown in Listings 2 and 3. Click on thumbnail to view full-sized image.
你能达到清单3中代码同样的效果,通过把组件放入一个 HtmlPanelGroup 并设置它的 rendered 属性等于同样的表达式。 HtmlPanelGroup 可以作为多个组件的容器,下面是例子: 代码内容
代码内容 <h:panelGroup rendered="#{sessionScope.exampleBean.number > 10}"> <h:outputLabel id="inputStringLabel2" for="inputString"> <h:outputText id="outputStringLabel2" value="Enter in your string. JSF will remember the value."/> </h:outputLabel> <h:inputText id="inputString2"/> <h:commandButton value="Go!"/> </h:panelGroup> |
如果exampleBean.number 大于10,这个面板变得可见。在这种情况下,如果组件没有显示也不会删除。这是一个使用纯JSF而不用JSTL的好例子。
Tip: 即使你使用JSTL提供一个有很多功能的定制标记,如果你从零开始开发 (或重做), 你应当首先看看用标准的JSF组件能否实现你想要的行为。使用好的组件和设计良好的backing beans, 在页面中能消除很多JSTL标记。使用标准的JSF,你能显示或隐藏面板和做各种各样的有强大功能的事情。 下面是几个可以让JSF标记和JSTL国际化、格式化标记协同工作的条件:
不推荐使用<fmt:parseDate>和<fmt:parseNumber> . 你应该使用一个带有的日期或数字转换器的HtmlInputText 组件。
不应该使用<fmt:requestEncoding>标记指定页面的字符编码,通常, JSF自动处理。如果你要强迫用特殊的字符编码, 你应该用JSP页面指示:
代码内容 <%page contentType="[contenttype];[charset]"%>. |
也不应该使用<fmt:setLocale> 标记,因为它不知道, 它可能引起你的JSTL标记使用一个地区而你的JSF组件使用另一个, 代替这种灾难发生的处方是,你应该使用JSF的国际化特性。为了控制特殊页面的场所,使用UIViewRoot 组件的locale 属性。 JSF的国际化特性能在JSF和JSTL两者中工作。
结合JSF和JSTL能变得十分强大。 在这里我们示范了你的定制标记或从第三方获取的标记与JSF、JSTL一起工作。 通常,当可能时,你应该尽可能地使用JSF 标记。
分享到:
相关推荐
每个项目都可能涵盖了上述知识点,例如JSP的动态生成、JSF的组件使用、EL和JSTL的表达式等。通过分析这些源代码,你可以更好地理解两者的协同工作方式,以及在实际开发中如何选择和使用它们。 在学习过程中,建议先...
JSF的核心是UI组件,它们通过自定义标记在JSP页面中使用,这些标记与renderer关联,使得组件可以以多种方式呈现。例如,同一个UI组件可以用不同的renderer来呈现HTML或其他格式。UIComponent、Renderer和标记协同...
5. **JSTL核心库**和**JSTL函数库**:这两个库提供了JSP Standard Tag Library的标签,如`<c:if>`和`<c:forEach>`,以及函数库如`<fn:length>`,增强了JSF应用的功能。 6. **Facelets Templating库**:提供模板和...
了解了这些关于JSP、JSF和Tomcat的知识点后,开发者能够更好地理解和运用这些技术来构建、部署和维护Java Web应用程序。该书可能还会介绍如何结合这些技术开发应用、如何处理常见的问题,以及如何在实际项目中优化...
- **3.2.2 与JSTL以及其他JSP定制标签一起使用JSF**:讨论了JSF与JSTL的集成。 **3.3 创建和初始化bean** - **3.3.1 声明受管bean**:介绍了如何在JSF应用中声明和管理后端Bean。 - **3.3.2 将List和Map声明为受管...
JSP是Java平台上的动态网页技术,它允许开发者在HTML、XML或其他标记语言中嵌入Java代码,从而实现动态内容的生成。JSP的核心概念包括以下几点: 1. **JSP元素**:JSP页面由静态内容和动态元素组成,动态元素包括...
JSP(Java Server Pages)是Java平台上的一种动态网页技术,它允许开发人员将HTML、XML或其他标记语言与Java代码结合,以创建交互式和数据驱动的Web应用。本教程旨在帮助初学者和有一定基础的学习者从入门到精通,...
使用JSF需要将JSF的实现库(如`jsf-impl.jar`和`jsf-api.jar`)以及相关依赖(如`jstl.jar`和`standard.jar`)添加到Web应用程序的`/WEB-INF/lib`目录。`build.xml`是一个示例的Ant构建文件,用于编译源代码并管理...
3. **jstl-1.2.jar**:JSTL(JavaServer Pages Standard Tag Library)是一个标准标签库,它允许开发者使用标签而不是脚本来处理常见的JSP任务,如迭代、条件判断、XML处理等。JSTL 1.2版本与JSF结合使用,可以增强...
4. **分离表现层和业务逻辑**:JSP 2.0鼓励使用JavaServer Faces(JSF)组件模型,将界面设计与业务逻辑分离,提高了代码的可重用性和可维护性。 5. **内置对象增强**:例如,RequestDispatcher对象现在可以直接在...
通过这个"jsp 教学课件"的学习,你可以掌握JSP的基础概念,理解其工作原理,熟练运用JSP指令和脚本元素,以及掌握EL和JSTL的使用,进一步提升你的Web开发技能。在实际项目中,结合良好的编程习惯和设计模式,你将...
10. **开发工具与框架**:现代开发中,常常使用IDE如Eclipse、IntelliJ IDEA等进行JSP开发,并且Spring MVC、Struts、JSF等框架可以帮助开发者更高效地构建应用。 在“jsp全攻略qgl.rar”中,可能包含的实战案例和...
- **JavaServer Faces (JSF)**:JSF是基于MVC的Java Web组件框架,可以与JSP集成,提供更高级的UI组件和生命周期管理。 6. **JSP的高级特性** - **JSP 2.0及以上版本的新特性**:如Declarative Attributes、Tag ...
然而,JSP和JSF可以结合使用,通过JSP作为视图层来渲染JSF组件。 总结来说,JSP中文入门基础教程涵盖了JSP的基本概念、生命周期、内置对象、标准动作以及与JSF的关系。通过学习这些内容,开发者可以开始构建动态、...
3. **标准标签库**:详细阐述如何使用和创建符合JSP 2.0标准的自定义标签库,以提高代码复用性和可维护性。 4. **AJAX支持**:JSP 2.0可以通过JavaScript和XMLHttpRequest与服务器进行异步通信,提升用户体验。 5....
**标签解析:**"jsp-api" 这个标签明确了主题与JSP API有关,API(Application Programming Interface)是一组预定义的函数、类和接口,供开发者在编写软件时使用,以便与特定的系统或库进行交互。在这里,它特指JSP...
JSP2是基于Java Servlet API的,它允许开发者使用HTML、XML或其他标记语言来设计网页,并在其中嵌入Java代码,实现业务逻辑和数据处理。JSP2的关键改进包括引入了统一表达式语言(EL)、页面指令的简化以及组件模型...
JSP(JavaServer Pages)是Java平台上的一个用于创建动态web内容的技术,它允许开发者在HTML、XML或其他标记语言中嵌入Java代码,从而实现服务器端的业务逻辑处理和动态内容生成。 1. **JSP基本概念**:JSP由静态...
然而,为了提高代码的可读性和可维护性,现代的JSP开发倾向于避免使用scriptlets,转而采用EL(Expression Language)和JSP标签。以下是一个使用scriptlets的例子: ```jsp int count = 0; for (int i = 0; i ; ...