(******一段*******)
Java在最近几年逐渐升温,随着Java SE 5和Java SE 6的推出,Java的未来更显得无比辉煌。但以Java为基础的JSP在Java SE 5推出之前却一直抬不起头来,这最重要的原因就是JSP虽然功能十分强大,但最大的优点也是它的最大缺点,功能强大就意味着复杂,尤其是设计前端界面的可视化工具不多,也不够强大。因此,设计JSP页面就变得十分复杂和繁琐...
Java在最近几年逐渐升温,随着Java SE 5和Java SE 6的推出,Java的未来更显得无比辉煌。但以Java为基础的JSP在Java SE 5推出之前却一直抬不起头来,这最重要的原因就是JSP虽然功能十分强大,但最大的优点也是它的最大缺点,功能强大就意味着复杂,尤其是设计前端界面的可视化工具不多,也不够强大。因此,设计JSP页面就变得十分复杂和繁琐。不过,在Java SE 5推出的同时,Sun为了简化JSP的开发难度,推出了新的JavaServer Faces(简称JSF)规范。从而使JSP走上了康庄大道。
一、什么是JSF
JSF和JSP是一对新的搭档。JSP是用于后台的逻辑处理的技术,而JSF恰恰相反,是使开发人员能够快速的开发基于 Java 的 Web 应用程序的技术,是一种表现层技术。目前,JSF1.2已经正式作为一个标准加入了Java EE 5中。
作为一种高度组件化的技术,开发人员可以在一些开发工具的支持下,实现拖拉式编辑操作,用户只需要简单的将 JSF 组件拖到页面上,就可以很容易的进行 Web 开发了。这是其作为一种组件化的技术所具有的最大好处,我们能用的组件不光是一些比较简单的输入框之类,还有更多复杂的组件可以使用的,比如 DataTable 这样的表格组件, Tree 这样的树形组件等等。
作为一种标准的技术,JSF还得到了相当多工具提供商的支持。同时我们也会有很多很好的免费开发工具可以使用,前不久 Sun Java Studio Creator 2 和 Oracle JDeveloper 10g 作为免费的支持 JSF 的开发工具发布,给 JSF 带来了不小的生气。另外我们也有一些很优秀的商业开发工具可共选择,BEA Workshop (原 M7 NitroX),Exadel,MyEclipse 这样的基于 Eclipse 的插件开发工具,为现在广大的 Eclipse 用户带来了不小的便利,IBM 的 Rational Application Developer 和 Borland 的 JBuilder 也是很不错的支持 JSF 可视化开发的商业开发工具。
JSF和传统的Web技术有着本质上的差别,在传统的Web技术需要用户自己对浏览器请求进行捕捉,保存客户端状态,并且手工控制着页面的转向,等等。而JSF的出现,无疑给我们带来了巨大的便利,JSF 提供了事件驱动的页面导航模型,该模型使应用程序开发人员能够设计应用程序的页面流。与 Struts 的方式向类似的是,所有的页面流信息都定义在 JSF 配置 XML 文件 (faces-config.xml) 中,而非硬编码在应用程序中。这很大程度简化了开发人员开发难度,简化了应用程序的开发。
同时JSF也是一种遵循模型-视图-控制器 (MVC) 模式的框架。实现了视图代码(View)与应用逻辑(Model)的完全分离,使得使用 JSF 技术的应用程序能够很好的实现页面与代码的分离。所有对 JSF 页面的请求都会通过一个前端控制器 (FacesServlet) 处理,系统自动处理用户的请求,并将结果返回给用户。这和传统的 MVC 框架并没有太大的区别。
在JSF中不仅使用了 POJO 技术,而且还使用了类似 Spring 的控制反转(IoC) (或称为依赖注入-DI) 技术,在 JSF 的 Backing Bean 中,我们可以把视图所需要的数据和操作放进一个 Backing Bean 中。同时得益于 JSF 使用的 DI 技术,我们可以在配置文件中初始化 Managed Bean,同时我们也可以通过这样的技术很方便的和使用类似技术的 Spring 进行整合。
二、如何在JSP中使用JSF
JSF只有通过和JSP相结合,才能充分发挥它的功效。JSF是通过标签库和JSP 进行集成的。标签库就相当于ASP.NET的服务端组件。JSF提供了非常丰富的标签库,通过这些标签库,可以生成各种客户端模型,如HTML、WML、 XML以及JavaScript等。通过这些标签,你可以很容易建立大规模的客户端模型,并由这些标签自动处理客户端请求。
接下来让我们来看一个如何使JSF和JSP在一起工作的例子。在JSF中有两个库。第一个叫做内核库,在这个库中包含了各种主要的标签,如配置组件、管理事件、验证输入信息等。第二个库的主要功能是将HTML和JSF的各种标签相对应。每一个JSF标签都会对应一个HTML组件。如UIInput标签对应了HTML中的文本框或密码框。
(********二段*********)
在JSF标签中文本输入框叫做inputText,而密码输入库叫inputSecret。下面是一个简单的JSF和JSP结合的用户接口程序。
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312">
<title>第一个JSF程序</title>
</head>
<body>
<f:view>
<h:form id="simpleForm">
<h:outputText id="favoriteLabel" value="请输入一个数字:"/>
<h:inputText id="favoriteValue" value="#{simple.longValue}">
<f:validateLongrange maximum="30" minimum="0"/>
</h:inputText>
<p/>
<h:commandButton id="submit" value="提交" action="#{simple.simpleActionMethod}"/>
</h:form>
</f:view>
</body>
</html>
在上面的代码中,我们可以了解到JSF是如何同JSP集成的。我们首先可以看到一个内核标签:view。然后是几个JSF组件。如form、outputText、inputText以及commandButton。这几个组件被放到 form中从而开成了form中的一部分。在程序的最开始,必须使用import导入两个标签库。代码如下。
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
上面2行代码声明了JSP中要使用哪一个JSF标签库。内核库使用前缀(prefix)f声明,而HTML库使用前缀(prefix)h声明。这两个前缀并不是必须要使用,而只是一个建议。在程序中,内核库必须要使用,因为 view在所有的JSF页中必须使用。而HTML标签在运行时将JSF标签转化为HTML组件,这个h前缀并不是必须的,而是JSF规范推荐使用的,这样,我们使我们的JSF程序更易读。
在声明后是几行标准的HTML语句,本文不再详述。从 f:view 开始,是一段JSF语句。这段代码如下所示:
<f:view>
<h:form id="simpleForm">
<h:outputText id="favoriteLabel" value="请输入一个数字:"/>
<h:inputText id="favoriteValue" value="#{simple.longValue}">
<f:validateLongrange maximum="30" minimum="0"/>
</h:inputText>
<p/>
<h:commandButton id="submit" value="提交"
action="#{simple.simpleActionMethod}"/>
</h:form>
</f:view>
/f:view 标签预示着JSF的开始,而它的下一个标签form将建立一个HTML Form。而outputText标签相当于HTML中的label组件。inputText标签相当于HTML中的textField组件。而 commandButton标签相当于HTML中的submit按钮。运行这个JSP程序,将得到如图1所显示效果。
三、JSP如何响应JSF的请求
从上面的例子我们已经知道如何在JSP中使用JSF了,在这一部分让我们来看看在JSF是如何处理请求的。
首先让我们来看一个例子,这个例子是将华氏度转换为摄氏度。当用户点击提交按钮时程序将进行转换。
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312">
<title>温度转换程序</title>
</head>
<body>
<f:view>
<h:form>
<div>
<h:outputText id="fahrenheitLabel" value="请输入华氏温度:"/>
<span>
<h:inputText id="temperature" value="#{tc.fahrenheitTemp}">
<f:validateDoublerange minimum="-100.0" maximum="100.0"/>
<f:valuechangeListener type="tempconv.page.TCChangedListener"/>
</h:inputText>
</span>
</div>
<div>
<h:outputText id="celsiusLabel" value="摄氏温度:"/>
<span>
<h:outputText id="celsiusValue" value="#{tc.celsiusTemp}">
<f:convertNumber maxFractionDigits="3" type="number"/>
</h:outputText>
</span>
</div>
<div>
<h:commandButton value="转换" action="#{tc.convert}">
</h:commandButton>
</div>
</h:form>
</f:view>
</body>
</html>
(*****三段********)
在程序的前两行是导入JSF核心库和HTML库,这个在前面已经讨论过,在这里不再详述。
下面让我们来看看JSF标签是如何同后端进行交互的。由于我们是在JSP中使用 JSF,因此,这个和正常的JSP没有什么区别;JSP实际上就是Servlet,在JSP第一次运行时由JSP编译器将.JSP文件编译成 Servlet后再由Servlet调用,然后由Servlet来接收客户端传过来的数据流。但和一般的JSP程序不同的是,JSF标签是由JSF API负责调用的(这样可以做到逻辑层和表现层分离),除此之外,它们和一般的JSP标签没有任何区别。
当UIComponent标签收到doStartTag方法时,JSF将使用这些属性来设置标签的值。如本例中的inputText标签将按它的属性值来设置。下面是JSF的代码片段。
<h:inputText id="temperature" value="#{tc.fahrenheitTemp}">
<f:validateDoublerange minimum="-100.0" maximum="100.0"/>
<f:valuechangeListener type="tempconv.page.TCChangedListener"/>
</h:inputText>
inputText标签根据相应的值设置了id和value的属性。在JSF中是通过setAttribute(String name, Object value)设置每一个属性值的。但我们需要注意的是JSF标签可以指定相应的默认值。这有些类似java中的系统属性,如果你给了一个属性名子,那系统将返回这个属性的值,如果指定它的默认值,并且这个属性不存在的话,将返回这个默认值。
接下来让我们来看看上面程序的最重要的部分,也就是UIInput组件的事件处理。
<f:valuechangeListener type="tempconv.page.TCChangedListener"/>
在JSF中事件处理是由valuechangeListener标签完成的。这个标签所表示的事件在文本框的值发生变化时引发事件。但有意思的是这个事件并不马上提交,而是要等到用户点击"提交"按钮后这个事件连同相应的数据才提交给后端。因此,这个事件请求也叫做预提交。最后,让我们看看UICommand的代码实现。
<div>
<h:commandButton value="转换" action="#{tc.convert}">
</h:commandButton>
</div>
上面的代码将convert()方法和UICommand连接了起来,也就是说,点击"提交"按钮后,将执行convert()方法。在遇到view标签后,JSF程序结果,JSFAPI最后调用doEnd方法来结束JSF程序。JSF 引擎在解析这段程序后,将相应的JSF标签转换为HTML组件。
最后,让我们来看看JSP是如何响应JSF事件的。下面是一段响应JSF事件的Java代码。
public class TCChangedListener implements ValueChangeListener
{
public TCChangedListener()
{
super();
}
// 事件处理
public void processValueChange(ValueChangeEvent event)
throws AbortProcessingException
{
UIComponent comp = event.getComponent();
Object value = event.getNewValue();
if (null != value)
{
float curVal = ((Number) value).floatValue();
Map values = comp.getAttributes();
if (curVal < 0)
{
values.put("styleClass", "red");
}
else
{
values.put("styleClass", "black");
}
}
}
要想响应JSF事件,必须要实现JSF库中的ValueChangeListener接口。上面的程序要注意的是最后根据输入的值来设置相应的颜色。这些值并不依赖JSP。当然,你也可以将它们设置成null,而由JSP 标签来设置它们的颜色。
分享到:
相关推荐
文件"JSP和JSF合并+打造完美的Web层应用.doc"很可能是详细的教程或案例分析,它可能会涵盖如何设置项目结构、配置Web.xml、创建JSF组件、集成JSP页面、以及处理各种交互和事件等内容。而"附赠:超多精品源码.htm"则...
【JSP和JSF合并打造完美Web应用】 JavaServer Pages(JSP)和JavaServer Faces(JSF)是两种在Java平台上构建Web应用程序的关键技术。它们各有特点,但结合使用可以大大提高开发效率和应用程序的易维护性。在本文中...
根据提供的文档信息,我们可以深入探讨该附赠电子资料中涵盖的主要知识点和技术框架,特别是针对Struts2、JSF、Hibernate、iBATIS以及JPA等内容。 ### 1. Java Web开发基础 #### 1.1 JSP (Java Server Pages) JSP...
不过,随着技术的发展,现代的Web应用框架如React、Vue.js和Angular等,可能会替代JSF的部分角色,但JSF依然在企业级Java应用中占据一席之地,特别是在那些已建立的、依赖于Java EE基础设施的项目中。
3. **关机功能**:虽然不常见,但在特定场景下,JSF可以用来创建一个能够发送系统关机命令的Web应用,但这通常需要服务器端的特殊权限和API支持。 **四、源码分析** 提供的压缩包文件`mann_srcs.part06.rar`、`mann...
在探讨JAVA WEB JSF的设计参考方案以及页面布局策略时,我们深入分析了使用JSF进行高效页面设计的方法,尤其关注了两种主流布局方案:利用JSP的`include`功能和集成Tiles框架。这两种方法旨在解决Web应用中页面设计...
JSP(JavaServer Pages)技术和J2EE(Java 2 Platform, Enterprise Edition)是Java领域中用于构建企业级Web应用的重要组成部分。这两者共同为企业应用开发提供了强大而灵活的框架。 **JSP技术** JSP是Java平台上的...
JSP的核心概念是分离表现层(视图)和业务逻辑层,这使得开发者能够更容易地管理和更新网站内容。 **JSP的组成部分**: 1. **静态内容**:包括HTML、CSS和JavaScript,负责页面的布局和外观。 2. **JSP指令**:这些...
**JSP(Java Server Pages)** 是一种动态网页技术,由Sun Microsystems开发,现在由Oracle公司维护。...通过深入学习这些材料,开发者可以提升对JSP以及相关技术的理解,从而更好地开发和维护基于Java的Web应用。
2. **JSP与Java框架集成**:Spring MVC、Struts、JSF等Java Web框架提供了更高级别的抽象,使JSP开发更加高效和灵活。 3. **JSP最佳实践**:避免在JSP页面中编写大量Java代码,保持页面的简洁性和可读性;合理利用...
Eclipse内置了强大的调试工具,包括对Java代码、Servlets、JSP和JSF等Web组件的调试支持。开发者可以通过断点、变量查看和调用栈分析等手段,有效地查找和修复问题。 十、版本控制集成 Eclipse支持多种版本控制...
随着Java EE的发展,JSF(JavaServer Faces)和Spring MVC等框架提供了更高级别的抽象,它们在JSP的基础上进行了优化,提供更好的组件化和模块化开发体验。 这个“JSP教程打包”包含的详细教程将涵盖以上所有知识点...
- Struts、Spring MVC、JSF等框架在Java Web中的应用。 6. **JSP自定义标签库(Tag Libraries)** - TLD(Tag Library Descriptor):定义自定义标签。 - JSP标签库开发:创建自定义标签类和TLD文件。 7. **...
在Java Web编程的世界里,开发者们使用一系列技术和框架来创建动态、交互式的Web应用程序。"JAVA WEB编程从入门到实践"这一主题涵盖了从基础概念到实际应用的全面学习路径,旨在帮助初学者逐步掌握这个领域。 一、...
JavaServer Pages(JSP)是一种基于Java的技术,用于构建动态Web应用程序。它将HTML代码与Java代码分离,使得开发者能够更方便地处理动态内容和静态内容。JSP技术的核心概念包括以下几个方面: 1. **页面元素**:...
**JSP(Java Server Pages)** ...通过深入学习和实践本教程中的内容,开发者将能更好地掌握JSP的高级特性,提升Web应用的开发效率和质量。无论你是刚接触JSP的新手,还是寻求进阶的开发者,这份教程都将是宝贵的资源。
进一步地,教程会深入讲解MVC(模型-视图-控制器)设计模式在JSP中的应用,以及如何使用JavaServer Faces(JSF)和Spring MVC框架来构建更复杂的应用。数据库连接和查询操作也是JSP开发中不可或缺的一部分,因此教程...
在IT行业中,JSP(JavaServer Pages)是一种用于构建动态网站和Web应用程序的服务器端技术。要成为一位优秀的JSP程序员,需要掌握一系列关键技能和知识。以下将详细阐述成为优秀JSP程序员所需掌握的核心要点。 1. *...
1. **Java Web**:涵盖了Java Servlet、JSP、JSF等技术,用于构建动态的Web应用程序。 2. **SVN**:Subversion,是版本控制系统,用于管理代码版本和团队协作。 【压缩包子文件的文件名称列表】"greenstore"可能...