您的位置:首页 > Web前端 > JavaScript

JSF常见错误总结

2007-01-17 17:31 519 查看
错误目录列表:

※JSF中PropertiesNotFound错误
※使用Tomahawk遇到的ExtensionsFilter not correctly configured.问题
※JSF中的国际化
※Error ListenerStart的问题
※java.lang.ClassCastException错误
※JSCookMenu不能导航的问题
※View中的UIInput组件的值不能传递给Backing Bean,或者EventListener, Action方法没有被执行

JSF中PropertiesNotFound错误:
郁闷了一天了,做一个简单的jsf例子,为了实现国际化,做了一个资源文件application.properties,放在resource package中。
代码片段如下:
<f:view>
<f:loadBundle var="bundle" basename="resources.application"/>
...
<h:outputText value="#{bundle.addperson.head}"/>

每次运行都出现如下错误:
javax.faces.el.PropertyNotFoundException: Error getting property 'head' from bean of type java.lang.String

把value变成Hard String: <h:outputText value="Head"/>问题就没有了。
查了一天的资料,终于发现了解决办法:
改写成:
<h:outputText value="#{bundle['addperson.head']}"/>
就好了,唉,在编写jsf的component时,输完“#{bundle.”之后出现的代码提示就是“['addperson.head']”,当时还以为是有错误,结果发现是自己的错误,郁闷!
经常就是这些诸如:环境搭建问题,或者拼写错误,或者这样那样的低级错误导致了大量时间的浪费。

使用Tomahawk遇到的ExtensionsFilter not correctly configured.问题:
尝试着用了一下Tomahawk的inputTextHelper Component,代码片段如下:
<t:inputTextHelp id="birthday" helpText="#{bundle['welcome.birthday.helpertext']}"/>
结果出现如下错误:
java.lang.IllegalStateException: ExtensionsFilter not correctly configured. JSF mapping
missing. JSF pages not covered. Please see: http://myfaces.apache.org/tomahawk/extensionsFilter.html
按照提示,访问了myfaces的主页,修改了web.xml,结果还是错,没办法,使用Google大法,获得如下解决办法。
修改web.xml,添加代码如下:


 <filter>


  <filter-name>extensionsFilter</filter-name>


  <filter-class>


   org.apache.myfaces.webapp.filter.ExtensionsFilter


  </filter-class>


  <init-param>


   <param-name>maxFileSize</param-name>


   <param-value>20m</param-value>


   <description>


    Set the size limit for uploaded files. Format: 10 - 10


    bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB


   </description>


  </init-param>


 </filter>




 <!-- extension mapping for adding <script/>, <link/>, and other resource tags to JSF-pages  -->


 <filter-mapping>


  <filter-name>extensionsFilter</filter-name>


  <!-- servlet-name must match the name of your javax.faces.webapp.FacesServlet entry -->


  <servlet-name>faces</servlet-name>


 </filter-mapping>




 <!-- extension mapping for serving page-independent resources (javascript, stylesheets, images, etc.)  -->


 <filter-mapping>


  <filter-name>extensionsFilter</filter-name>


  <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>


 </filter-mapping>




 <filter-mapping>


  <filter-name>extensionsFilter</filter-name>


  <url-pattern>*.jsf</url-pattern>


 </filter-mapping> 




 <filter-mapping>


  <filter-name>extensionsFilter</filter-name>


  <url-pattern>*.jsp</url-pattern>


 </filter-mapping> 





原来是myfaces主页上只让添加了
 <filter-mapping>
  <filter-name>extensionsFilter</filter-name>
  <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
 </filter-mapping>
但是系统的配置中却还有*.jsf的url-pattern,所以还需要加上:
 <filter-mapping>
  <filter-name>extensionsFilter</filter-name>
  <url-pattern>*.jsf</url-pattern>
 </filter-mapping> 

 <filter-mapping>
  <filter-name>extensionsFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
 </filter-mapping> 

其中*.jsf是因为在你原来的web.xml中配置Faces Servlet映射如下:
 <servlet-mapping>
  <!-- Faces Servlet Mapping -->
  <servlet-name>faces</servlet-name>
  <url-pattern>*.jsf</url-pattern>
 </servlet-mapping>
如果你还配了/faces/*,那么你还需要添加:
 <filter-mapping>
  <filter-name>extensionsFilter</filter-name>
  <url-pattern>/faces/*</url-pattern>
 </filter-mapping>

JSF中的国际化
以我自己的编程习惯来说,我一般都是将所有的环境都用UTF-8来解决,JSP页面(包括jsp文件本身编码,在IDE工具中设置),数据库中的表,IO转换,只要将这些部分都统一为UTF-8,一般来讲都不会有乱码的问题。
在JSF中(在别的框架中也是一样),可以通过资源文件来解决,分以下几个步骤实现:
1、JSP代码中引入<f:loadBundle >,读入资源文件中对应的变量。
2、对于不同语言的资源文件,命名为不同后缀的文件,比如application_en.properties, application_zh.properties等;
3、然后在face-config.xml中定义如下:
  <application>
    <message-bundle>resources.application</message-bundle>
    <locale-config>
      <default-locale>zh</default-locale>
      <supported-locale>en</supported-locale>
    </locale-config>
  </application>
其中<default-locale/>就是默认的资源文件,注意"zh"就是资源文件的后缀(application_zh.properties)
这样在编程的时候,感觉每次都要指定一个字符串,很麻烦,但是其实是用一次的小麻烦来解决将来的大麻烦,还是值得的。

Error ListenerStart的问题:
Deploy之后,运行,在控制台发现如下错误:
严重: Error listenerStart
2006-11-6 17:05:41 org.apache.catalina.core.StandardContext start
严重: Context [/ptrack] startup failed due to previous errors
之后,不能访问目标WebApp。
问题原因:
在Web.xml中配置有问题,没有正确加载Listener,或者在你的webapp的classpath中,找不到对应的listener对应的jar
解决办法1:
修改web.xml配置如下:
添加:
 <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>
中load-on-startup值为小于零的整数,比如-1。
解决办法二:
在web.xml中添加如下:


 <servlet>


  <servlet-name>HackServlet</servlet-name>


  <servlet-class>org.jia.HackServlet</servlet-class>


  <init-param>


   <param-name>CONFIGURE_LISTENER</param-name>


   <param-value>


    com.sun.faces.config.ConfigureListener


   </param-value>


  </init-param>


  <load-on-startup>1</load-on-startup>


 </servlet>

并将Faces Servlet的load-on-startup值修改为2;
HackServlet.java:


package org.jia;




import org.apache.commons.logging.Log;


import org.apache.commons.logging.LogFactory;




import javax.faces.FactoryFinder;


import javax.faces.lifecycle.LifecycleFactory;


import javax.servlet.ServletConfig;


import javax.servlet.ServletContextEvent;


import javax.servlet.ServletContextListener;


import javax.servlet.ServletException;


import javax.servlet.http.HttpServlet;






public class HackServlet extends HttpServlet ...{




 public static final String CONFIGURE_LISTENER_KEY = "CONFIGURE_LISTENER";




 public static final transient Log logger = LogFactory


   .getLog(HackServlet.class);






 public void init(ServletConfig servletConfig) throws ServletException ...{




  LifecycleFactory factory = (LifecycleFactory) FactoryFinder


    .getFactory(FactoryFinder.LIFECYCLE_FACTORY);




  if (factory != null)


   return;




  String className = servletConfig


    .getInitParameter(CONFIGURE_LISTENER_KEY);






  if (className == null) ...{


   logger.fatal("Did not find the init parameter "


     + CONFIGURE_LISTENER_KEY);


   return;


  }






  try ...{


   Class aClass = Class.forName(className);


   ServletContextListener listener = (ServletContextListener) aClass


     .newInstance();


   listener.contextInitialized(new ServletContextEvent(servletConfig


     .getServletContext()));






  } catch (Exception e) ...{


   logger.fatal("The ConfigureListener could not be triggered", e);


  }


 }


}



 

很奇怪的事情是,如果我只是用Sun RI来实现的话,比如JSF in Action中PTrack的例子,就不会出错,除了会报一个formatter.parse() 日期格式因为Locale的问题而导致的Exception外,没有问题。

java.lang.ClassCastException错误:
Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
javax.faces.FacesException: java.lang.ClassCastException: org.apache.myfaces.application.ApplicationImpl
原因:在libarary中使用了myface实现,但是却还有sun RI的包,只需要把这些重复的包删除掉即可。

JSCookMenu不能导航的问题
使用了JSCookMenu做导航,把菜单放在了一个header.jsp中,main.jsp include header.jsp。
在config文件中,配置了导航规则:


 <navigation-rule>


  <from-view-id>header.jsp</from-view-id>


  <navigation-case>


   <from-outcome>goto_add_relatedness</from-outcome>


   <to-view-id>/add_relatedness.jsp</to-view-id>


  </navigation-case>


 </navigation-rule>

结果在运行时,却怎么也不起作用,后来发现是<from-view-id>header.jsp</from-view-id>在捣鬼,将header.jsp用"*"替换(配置文件中无引号),搞定。

View中的UIInput组件的值不能传递给Backing Bean,或者EventListener, Action方法没有被执行
这个情况的一种可能是你的Backing Bean中用了一个Class类型的property,然后在UIInput的value绑定使用了object.propertyObj.property的方式。
在Backing Bean中的property如果是类时,其getter方法不能简单的return person; 因为这个时候可能person还没有初始化,需要先判断是否为null,if (person == null) person = new Person(); 这样就OK了。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息