JSF2自定义组件编程系列 第一部分

本文详细介绍了在JSF2环境中创建自定义UI组件的过程,包括Maven项目搭建、配置文件编写、UIComponent类实现及在应用中的部署与使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 

序言

  本文起因是因为使用PrimeFaces,既惊叹于炫酷的各种UI Components,又因为遇到困难但是社区很少支持而苦恼。回想使用JSF的这些年,从ICEFaces到PrimeFaces,JSF的开源社区都忙于商业支持,而很少对free的用户进行友好及时的支持。
  <<The Complete Reference-Java Server Faces2.0>>一书提到如果有别人已经造好的车轮子,就没有必要自己造车轮。是的,一般情况下,都是这样。但是在JSF的世界里,在我们很难获得开源社区的支持的现实下,自己制造车轮子,一方面为了自己用,另一方面也是为了更好的理解JSF和其他开源库,第三方的JSF库有问题自己能够解决,而不必依赖别人。
  本文所有代码采用技术:Maven3,Emacs和JDEE(你也可以使用其他文本编辑器如VI),JSF选用标准实现Mojarra 2.0.3-b03,GlassFishV3.0.1,在UBuntu10.10下开发。
  本文参考资料主要来自<<The Complete Reference-Java Server Faces2.0>>一书,以及http://www.mkyong.com/jsf2/custom-tags-in-jsf-2-0

说明

  为了和主流JSF的术语一致,有些我采用英文而不翻译。
UIComponent                 JSF tag后台对应的类
UI Component                JSF tag以及后台对应的所有类和配置文件形成的整体
Composite Component    JSF2提供了Composite Component的创建方法,避免了通过Java代码生成html标记的繁琐,只需要基于现有的JSF tag进行组合即可。但是为了学习JSF的内部机制,还是很有必要编写传统的Non Composite Component。

第一部分 简单的Noncomposite Component

运行mvn archetype:generate 出现很多jsf的模板工程选择,但是没有一个是我很满意的,所以只能自己创建一个简单的jar包项目。
mvn archetype:generate -DgroupId=com.freebird -DartifactId=jsfex -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
好,现在Maven创建了一个工程,目录为jsfex,我修改pom.xml如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.freebird</groupId>
  <artifactId>jsfex</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>jsfex</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-web-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>0.9.27</version>
    </dependency>
  </dependencies>
</project>

注意,在src/main/resources/建立META-INF目录,把helloworld.taglib.xml文件放在里面,打包的时候会自动放到target目录下jar文件内的META-INF目录下面。helloworld.taglib.xm文件内容:
<?xml version='1.0' encoding='UTF-8'?>
<facelet-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-facelettaglibrary_2_0.xsd" version="2.0">
  <namespace>http://com.freebird/jsfex</namespace>
  <tag>
    <tag-name>helloworld</tag-name>
    <component>
      <component-type>HtmlHelloWorld</component-type>
    </component>
  </tag>
</facelet-taglib>

再放入faces-config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<faces-config version="2.0" 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-facesconfig_2_0.xsd">
  <component>
    <component-type>HtmlHelloWorld</component-type>
    <component-class>com.freebird.component.HtmlHelloWorld</component-class>
  </component>
</faces-config>

据说annotation可以避免在faces-config.xml文件中配置compoent信息,但是我只在代码写在web应用程序中的时候成功过,当将我的tag独立打包的时候,总是提示找不到类。这个解决方案可能通过下面这篇文章解决,我没有试过,提供一个URL地址:
http://ocpsoft.com/opensource/create-common-facelets-jar/

现在实现UIComponent类,代码如下:

package com.freebird.component;

import javax.faces.component.UIComponentBase;
import javax.faces.context.ResponseWriter;
import java.io.IOException;
import javax.faces.context.FacesContext;
import java.util.Date;

/**
  * Describe class HtmlHelloWorld here.
  *
  *
  * Created: Mon Dec 27 14:39:47 2010
  *
  * @author <a href="mailto:chenshu@csdesktop">chenshu</a>
  * @version 1.0
  /
public class HtmlHelloWorld extends UIComponentBase {

  @Override
  public String getFamily() {
    return null;
  }

  @Override
  public void encodeAll(FacesContext context) throws IOException {
    ResponseWriter writer = context.getResponseWriter();
    writer.startElement("div", this);
    writer.writeAttribute("style", "color : red", null );
    writer.writeText("HelloWorld! today is: " + new java.util.Date(), null);
    writer.endElement("div");
  }

}



好了,现在把这个jar包放到一个JSF2的应用中试试看。这里不再介绍如何编写JSF2应用程序,已经超出本文范围。用Maven编写一个JSF2的应用程序又需要不少步骤,因为我没有发现我喜欢的模板,得自己从头定制,我使用的是PrimeFaces,MyBatis,将来还要用Spring3.会在另外的文章中介绍。
首先注册自己的jar包,用如下命令:
mvn clean install
mvn install:install-file -Dfile=target/jsfex-1.0.jar -DgroupId=com.freebird -DartifactId=jsfex -Dversion=1.0 -Dpackaging=jar

在需要使用的web应用程序中只需要在pom.xml中加入下面的配置:
    <dependency>
      <groupId>com.freebird</groupId>
      <artifactId>jsfex</artifactId>
      <version>1.0</version>
    </dependency>

facelets页面上如下使用:
<html...
xmlns:cs="http://com.freebird/jsfex"/>
...
<h:form>
  ...
  <cs:helloworld/>
  ...
</h:form>

编译web程序部署后,页面显示效果:
HelloWorld! today is: Mon Dec 27 20:06:10 CST 2010

 

未完,待续

 

 


 

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在机器人技术中,轨迹规划是实现机器人从一个位置平稳高效移动到另一个位置的核心环节。本资源提供了一套基于 MATLAB 的机器人轨迹规划程序,涵盖了关节空间和笛卡尔空间两种规划方式。MATLAB 是一种强大的数值计算与可视化工具,凭借其灵活易用的特点,常被用于机器人控制算法的开发与仿真。 关节空间轨迹规划主要关注机器人各关节角度的变化,生成从初始配置到目标配置的连续路径。其关键知识点包括: 关节变量:指机器人各关节的旋转角度或伸缩长度。 运动学逆解:通过数学方法从末端执行器的目标位置反推关节变量。 路径平滑:确保关节变量轨迹连续且无抖动,常用方法有 S 型曲线拟合、多项式插值等。 速度和加速度限制:考虑关节的实际物理限制,确保轨迹在允许的动态范围内。 碰撞避免:在规划过程中避免关节与其他物体发生碰撞。 笛卡尔空间轨迹规划直接处理机器人末端执行器在工作空间中的位置和姿态变化,涉及以下内容: 工作空间:机器人可到达的所有三维空间点的集合。 路径规划:在工作空间中找到一条从起点到终点的无碰撞路径。 障碍物表示:采用二维或三维网格、Voronoi 图、Octree 等数据结构表示工作空间中的障碍物。 轨迹生成:通过样条曲线、直线插值等方法生成平滑路径。 实时更新:在规划过程中实时检测并避开新出现的障碍物。 在 MATLAB 中实现上述规划方法,可以借助其内置函数和工具箱: 优化工具箱:用于解决运动学逆解和路径规划中的优化问题。 Simulink:可视化建模环境,适合构建和仿真复杂的控制系统。 ODE 求解器:如 ode45,用于求解机器人动力学方程和轨迹执行过程中的运动学问题。 在实际应用中,通常会结合关节空间和笛卡尔空间的规划方法。先在关节空间生成平滑轨迹,再通过运动学正解将关节轨迹转换为笛卡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值