1

JSF1を使用して単純なカスタムコンポーネントを作成しましたが、正常に動作します。しかし、JSF2で使用すると、機能しません。これが私がそれを使う方法です:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:d="http://jsftutorials.com/"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
    <h:body>
        <f:view>
          <d:ticker>Hello World!</d:ticker>
        </f:view>
    </h:body>
</html>

JSF1のコンポーネントの作成方法は次のとおりです。

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<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_0.xsd"
    version="2.0">
    <component>
        <component-type>ticker</component-type>
        <component-class>ticker.UITicker</component-class>
    </component>
</faces-config>

ticker.tld

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
                          "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>d</short-name>
    <uri>http://jsftutorials.com/</uri>
    <tag>
        <name>ticker</name>
        <tag-class>ticker.TickerTag</tag-class>
        <body-content>JSP</body-content>
    </tag>
</taglib>

TickerTag.java

package ticker;

import javax.faces.component.UIComponent;
import javax.faces.webapp.UIComponentTag;

@SuppressWarnings("deprecation")
public class TickerTag extends UIComponentTag {

    public void release() {
        super.release();
    }

    protected void setProperties(UIComponent component) {
        super.setProperties(component);

    }

    public String getComponentType() {
        return "ticker";
    }

    public String getRendererType() {
        return null;
    }
}

UITicker.java

package ticker;

import java.io.IOException;

import javax.faces.component.UIOutput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

public class UITicker extends UIOutput {

    public void encodeBegin(FacesContext context) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        writer.startElement("div", this);
    }

    public void encodeEnd(FacesContext context) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        writer.endElement("div");
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name></display-name>

    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>/WEB-INF/faces-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
</web-app>

JSF2で機能させるには、何を変更する必要がありますか?

4

1 に答える 1

1

それがJSPタグです。JSP は JSF 2.0 で非推奨になり、Facelets (XHTML) に引き継がれました。JSP の代わりに Facelets を実際に使用しています。コンポーネントは、Facelets の代わりにレガシー JSP で JSF2 を使用している場合にのみ機能します。古い JSP タグを Facelets タグに変更する必要があります。

必要な変更は次のとおりです。

  • faces-config.xml<component>: を完全に削除します。

  • ticker.tld: 名前を変更しticker.taglib.xml、コンテンツを次のように置き換えます。

    <?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://jsftutorials.com</namespace>
        <tag>
            <tag-name>ticker</tag-name>
            <component>
                <component-type>ticker</component-type>
            </component>
        </tag>
    </facelet-taglib>
    
  • TickerTag.java: まとめて削除します。Faceletsには必要ありません。

  • UITicker.java: クラスに次の注釈を追加します (これにより、 の<component>エントリが置き換えられますfaces-config.xml) 。

    @FacesComponent("ticker")
    public class UITicker extends UIOutput {
    

    (注: 注釈値は<component-type>、taglib XML ファイルで一致する必要があります。 ではありません<tag-name>)

    UIOutputデフォルトではテキストの子を許可しないため、コンポーネントを表すのは基本的に間違った選択です<div>。むしろ伸ばしUIPanelたほうがいい。

    @FacesComponent("ticker")
    public class UITicker extends UIPanel {
    

    (標準<h:panelGroup layout="block">コンポーネントはすでにその<div>ようにレンダリングされていることに注意してください。あなたがJSFを学んでいることは理解していますが、divをレンダリングするJSFコンポーネントを本当に探している場合に備えて確認してください)

  • web.xml: 次のコンテキスト パラメータを追加します。

    <context-param>
        <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
        <param-value>/WEB-INF/ticker.taglib.xml</param-value>
    </context-param>
    

    /WEB-INF/lib(注: taglib を JAR ファイルとして提供し、その.taglib.xmlファイルを JAR に含める場合、これは不要です/META-INF)

JSF について何かを読んだり学んだりするときは、JSF1 を対象としたものではなく、JSF2 を対象とした適切なチュートリアル/リソースを読んでいることを確認してください。多くの、多くのことが異なって行われています。

以下も参照してください。

于 2013-01-02T14:19:23.290 に答える