我认为t:message是Tomahawk control。
也许一个自定义的JSF控件可以满足账单 - 有时你不能操纵现有的标签来获得你想要的确切输出。
您可以从FacesContext获取消息。控件的渲染器的HTML写入页面:
package custom; /*imports omitted*/
public class CustomErrorRenderer extends Renderer {
@Override @SuppressWarnings("unchecked")
public void encodeEnd(FacesContext context,
UIComponent component) throws IOException {
ResponseWriter writer = context.getResponseWriter();
writer.startElement("div", component);
writer.writeAttribute("id", component.getClientId(context), "id");
writer.writeAttribute("style", "color: red", null);
writer.startElement("ul", null);
Iterator<String> clientIds = context.getClientIdsWithMessages();
while (clientIds.hasNext()) {
String clientId = clientIds.next();
Iterator<FacesMessage> messages = context.getMessages(clientId);
if (!messages.hasNext()) { continue; }
String javaScript = "var field = document.getElementById('"
+ clientId + "');" + "if(field == null) return false;"
+ "field.focus(); return false;";
writer.startElement("li", null);
writer.startElement("a", null);
writer.writeAttribute("onclick", javaScript, null);
writer.writeAttribute("href", "#", null);
while (messages.hasNext()) {
writer.writeText(messages.next().getSummary(), null);
}
writer.endElement("a");
writer.endElement("li");
}
writer.endElement("ul");
writer.endElement("div");
}
}
此渲染器faces-config.xml中定义:
<render-kit>
<description>add to base HTML_BASIC renderkit</description>
<display-name>HTML_BASIC</display-name>
<render-kit-id>HTML_BASIC</render-kit-id>
<renderer>
<display-name>CustomErrorRenderer</display-name>
<component-family>javax.faces.Output</component-family>
<renderer-type>custom.CustomErrorRenderer</renderer-type>
<renderer-class>custom.CustomErrorRenderer</renderer-class>
</renderer>
</render-kit>
由于样品组件不需要任何特殊属性或逻辑,它可以使用现有的UIOutput组件定义:
<component>
<display-name>CustomErrorMessages</display-name>
<component-type>custom.Errors</component-type>
<component-class>javax.faces.component.UIOutput</component-class>
</component>
要集成使用JSP的控制,你还需要提供一个标签类:
package custom;
import javax.faces.webapp.UIComponentELTag;
public class CustomErrorTag extends UIComponentELTag {
@Override
public String getComponentType() {
return "custom.Errors";
}
@Override
public String getRendererType() {
return "custom.CustomErrorRenderer";
}
}
这是在TLD文件中定义:
<?xml version="1.0" encoding="UTF-8"?>
<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-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>custom</short-name>
<uri>http://custom</uri>
<tag>
<name>errors</name>
<tag-class>custom.CustomErrorTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
如果您想通过一个单独的页面,包括这个,这个样本JSP保持控制:
<%@ taglib prefix="custom" uri="http://custom"%>
<custom:errors />
这个JSP包括它:
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%><%@taglib
uri="http://java.sun.com/jsf/core" prefix="f"%>
<html>
<body>
<f:view>
<h:form>
<h:inputText>
<f:validateLength minimum="6" maximum="10" />
</h:inputText>
<h:inputText>
<f:validateLength minimum="4" maximum="6" />
</h:inputText>
<h:commandButton />
</h:form>
<f:subview id="errs">
<jsp:include page="customerrors2_inc.jsp" />
</f:subview>
</f:view>
</body>
</html>
是的,这一切似乎都太复杂了,但至少你可以用它来创建一个带有可重用自定义控件的JAR,这个控件可以放到任何JSF应用程序中。
您可能可以使用托管bean和重复控件获得类似的结果,但是您必须开始担心延迟列表创建,直到验证阶段(可能涉及阶段侦听器)之后。
感谢您的时间。这段代码很好用。但是如果我在我的更新表单中添加一些验证并单击我的更新方法,那么会给我带有超链接的错误(这是我想要的),但是同时它清除了我更新表单的所有vaue 。例如,如果有20个更新输入字段,则清除所有这些字段。 但是,如果我用替换,然而它会给出类似的错误,但表单不会被清除。 你能解决这个问题吗? 谢谢 –
user122591
2009-07-22 23:25:26