文档章节

开发自定义JSF组件(5) 在JSP中用JSF组件

zhuzhiou
 zhuzhiou
发布于 2013/05/27 22:01
字数 851
阅读 828
收藏 4

完整的教材:

  1. 开发自定义JSF组件(1) HelloWorld

  2. 开发自定义JSF组件(2) 使用Render渲染器

  3. 开发自定义JSF组件(3) 使用绑定变量

  4. 开发自定义JSF组件(4) 保存状态与恢复状态

  5. 开发自定义JSF组件(5) 在JSP中用JSF组件

采用JSF架构的应用,也有很多项目是使用jsp而不是facelets。如果要在JSP里使用JSF组件,还得编写jsp的标签库,不过与JSP标签又不尽相同,下面我再次重构HelloWorld项目,看看JSP页面如何使用<ida:hellWorld />标签。

开发环境:

  • Windows 7

  • IntelliJ IDEA 12.1.2

  • jboss-6.1.0.Final

  • JSF 1.2

HelloWorld的 重构过程:

1、新建HelloWorldTag,JSF1.2继承UIComponentELTag,网上很多教材都是JSF1.1版本的,继承的是UIComponentTag,这个类在JSF1.2已过时。

public class HelloWorldTag extends UIComponentELTag {
    private static final String COMPONENT_TYPE = "com.regaltec.faces.HelloWorld";

    private static final String RENDERER_TYPE = "com.regaltec.faces.render.HelloWorld";

    private ValueExpression name;

    public ValueExpression getName() {
        return name;
    }

    public void setName(ValueExpression name) {
        this.name = name;
    }

    @Override
    protected void setProperties(UIComponent component) {
        super.setProperties(component);
        component.setValueExpression("name", name);
    }

    @Override
    public void release() {
        super.release();
        name = null;
    }

    @Override
    public String getComponentType() {
        return COMPONENT_TYPE;
    }

    @Override
    public String getRendererType() {
        return RENDERER_TYPE;
    }
}

HelloWorldTag的属性与UIHelloWorld类似,事实上HelloWorldTag在这里只是做一个适配。HelloWorldTag必须重载setProperties、getComponentType、getRendererType这3个方法,getComponentType、getRendererType这2个方法用来确定一个视图渲染器,而setProperties方法就是将tag里的属性转换UIComponent组件中了。

注:使用a4j的reRender时,是不会调HelloWorldTag这个类的,这跟jsf生命周期有关。

2、在WEB-INF目录下新建uicomponent.tld,这是JSP标签库描述文件。

<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1">
    <tlib-version>1.0</tlib-version>
    <short-name>ida</short-name>
    <uri>http://www.regaltec.com/ida40</uri>
    <tag>
        <name>helloWorld</name>
        <tag-class>com.regaltec.faces.taglib.HelloWorldTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>name</name>
            <required>false</required>
            <deferred-value>
                <type>java.lang.String</type>
            </deferred-value>
        </attribute>
    </tag>
</taglib>

3、就这样我们就完成重构工作了,但重构前我们的web应用都是跑facelets页面的,为了跑jsp页面,还得重新配置web.xml及faces-config.xml这2个文件。

删除web.xml的facelets配置

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>
<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/WEB-INF/uicomponent.taglib.xml</param-value>
</context-param>

删除faces-config.xml的facelets配置

<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>

4、新建jsp页面进行测试,这里简单的将helloWorld.xhtml转换为helloWorld.jsp页面。

<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j" %>
<%@ taglib prefix="ida" uri="http://www.regaltec.com/ida40" %>
<html>
<f:view>
<head>
    <title>Hello World JSP</title>
</head>
<body>
    <a4j:form>
        <h:panelGrid columns="3">
            <h:outputText value="姓名:" />
            <h:inputText value="#{helloWorldBean.name}" />
            <a4j:commandButton value="确定" reRender="out" />
        </h:panelGrid>
    </a4j:form>
    <h:panelGroup id="out">
        <ida:helloWorld name="#{helloWorldBean.name}" />
    </h:panelGroup>
</body>
</f:view>
</html>

启动jboss打开应用,如下图,在文本输入框里敲入世界点击确定,文本框下方显示 你好,世界!

以上代码在jboss-6.1.0.Final调试通过,感谢百度云网盘提供源码下载

© 著作权归作者所有

共有 人打赏支持
zhuzhiou
粉丝 5
博文 9
码字总数 8126
作品 0
广州
技术主管
私信 提问
开发自定义JSF组件(1) HelloWorld

完整的教材: 开发自定义JSF组件(1) HelloWorld 开发自定义JSF组件(2) 使用Render渲染器 开发自定义JSF组件(3) 使用绑定变量 开发自定义JSF组件(4) 保存状态与恢复状态 开发自定义JSF组件(5)...

zhuzhiou
2013/05/19
0
7
JSF学习入门实例之hello world版

JSF学习入门实例之hello world版,JSF 以MVC 模式为基 础 ,与 Struts 不同, JSF 的目标 是希望以一个与Swing 相类似的方式来开发网页 ,因此,从 JSF 的 结 构 图 当中,他的核心概念不是页...

李强s
2011/06/05
0
0
使用技巧:怎样提高J2EE项目的开发速度

在J2EE技术体系中,往往被灌输了太多容器的概念,什么EJB容器、Servlet容器等等,而开发过程也在开发、配置、部署之间迭代与反复;如此一来常会出现令人尴尬的状况:往往花几分钟时间去改一个...

宇见未来
2012/11/25
0
0
JSF2.1 代码示例(包含国际化,类型转换,验证器,监听器等)

JSF2.1 代码示例(包含国际化,类型转换,验证器,监听器等) 自己做的一个登录的例子,涵盖了jsf中的国际化,类型转换,验证器,监听器等 学了jsf1.2的流程 ,现在该学jsf2.1了, 废话少说,上...

满风
2012/07/18
0
2
用NetBeans6.x开发VJF程序

用NetBenas6.X开发Visual Web JSF程序 在JSF Summary文章中,我们用一个Login页面的例子介绍了如何用NetBeans6.1和JSF1.2开发Web程序。这个例子中,我们将使用(并推荐)用Visual Web JSF来进...

长平狐
2012/08/28
60
0

没有更多内容

加载失败,请刷新页面

加载更多

前端工程师的知识体系

Front-End Engineer 这词很好的体现了前端的特(ku)殊(bi)性。 下图是张克军绘制的前端工程师图解: 前端开发的核心是HTML + CSS + JavaScript。本质上它们构成一个MVC框架,即HTML作为信息模...

文文1
3分钟前
0
0
随行付微服务测试之性能测试

背景 传统性能测试更多的是以事务为核心,更多的是由单个或者多个事务构成业务场景进行压测。全链路压测指完全引入相关联的系统,尽量真实模拟线上硬件环境,更多的是以请求为核心,完全模拟...

马力-随行付
6分钟前
0
0
JavaScript是如何工作的:事件循环和异步编程的崛起 + 5种使用 async/await 更好地编码方式!

摘要: 深度理解JS事件循环!!! 原文:JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式! 作者:前端小智 Fundebug经授权转载,版权归原作者所有。...

Fundebug
6分钟前
0
0
hanlp在Python环境中的安装失败后的解决方法

Hanlp是由一系列模型与算法组成的javag工具包,目标是普及自然语言处理再生环境中的应用。有很多人在安装hanlp的时候会遇到安装失败的情况,下面就是某大神的分享的在python环境中安装失败的...

左手的倒影
28分钟前
1
0
【更新】Infragistics Ultimate UI for WPF v18.2(二):分类图

下载Infragistics Ultimate UI for WPF最新版本 Infragistics Ultimate UI for WPF是一款提供高速的网格和图表,轻松创建仿Office应用程序的WPF界面框架,从广度和深度两方面使得开发者在缩短...

电池盒
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部