【问题标题】:Css Style change with JSF Validation使用 JSF 验证更改 Css 样式
【发布时间】:2009-07-19 20:19:30
【问题描述】:

我正在处理在 JSF 服务器端验证后以红色突出显示失败的字段的要求。没有 javascript 可用于验证。有没有办法将服务器端验证与 css 样式更改联系起来?

【问题讨论】:

    标签: css jsf


    【解决方案1】:

    您可以使用托管 bean 来做到这一点:

    public class ValidBean {
    
      private UIComponent myComponent;
    
      public UIComponent getMyComponent() {
        return myComponent;
      }
    
      public void setMyComponent(UIComponent myComponent) {
        this.myComponent = myComponent;
      }
    
      public String getErrorStyle() {
        FacesContext context = FacesContext
            .getCurrentInstance();
        String clientId = myComponent.getClientId(context);
        Iterator<FacesMessage> messages = context
            .getMessages(clientId);
        while (messages.hasNext()) {
          if (messages.next().getSeverity().compareTo(
              FacesMessage.SEVERITY_ERROR) >= 0) {
            return "background-color: red";
          }
        }
        return null;
      }
    }
    

    请求范围变量:

      <managed-bean>
        <managed-bean-name>validBean</managed-bean-name>
        <managed-bean-class>stylevalid.ValidBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
      </managed-bean>
    

    示例视图:

      <f:view>
        <h:form>
          <h:inputText binding="#{validBean.myComponent}" styleClass="foo"
            style="#{validBean.errorStyle}">
            <f:validateLength minimum="6" />
          </h:inputText>
          <h:commandButton />
          <h:messages />
        </h:form>
      </f:view>
    

    组件绑定到后台bean。如果错误消息已为组件排队,它会使用其样式属性覆盖其 CSS 类设置。

    【讨论】:

    • 您好,这种方法看起来不错,也可以工作,但是将 bean 中的 css 样式注入到 jsp 中,标准做法是 JSF。我的意思是从维护的角度来看,很明显必须在 Java 类中进行更改。如果我想添加另一个样式元素,这是不可能的。现在对我来说不是一个因素,但我只是担心将来会出现任何问题。
    • 动态确定 styleClass 属性可能会更好一些。这样您只需要更改 CSS 文件而不是 Java 类。
    • @Barun - 你是对的;这不是一个理想的解决方案。核心组件往往有点基础。人们期待控制库以获得更丰富的体验。另一种方法是将 errorStyle 设为布尔值并通过函数解析样式值:#{myfn:resolve(validBean.errorStyle, 'szErrStyle', 'szOkStyle')}。这样,您可以减少泄漏到后端的表示层细节。
    • @Drew - 我不确定将 CSS 类名放入 bean 是否比显式样式更好。不过,它当然可以做到。
    • @McDowell 我认为它会好一点,因为它仍然将所有样式规则保留在 CSS 文件中。我可以通过仅编辑 CSS 文件将所有红色文本更改为蓝色文本。另一方面,如果我有很多这样的事情要做,我就不得不编辑一组 java 文件。两者都不是真正理想的,因为您仍然将标记与代码绑定得相当显着。
    【解决方案2】:

    【讨论】:

    • 您好,这个方法看起来不错,但我们在当前项目中没有使用 seam...虽然很遗憾,因为 Seam 结构在很多情况下确实有帮助..
    • 很抱歉听到这个消息。 Seam 确实是 JSF 的杀手级应用。但是,我可以同情,因为我现在正在开发一个不使用 Seam 的 JSF 应用程序,而且我发现通过页面流维护状态很烦人。
    • 这里的状态相同...与维护状态有关的问题...我们将使用 Spring Webflow...但这是另一个主题...
    • 是的。不幸的是,我有一个不太好用的自制系统,但它可以工作,直到我们可以让代码库达到可以开始重构的地步。
    猜你喜欢
    • 2015-02-14
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多