当前位置 > 主页 > 万和大讲堂 >


南京Java培训机构 JSP如何响应JSF的请求

2015-07-02 15:30

   从上面的例子我们已经知道如何在JSP中使用JSF了,在这一部分让我们来看看在JSF是如何处理请求的。

 

  首先让我们来看一个例子,这个例子是将华氏度转换为摄氏度。当用户点击提交按钮时程序将进行转换。

 

  <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

 

  <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

 

  <html>南京Java培训机构

 

  <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>南京Java培训机构

 

  <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的代码片段。南京Java培训机构

 

  <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> 南京Java培训机构

 

  上面的代码将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)

 

  { 南京Java培训机构

 

  values.put("styleClass", "red");

 

  }

 

  else

 

  {

 

  values.put("styleClass", "black");

 

  }

 

  }

 

  }

 

  要想响应JSF事件,必须要实现JSF库中的ValueChangeListener接口。上面的程序要注意的是最后根据输入的值来设置相应的颜色。这些值并不依赖JSP。当然,你也可以将它们设置成null,而由JSP 标签来设置它们的颜色.


最近开班 more>
  • Web前端开发
  • 软件测试
  • 软件测试预科班
  • AI大模型+全栈开发开班
  • 云原生精英班
  • 云网预科班
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第五期
  • Java全栈
  • CISP
  • HCIP-cloud
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCP 19C
  • RHCA
  • 6月9日
  • 5月21日
  • 5月14日
  • 6月9日
  • 5月7日
  • 5月26日
  • 5月19日
  • 5月12日
  • 6月3日
  • 6月9日
  • 随时开课
  • 7月12日
  • 5月19日
  • 5月19日
  • 5月7日
  • 5月10日
  • 5月24日
  • 5月24日
  • 随时开课
  • 随时开课
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入