我用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中运行?
答案 0 :(得分:1)
这是一个JSP标记。 JSP在JSF 2.0中已弃用,并由Facelets(XHTML)继承。你确实使用Facelets而不是JSP。只有在将JSF2与遗留JSP而不是Facelets一起使用时,您的组件才会起作用。您需要将旧的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
:将其删除altogher。 Facelets不需要它。
UITicker.java
:在课堂上添加以下注释(这会替换<component>
中的faces-config.xml
条目)
@FacesComponent("ticker")
public class UITicker extends UIOutput {
(注意:注释值必须与taglib XML文件中的<component-type>
匹配,而不是<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文件提供并且在JAR的.taglib.xml
中有/META-INF
文件时,这是不必要的 < / p>
在阅读/学习有关JSF的内容时,请确保您正在阅读针对JSF2的正确教程/资源,而不是针对JSF1的教程/资源。许多事情都有不同的做法。