科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道JSP和JSF双剑合并 打造完美Web应用2

JSP和JSF双剑合并 打造完美Web应用2

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 Java在最近几年逐渐升温,随着Java SE 5和Java SE 6的推出,Java的未来更显得无比辉煌。不过,在Java SE 5推出的同时,Sun为了简化JSP的开发难度,推出了新的JavaServer Faces(简称JSF)规范。从而使JSP走上了康庄大道。

作者:atomic_age 来源:IT专家网 2008年6月5日

关键字: web JSF JSP java

  • 评论
  • 分享微博
  • 分享邮件
<f:view>标签预示着JSF的开始,而它的下一个标签form将建立一个HTML Form。而outputText标签相当于HTML中的label组件。inputText标签相当于HTML中的textField组件。而commandButton标签相当于HTML中的submit按钮。运行这个JSP程序,将得到如图1所显示效果。

  点击放大此图片

  图1 第一个JSF程序的运行结果

  三、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 标签来设置它们的颜色。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章