自定义PrimeFaces组件无法呈现

时间:2014-12-02 12:19:06

标签: jsf primefaces jboss7.x

我正在编写一组自定义PrimeFaces组件,使用PrimeFaces 5.0并在JBoss EAP 6.2中运行。

我首先要构建一个自定义组件来呈现标准的html <input/>;标签作为概念的初始证明。

我的问题的简短版本:

将我的名称空间定义为st,标记<st:input/>不会呈现<input/>标记... <st:input/> </st:input>

长版:

  1. 我为此设置了两个项目。 PrimeFaces自定义组件集存在于使用NetBeans构建的maven项目中。 jar需要是可再发行的,我将它部署到我的app服务器上。
  2. 第二个项目是自定义组件的展示。

    1. 自定义组件项目按以下方式设置:
    2. faces-config.xml中的

      2.1:

      <faces-config
          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_1.xsd"
          version="2.1">
          <name>myfacestest</name> 
      </faces-config>
      

      2.2在myfacestest.taglib.xml中我定义了我的输入标记:

      <?xml version="1.0"?>
      <facelet-taglib 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-facelettaglibrary_2_0.xsd"
          id="st">
          <namespace>http://org.myfacestest.faces/ui</namespace>
          <tag>
              <tag-name>input</tag-name>
              <component>
                  <component-type>org.myfacestest.faces.Input</component-type>
                  <renderer-type>org.myfacestest.faces.InputRenderer</renderer-type>
              </component>
          </tag>
      </facelet-taglib>
      

      2.3在Input.java(我的自定义组件)中,我执行以下操作:

      @FacesComponent(value = Input.COMPONENT_TYPE)
      @ResourceDependencies(
          {@ResourceDependency(library = "primefaces", name = "jquery/jquery.js"), 
          @ResourceDependency(library = "primefaces", name = "primefaces.js"), 
          @ResourceDependency(library = "myfacestest", name = "input.js"), 
          @ResourceDependency(library = "myfacestest/css", name = "input.css")})
      
          public class Input extends UIInput implements Widget {
              public static final String COMPONENT_TYPE = "org.myfacestest.faces.Input";
              public static final String COMPONENT_FAMILY = "org.myfacestest.faces.components";
      
            public String getFamily() {
                return COMPONENT_FAMILY;
            }
          ...
      

      2.4此组件的渲染器包含以下内容:

      @FacesRenderer(componentFamily = Input.COMPONENT_FAMILY, rendererType = InputRenderer.RENDERER_TYPE)
      public class InputRenderer extends CoreRenderer {
      
          public static final String RENDERER_TYPE = "org.myfacestest.faces.components.InputRenderer";
      
          @Override
          public void decode(FacesContext context, UIComponent component) {
              String submittedValue = (String) context.getExternalContext().getRequestParameterMap().get(component.getClientId(context));
              ((Input) component).setSubmittedValue(submittedValue);
          }
      
          @Override
          public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
              this.encodeMarkup(context, (Input) component);
              this.encodeScript(context, (Input) component);
          }
      
          private void encodeMarkup(FacesContext context, Input input) throws IOException {
              ResponseWriter writer = context.getResponseWriter();
              //Object value = input.getValue() != null ? input.getValue() : 0;
      
              writer.startElement("input", input);
              writer.writeAttribute("id", input.getClientId(), null);
              writer.writeAttribute("name", input.getClientId(), null);
              writer.endElement("input");
          }
      
          private void encodeScript(FacesContext context, Input component) throws IOException {
              String clientId = component.getClientId();
              String widgetVar = component.resolveWidgetVar();
      
              WidgetBuilder wb = getWidgetBuilder(context);
              wb.initWithDomReady("Input", widgetVar, clientId);
              wb.finish();
          }
      ...
      

      2.5由于这个jar作为模块部署在我的应用服务器上,因此我在jboss中的以下文件夹中部署了my-faces-test-0.1.jar(通过Maven POM命名):

      模块/系统/层/基层/组织/ myfacestest /面/主

      我的module.xml中包含以下内容:

      <module xmlns="urn:jboss:module:1.1" name="org.myfacestest.faces">
      <resources>
          <resource-root path="my-faces-test-0.1.jar"/>
      </resources>
      <dependencies>
      </dependencies>
      </module>
      
      1. 我的展示项目按以下方式设置。
      2. 3.1自从我将其部署到我的jboss app服务器后,我在jboss-deployment-structure.xml中添加了以下内容:

        <module name="org.myfacestest.faces"/>
        

        3.2我有一个使用标签的xhtml如下:

        <html lang="en" xmlns="http://www.w3.org/1999/xhtml"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:p="http://primefaces.org/ui"
            xmlns:t="http://myfaces.apache.org/tomahawk"
            xmlns:st="http://org.myfacestest.faces/ui"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            >
        

        3.3在同一文件中,&lt; h:body&gt;内和&lt; h:form&gt;元素:

        <st:input/>
        

        鉴于此设置,为什么自定义组件不会呈现?我的jboss日志中没有任何内容,即使日志记录级别设置为debug。

1 个答案:

答案 0 :(得分:0)

您可以通过将export true标记添加到jboss-deployment-structure.xml

来公开JAR my-faces-test-0.1.jar中的XML配置。

<module name="org.myfacestest.faces" export="true" meta-inf="export"/>这会将依赖关系暴露给EAR / WAR