Body attributes (onkeydown, onkeyup…) not rendered after upgrading to Primefaces 5.1, from 4.0

浪子不回头ぞ 提交于 2020-01-03 17:00:53

问题


I have set up a simple maven project with the following dependencies:

<dependencies>
   <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.faces</artifactId>
      <version>2.2.2</version>
   </dependency>
   <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
   </dependency>
   <dependency>
      <groupId>javax.el</groupId>
      <artifactId>javax.el-api</artifactId>
      <version>3.0.1-b04</version>
      <scope>provided</scope>
   </dependency>
   <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2</version>
   </dependency>

   <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>4.3.6.Final</version>
   </dependency>

   <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-c3p0</artifactId>
      <version>4.3.6.Final</version>
   </dependency>

   <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.1.2.Final</version>
   </dependency>

   <dependency>
      <groupId>org.primefaces</groupId>
      <artifactId>primefaces</artifactId>
      <version>5.1</version>
   </dependency>

</dependencies>

And this page:

<?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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:body onkeydown="alert('You pressed some key!')">
    <h:outputLabel value="Hello, young fellows!"/>
</h:body>
</html>

This is the generated html, notice the body tag without methods:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><body><label>Hello, young fellows!</label></body>
</html>

I tried to rollback the primefaces version to 4.0 by changing the dependency version in pom.xml, like this:

<dependency>
   <groupId>org.primefaces</groupId>
   <artifactId>primefaces</artifactId>
   <version>4.0</version>
</dependency>

And then it works as expected:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><body onkeydown="alert('You pressed some key!')"><label>Hello, young fellows!</label></body>
</html>

What is the problem? Is it a bug on PF 5.1 or something else?


回答1:


Starting from 5.0 the h:body has a renderer in PrimeFaces, BodyRenderer.

In the encodeBegin of that renderer an array of attributes is being passed, HTML.BODY_ATTRS.

public static final String[] BODY_ATTRS = {
    "dir",
    "lang",
    "style",
    "onload",
    "onunload"
};

And as you can see that this array for some reason doesn't cover all the actual attributes of the h:body tag, thus some of the attributes are being ignored.

In order to avoid this problem you can simply extend that renderer into a one which accepts all the actual attributes.

public class CustomBodyRenderer extends BodyRenderer{

   //our array with all the attributes of h:body tag
   public static final String[] BODY_ATTRS = {
       "dir",
       "lang",
       "onclick",
       "ondblclick",
       "onkeydown",
       "onkeypress",
       "onkeyup",
       "onmousedown",
       "onmousemove",
       "onmouseout",
       "onmouseover",
       "onmouseup",
       "style",
       "title",
       "onload",
       "onunload"
   };

   @Override
   public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
       ResponseWriter writer = context.getResponseWriter();
       String clientId = component.getClientId(context);
       writer.startElement("body", component);

       if (shouldWriteId(component)) {
           writer.writeAttribute("id", clientId, "id");
       }

       String styleClass = (String) component.getAttributes().get("styleClass");
       if (styleClass != null && styleClass.length() != 0) {
           writer.writeAttribute("class", styleClass, "styleClass");
       }
       //the only changed line from the original renderer
       renderPassThruAttributes(context, component, BODY_ATTRS);
   }

}

Then register it in the faces-config

<render-kit>
    <renderer>
        <component-family>javax.faces.Output</component-family>
        <renderer-type>javax.faces.Body</renderer-type>
        <renderer-class>com.hatemalimam.CustomBodyRenderer</renderer-class>
    </renderer>
</render-kit>

This way you would get the expected outcome in a "minimal" changes.

I have submitted an issue on the tracker.

Update: This has been fixed in PF 5.2.



来源:https://stackoverflow.com/questions/26721555/body-attributes-onkeydown-onkeyup-not-rendered-after-upgrading-to-primefac

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!