分享
 
 
 

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

王朝html/css/js·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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的支持:

在JSTL的版本中选择1.1。

该操作实际上是把jstl.jar和standard.jar加到工程中。

采用类似的操作为项目添加对jsf的支持:myeclipse?add jsf capabilities

如图:

其中的jsf implementation是选择使用哪中JSF实现,我们采用的是sun的jsf ri

JSF config path是配置文件的位置,保持不变

URL pattern是jsf servlet的映射方式,有两种选择,具体细节后面说明。

以上操作上是为项目加入了jsf需要的jar和tld文件,并且创建了一个faces-config.xml的配置文件。涉及到的jar有:commons-beanutils.jarcommons-collections.jarcommons-digester.jarcommons-logging.jarjsf-api.jarjsf-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:

需要引入两个标签库:

下面是构造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

程序执行结果如下:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有