提问者:小点点

如何使用注释而不是XML在嵌入式Tomcat中创建自定义组件标记


更新#2:按照BalusC的想法,我将我的示例自定义组件移植到一个准系统Servlet 3.1JSF 2.2应用程序中。您可以在Github上找到它的代码。

这个简单的例子并没有展示我在这里描述的问题。@FacesComponent注释有效。这在很大程度上暗示了问题是由Spring 4.1.2Spring Boot本身引起的。时间不早了,所以我明天会进一步调查这个问题。

太长别读:我想用@FacesComponent和它的属性来代替funding-coments-html. taglib.xml

我目前在我的项目中有使用XML定义的自定义组件。我最近了解到JSF 2.2引入了一个功能,它完全消除了对XML的需求。我很想使用这个,但是当我纯粹使用注释时,它们被JSF忽略了。原始标记显示在我的超文本标记语言中。

(即<代码>

我已经在Github上的一个沙盒中演示了这个问题。如果你想尝试一下,我会在这篇文章的底部解释如何。

您需要做的就是删除building-coments-html. taglib.xml,并注释掉faces-config.xml条目

使用的技术:

>

  • Spring启动1.2.1

    JSF 2.2通过Mojarra 2.2.6

    嵌入式Tomcat 8.0.5

    注意:请记住,此设置当前有效,但它运行在taglib和faces-config条目上!我的问题是如何使用JSF 2.2中的最新功能删除这些依赖项

    完整项目

    自定义组件

    package foundation.components;
    
    import java.io.IOException;
    
    import javax.faces.component.FacesComponent;
    
    import javax.faces.component.UIComponentBase;
    import javax.faces.context.FacesContext;
    import javax.faces.context.ResponseWriter;
    
    /**
     * The Paragraph Component
     * @author Seth Ellison
     */
    @FacesComponent(value=UIParagraph.COMPONENT_TYPE, createTag=true, tagName="paragraph", namespace="http://www.blah.com/components/html")
    public class UIParagraph extends UIComponentBase {
    
    public static final String COMPONENT_TYPE = "foundation.components.Paragraph";
    
    private String value;
    private String styleClass;
    
    @Override
    public void encodeBegin(final FacesContext facesContext) throws IOException {
    
        // Encode Implementation Omitted for Brevity. 
    }
    
    @Override
    public String getFamily() {        
        return "blah.components.family";
    }
    
    // Getters/Setters...
    
    }
    

    Taglib定义

    <facelet-taglib version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
    
        <namespace>http://www.blah.com/components/html</namespace>
    
        <tag>
            <tag-name>paragraph</tag-name>
            <component>
                <component-type>foundation.components.Paragraph</component-type>
            </component>
        </tag>
    </facelet-taglib>
    

    面部配置

    <faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"             
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
            version="2.2" metadata-complete="false">
    
        <component>
            <component-type>foundation.components.Paragraph</component-type>
            <component-class>foundation.components.UIParagraph</component-class>
        </component>  
    </faces-config>
    

    XHTML模板(为了清晰起见而剥离)

    <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:jsf="http://xmlns.jcp.org/jsf"
      xmlns:custom="http://www.blah.com/components/html">
    
        <head jsf:id="head"></head>
        <body jsf:id="body">
           <custom:paragraph value="This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique." />
        </body>
    </html>
    

    如果你想运行它,最简单的方法是下载Spring Tool Suite,从Github获取代码,右键单击项目,然后将其作为Spring Boot应用程序运行。当JPA配置启动时,你会收到连接错误,因为你(可能)没有运行本地MySQL服务器。不要担心这个。访问索引页面和查看标签状态根本不需要。我经常在没有DB的情况下运行应用程序,不会产生不良影响。最后,要让PRETYFaces在Spring Boot中发挥出色,您必须创建一个符号链接或一个从目标/类到WEB-INF/的硬链接——在扫描注释时,PRETYFaces被编码为在WEB-INF/类或WEB-INF/lib中查找。

    此函数存在于标记为@Configuration并实现ServletContextAware的类中

    @Bean
    public ServletListenerRegistrationBean<ConfigureListener> jsfConfigureListener() {
        return new ServletListenerRegistrationBean<ConfigureListener>(
                new ConfigureListener());
    }
    

  • 共1个答案

    匿名用户

    好吧,我知道是什么导致了这个问题。

    今天早上我坐下来思考我的工作Servlet 3.1版本的代码和损坏的Spring Boot版本之间的差异。主要区别在于代码的运行方式。嵌入式服务器与独立服务器。

    Spring Boot的嵌入式Tomcat服务器是原因。

    当我按照这个答案切换沙盒时,一切都正常开启,我的自定义组件完全脱离了@FacesComponent注释!

    我认为这与嵌入式服务器上启动后类的组织方式有关,而不是离散部署到Pivotal Tomcat服务器。在这种情况下,JSF的注释扫描器似乎只是忽略注释。