2009-07-19 100 views
1

我只是想知道是否可以在单独的jsp片段上显示错误。在jsf片段中显示错误<t:message>标签

我有一个要求,其中我必须显示的超链接的错误(即,点击任何错误将集中于相应的输入字段)

例如,如果我有一个表格,并有20个字段,那么我想到使用20次< t:留言>标签。我知道我可以使用单个< t:邮件>标记所有错误,但我有一个要求集中个别字段,我不知道我们如何使用< t:邮件>执行此操作。然而,从< t的onclick事件:消息>标签解决了我的问题,但使用20个标签在标题下留下大的空间,页面看起来不太好。

所以我想我是否可以把所有的错误标签放在单独的jsf片段上,然后在主页面上做jsp include。

我试过了,但没有显示错误信息。

有没有任何机构有任何想法,我该如何做到这一点?

回答

2

我认为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和重复控件获得类似的结果,但是您必须开始担心延迟列表创建,直到验证阶段(可能涉及阶段侦听器)之后。

+0

感谢您的时间。这段代码很好用。但是如果我在我的更新表单中添加一些验证并单击我的更新方法,那么会给我带有超链接的错误(这是我想要的),但是同时它清除了我更新表单的所有vaue 。例如,如果有20个更新输入字段,则清除所有这些字段。 但是,如果我用替换,然而它会给出类似的错误,但表单不会被清除。 你能解决这个问题吗? 谢谢 – user122591 2009-07-22 23:25:26