jsf常见问题一2007-01-28 13:32※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>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<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: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的包,只需要把这些重复的包删除掉即可。
结果在运行时,却怎么也不起作用,后来发现是<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了。
发完上面那个帖子,我再认真看了一下文章还有源程序,恍然大悟,早两天一直在看backingbean,没有看配置文件。现在把成果公开出来:
假如你的地址是:a.jsf?productId=123
那么你的bean配置文件应该有下面:
<managed-property>
<property-name>id</property-name>
<value>#{param.productId}</value>
</managed-property>
id就是你要传递到的变量。#{param.productId}就是来源,如上。
其次在你的bean里面要有setId这个方法来获得。
具体的<managed-bean>如下:
<managed-bean>
<description>
Backing bean that contains product information.
</description>
<managed-bean-name>productBean</managed-bean-name>
<managed-bean-class>catalog.view.bean.ProductBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>id</property-name>
<value>#{param.productId}</value>
</managed-property>
<managed-property>
<property-name>serviceLocator</property-name>
<value>#{serviceLocatorBean}</value>
</managed-property>
</managed-bean>
分享到:
相关推荐
在实际应用中,大文件上传是一个常见的需求,例如用户可能需要上传视频、大型文档或者数据库备份等。然而,由于HTTP协议本身的限制,传统的文件上传方式可能会遇到问题,如超时或内存溢出。 为了实现JSF的大文件...
1. **组件模型**:JSF的核心是其组件树,它由一系列可重用的UI组件组成,如按钮、文本框和表格。这些组件可以组合在一起,形成复杂的用户界面。每个组件都有一个与之关联的事件模型和状态管理机制。 2. **视图...
JSF 1.2是该框架的一个重要版本,它在JSF 1.1的基础上进行了一系列的改进和增强,提升了开发效率和应用性能。本文将深入探讨JSF 1.2的核心概念、特性以及如何在实际项目中应用这些知识。 ### 1. JSF框架概述 JSF...
在JavaServer Faces (JSF)框架中,实现文件下载功能是一项常见的需求。在本文中,我们将深入探讨如何使用JSF来实现在Web应用程序中下载文件的功能。主要涉及的关键知识点包括: 1. **JSF上下文环境获取**: 在`...
- 阐述如何调试JSF应用,解决常见问题,并进行性能优化。 总结:《JSF实战》一书全面覆盖了JSF技术的各个方面,从基础概念到高级特性的应用,旨在帮助读者快速掌握并熟练运用JSF进行Web开发。通过阅读本书,开发者...
`jstl.jar`和`javax.servlet.jsp.jstl.jar`提供了JSTL库,包含了一系列用于处理常见任务的标签,如条件判断、迭代、国际化等,与JSF结合使用可以增强视图的可读性和维护性。 9. **其他辅助库**: 为了支持一些...
通过阅读`jsf-doc`,开发者可以获得对JSF概念的深入了解,学习如何配置JSF应用,以及如何解决常见问题。 #### JSF 1.2 的核心概念与特性 - **组件模型**:JSF 1.2基于组件模型,允许开发者组合和定制UI组件。`...
在JSF中,用户登录界面是常见的功能模块,用于验证用户的身份。下面将详细讲解如何在JSF中创建一个用户登录界面。 1. **JSF架构简述** JSF是一种组件化的MVC(Model-View-Controller)框架,它提供了丰富的UI组件...
Seam 是一个为 JSF 提供增强功能的框架,它能够无缝地与 JSF 集成,并且不仅仅局限于 EJB3 和 JBoss 平台。通过添加 Seam 的 Phase Listener,可以显著增强 JSF 生命周期中的异常处理能力。即使不使用 Seam 的其他...
2. **JSF请求生成JSF响应**:这是最常见的场景,当用户通过JSF组件提交表单时,请求会映射到JSF实现的控制器,然后按生命周期的顺序执行,包括解析请求参数、更新模型值、执行验证和事件处理等。 **生命周期情景** ...
**JSF(JavaServer Faces)** 是一种Java技术,用于构建Web应用程序,特别是那些具有用户界面的交互式应用。JSF提供了一种组件模型,使得开发者可以使用预定义的UI组件来构建页面,同时它还提供了事件处理和数据绑定...
Java EE 5.0是其中的一个版本,它引入了JSF 1.x,简化了MVC(模型-视图-控制器)架构的实现,同时增强了对Ajax的支持,使得开发者可以构建更加动态和响应式的Web应用。 在实际开发中,这四个JAR文件通常会被添加到...
在JavaServer Faces (JSF)框架中,分页是一种常见的需求,特别是在处理大量数据时,以提高用户体验并优化页面加载速度。"JSF经典的js分页"是一个示例,展示了如何在JSF应用中实现纯JavaScript(js)的分页功能。这个...
然而,在学习和使用JSF的过程中,新手经常会遇到各种问题,其中一种常见的异常就是`javax.servlet.jsp.JspException: Cannot find FacesContext`。 #### 二、异常分析 当出现`javax.servlet.jsp.JspException: ...
2. **jsf-api.jar**:JSF(JavaServer Faces)是Java EE中的一个用户界面组件模型,用于构建富互联网应用程序(RIA)。API JAR文件包含JSF的公共接口和类,允许开发者在应用程序中引用和使用JSF的功能,如创建可重用...
JSF应用中常见的问题可能涉及视图状态管理、EL表达式错误、转换和验证问题等。 这个"jsf 最简单的eclipse工程例子"应该会展示如何从零开始搭建一个基本的JSF应用,包括创建页面、编写Managed Bean和进行交互。对于...