首页 > 学院 > 开发设计 > 正文

web开发框架——JSF开发实战一(图)

2019-11-18 12:31:16
字体:
来源:转载
供稿:网友

  JSF将是J2EE5.0中所包含的web开发框架,这应该是第一个成为jcp标准,并且随j2eesdk一起发布的web框架,可以看出sun对它的期望很高。JSF最大的竞争对手是tapestry,是apache的产品,但是apache又弄出了个myfaces,是对jsf标准的一个实现。也许你也和我一样,在jsf和tapestry之间犹豫很久,将来从apache的态度上应该可以看出二者的走向。在tss上有一篇比较jsf 1.0与tapestry 3.0的文章,内容很扎实到位:http://www.theserverside.com/articles/article.tss?l=JSFTapestry
  
  JSF的竞争对手不是struts/webwork之流,它们基本上已经是不同阶段上的东西了,放在一起比较意义不大。
  
  JSF的开发流程和asp.net中所倡导的code behind方式很相似,核心是事件驱动,组件和标签的封装程度非常高,很多典型应用已经不需要开发者去处理http。页面操作会被自动映射到对应的java bean中,后台逻辑只需要同java bean发生交互。整个过程是通过“依靠注入(DI)”来实现的,看来这是目前解偶合的最佳途径啊,sPRing的影响真是深远。不过正式因为jsf采用了这样的方式,导致开发工作和以前的jsp/struts等都有非常大的不同,需要一定的时间去学习。学习之前建议先对依靠注入有比较清楚的熟悉,可以参考我的learn Spring in spring系列的第一篇。
  
  本系列将以两个例子来讲解jsf的基本开发,第一个例子当然是hello world。目前可用的jsf ide不多,ibm要到06年才能放出支持jsf的wtp版本。所以我们的例子基本以手写为主,这样也能让我们有更清楚的熟悉,同时推荐目前最好的jsf开发工具:myeclipse 4.0 GA。后面的例子将会有jsf和hibernate的内容,它都能给予很好的支持。由于myeclipse并不免费,所以我们除了讲解在ide中如何操作外,还会叙述手动操作的具体内容,以免过于依靠开发工具。用什么服务器都可以,这里采用了jboss 4.0.2。假如你的服务器是高版本的tomcat(5.5+),那么必须要删除它自带的一些包才能很好的支持jsf,具体细节请查看它的文档。
  
  请自行下载jsf ri和JSTL 1.1。
  
  废话少说,开始了。
  
  在myeclipse 4.0GA中新建一个web项目,命名为hello,为项目增加对JSTL的支持:
  
 web开发框架——JSF开发实战一(图)(图一)

  在JSTL的版本中选择1.1。
  
  该操作实际上是把jstl.jar和standard.jar加到工程中。
  
  采用类似的操作为项目添加对jsf的支持:myeclipse?add jsf capabilities
  
  如图:
  
 web开发框架——JSF开发实战一(图)(图二)

  其中的jsf implementation是选择使用哪中JSF实现,我们采用的是sun的jsf ri
  
  JSF config path是配置文件的位置,保持不变
  
  URL pattern是jsf servlet的映射方式,有两种选择,具体细节后面说明。
  
  以上操作上是为项目加入了jsf需要的jar和tld文件,并且创建了一个faces-config.xml的配置文件。涉及到的jar有:commons-beanutils.jar  commons-collections.jar    commons-digester.jar  commons-logging.jar  jsf-api.jar    jsf-impl.jar
  
  涉及到了jsf中所有的tld文件。
  
  当前的faces-config.xml文件的内容是:
  
  
  
  
  
  

  
  环境已经建立好了,现在我们要建立一个程序,它的功能是让用户在表单中输入名字,提交后系统会返回一个问候。使用jsf的以后好处是,开发人员会很自然的把mvc各层分开,不会像使用strtus那样别扭,这一点在后面的开发中感觉得到。
  
  首先开发model层,它是个很简单的bean:
  package org.bromon.jsf.model.hello;
  
  public class SayHello {
  public String say(String name)
  {
  return "你好,"+name;
  }
  }
  
  在model层中你可以随意的实现业务的数据逻辑,不需要与web层有任何的关系。
  
  下面开发控制层,它负责存取web层的数据,并且调用model层的逻辑:
  /**
  * jsf的控制层方法
  * @author bromon
  */
  package org.bromon.jsf.control.hello;
  
  import org.bromon.jsf.model.hello.*;
  
  public class HelloDelegater {
  
  //------属性---------
  private String name;//表单中的文本框数据会传到这里
  private String result;//web页会从这里取得运行结果
  private SayHello sayHello;//model层的对象,并不事例化,由系统注入
  
  //-----set/get--------
  public String getName() {
  return name;
  }
  public void setName(String name) {
  this.name = name;
  }
  public SayHello getSayHello() {
  return sayHello;
  }
  public void setSayHello(SayHello sayHello) {
  this.sayHello = sayHello;
  }
  public String getResult() {
  return result;
  }
  public void setResult(String result) {
  this.result = result;
  }
  
  //-----逻辑方法---------
  public String say()
  {
  this.setResult(sayHello.say(this.getName()));
  return "ok";
  }
  }
  
  需要注重的是,属性的名字、set/get方法的名字必须严格按照java bean规范编写,因为它们要被注入依靠时使用。sayHello对象并没有被实例化,它会在运行时由系统注入。
  
  这两个bean当然要在系统中申明,否则无法实现DI。在faces-config.xml文件中添加内容:
  
  SayHello
  
  org.bromon.jsf.model.hello.SayHello
  

  request
  

  
  HelloDelegater
  
  org.bromon.jsf.control.hello.HelloDelegater
  

  request
  
  sayHello
  #{SayHello}
  

  

  
  在后一个bean中,它的sayHello属性被指定要在运行时注入一个org.bromon.jsf.model.hello.SayHello的实例。
  
  下面要编写表示层的页面,只有一个index.jsp:
  需要引入两个标签库:
  
  <%@ taglib uri="http://java.sun.com/jsf/Html" prefix="h" %>
  <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
  下面是构造jsf标签:
  
  
  
  
  
  
  
  
  
  
  

  
  
  

  

  

  
  
  页面中包含了一个文本框和一个label,他们分别被绑定到了HelloDelegater类的两个属性上,具体的绑定工作有系统通过翻转控制的方式调用对应的set/get方式实现。提交按钮被绑定到了HelloDelegater.say方法,该方法会把计算结果赋给result属性,它会在页面中显示出来。
  
  因为我们在url pattern中选择了*.faces,所以我们应该访问如下地址来查看程序:
  http://localhost:8080/hello/index.faces
  相应的,假如你选择了/faces/*,那么就应该是:
  http://localhost:8080/hello/faces/index.jsp
  
  程序执行结果如下:
  
web开发框架——JSF开发实战一(图)(图三)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表