jsf常见问题

※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> 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 JSF 中上传和播放视频,您可以使用以下步骤: 1. 上传视频:使用 JSF 内置的 `h:inputFile` 组件上传视频文件。例如: ``` <h:form enctype="multipart/form-data"> <h:inputFile value="#{bean.video}" /> <h:commandButton value="Upload" action="#{bean.uploadVideo}" /> </h:form> ``` 其中,`value` 属性绑定到一个 `Video` 对象,`uploadVideo` 方法将视频文件保存到服务器上。 2. 存储视频:在 `uploadVideo` 方法中,使用 Java I/O 将视频文件保存到服务器上。例如: ``` public void uploadVideo() { try { InputStream input = video.getInputStream(); String fileName = video.getSubmittedFileName(); File file = new File("/path/to/storage/" + fileName); OutputStream output = new FileOutputStream(file); IOUtils.copy(input, output); input.close(); output.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 3. 播放视频:使用 HTML5 `<video>` 标签在页面上播放视频。例如: ``` <video width="320" height="240" controls> <source src="#{bean.videoUrl}" type="video/mp4"> Your browser does not support the video tag. </video> ``` 其中,`videoUrl` 属性是视频文件的 URL 地址,可以在 `uploadVideo` 方法中生成。例如: ``` public String getVideoUrl() { String fileName = video.getSubmittedFileName(); return "/path/to/storage/" + fileName; } ``` 注意:在使用 JSF 中上传和播放视频时,需要注意服务器的存储和带宽限制,以及视频格式和浏览器兼容性问题。 ### 回答2: JSF(JavaServer Faces)是一个用于构建基于Java的Web应用程序的Java EE(Java Enterprise Edition)Web框架。JSF具有内置的组件库,可以轻松地创建用户界面。JSF还具有上传文件的功能。 在JSF中实现文件上传的第一步是在Web应用程序的web.xml文件中配置一个multipart-config元素。这个元素指定了上传文件时的最大大小限制和临时存储位置。 然后,我们可以通过使用JSF的标准组件库或第三方组件库来实现文件上传的功能。例如,可以使用<h:form>和<h:inputFile>标签来创建一个表单和一个文件上传输入字段。 在后台,我们可以使用一个文件上传处理类来处理上传的文件。这个类可以使用JSF的内置的文件上传组件进行文件的接收和存储。在处理类中,我们可以通过使用getSubmittedFileName()方法获得上传文件的原始文件名,并通过使用write()方法将文件保存到指定的目录中。 最后,在JSF的页面中可以通过使用一个由处理类提供的属性来显示上传文件的信息。例如,我们可以在页面中添加一个<h:outputText>标签来显示文件的名称和大小等信息。 总之,JSF提供了方便的工具和组件来实现文件上传功能。我们可以通过配置web.xml文件、使用标准或第三方组件库,并编写适当的文件上传处理类来实现这个功能。 ### 回答3: JSF(JavaServer Faces)是一种用于构建网页用户界面的Java Web框架。它提供了一套标准的组件和API,使得开发者可以更容易地构建交互式的Web应用程序。上传文件是Web应用程序常见的功能之一,JSF也提供了方便的方式来实现文件上传。 在JSF中实现文件上传,我们可以使用一个组件库或者使用原生的JSF标签。例如,PrimeFaces是一个流行的JSF组件库,它提供了一个“p:fileUpload”组件来处理文件上传。通过将该组件添加到JSF页面并设置相应的属性,我们可以轻松地在用户界面上实现文件上传的功能。用户可以选择文件并点击上传按钮,然后我们可以在后台处理该文件。 如果我们不希望使用组件库,我们可以使用JSF标签库提供的原生标签实现文件上传。JSF标签库提供了“h:inputFile”标签,该标签允许用户选择一个或多个文件进行上传。我们可以将该标签添加到JSF页面,并在服务器端使用相应的处理器来处理上传的文件。 无论是使用组件库还是原生标签,我们都需要在服务器端编写相应的代码来处理上传的文件。我们可以使用Java的文件I/O操作来读取上传的文件内容,并执行一些操作,如保存到磁盘或数据库中。同时,我们还可以验证上传的文件格式和大小,以确保安全性和合规性。 总之,JSF提供了简便的方式来实现文件上传功能。通过使用组件库或原生标签,我们可以在用户界面上实现上传文件的功能,并在服务器端进行相应的处理。无论是对于开发者还是用户来说,JSF的文件上传功能都提供了方便和易用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值