- 浏览: 36862 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
308655406:
讲了原理 讲了注意事项 居然没有举例讲怎么用。。。
jQuery 数据缓存data(name, value)详解及实现
视图没有存储的异常
javax.faces.application.ViewExpiredException: viewId:/pages/gardeninfo/envRiskEditForm.faces - View /pages/gardeninfo/envRiskEditForm.faces could not be restored.
对于用户来说是不懂的,那只要在重写生命周期便可处理
第一种:
1. 重写一个类,继承Lifecycle类,重写父类的execute方法,捕捉该异常,然后进行处理(如设置跳转到登录页面)。
2. 重写一个类,继承LifecycleFactoryImpl类,添加SessionLifecycleImpl的实例到工厂中,假设重写的子类为project.jsf.test.SessionLifecycleFactoryImpl。
3.在faces-config.xml中注册JSFLifecycleFactory类。
4.在web.xml中指定JSFLifecycleFactory工厂中创建的JSFLifecycle实例的键(key)。
public class JSFLifecycleFactory extends LifecycleFactoryImpl {
private static Logger LOGGER = FacesLogger.LIFECYCLE.getLogger();
public static final String JSF_LIFECYCLE = "JSF";
public JSFLifecycleFactory() {
super();
lifecycleMap.put(JSF_LIFECYCLE, new JSFLifecycle());
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("Created EJS JSF Lifecycle");
}
}
}
public class JSFLifecycle extends Lifecycle {
private static Logger LOGGER = FacesLogger.LIFECYCLE.getLogger();
private Phase response = new RenderResponsePhase();
private Phase[] phases = {
null, // ANY_PHASE placeholder, not a real Phase
new RestoreViewPhase(), new ApplyRequestValuesPhase(),
new ProcessValidationsPhase(), new UpdateModelValuesPhase(),
new InvokeApplicationPhase(), response };
private List<PhaseListener> listeners = new CopyOnWriteArrayList<PhaseListener>();
public void execute(FacesContext context) throws FacesException {
try {
if (context == null) {
throw new NullPointerException(MessageUtils
.getExceptionMessageString(
MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID,
"context"));
}
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("execute(" + context + ")");
}
for (int i = 1, len = phases.length - 1; i < len; i++) {
if (context.getRenderResponse()
|| context.getResponseComplete()) {
break;
}
phases[i].doPhase(context, this, listeners.listIterator());
}
}
catch (ViewExpiredException e) {
JSFMessageUtils.removeMessage();
JSFMessageUtils.showAndLogException("信息","操作错误", e
.getMessage(), null, JSFMessageUtils.WARN,
JSFMessageUtils.OK);
}
catch (Exception e) {
JSFMessageUtils.removeMessage();
JSFMessageUtils.showAndLogException("信息","操作错误", e
.getMessage(), null, JSFMessageUtils.WARN,
JSFMessageUtils.OK);
}
}
public void render(FacesContext context) throws FacesException {
try {
if (context == null) {
throw new NullPointerException(MessageUtils
.getExceptionMessageString(
MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID,
"context"));
}
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("render(" + context + ")");
}
if (!context.getResponseComplete()) {
response.doPhase(context, this, listeners.listIterator());
}
}
catch (FacesException e) {
JSFMessageUtils.removeMessage();
JSFMessageUtils.showAndLogException("信息","操作错误", e
.getMessage(), null, JSFMessageUtils.WARN,
JSFMessageUtils.OK);
}
catch (Exception e) {
JSFMessageUtils.showAndLogException("信息","操作错误", e
.getMessage(), null, JSFMessageUtils.WARN,
JSFMessageUtils.OK);
}
}
public void addPhaseListener(PhaseListener listener) {
if (listener == null) {
throw new NullPointerException(MessageUtils
.getExceptionMessageString(
MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID,
"listener"));
}
if (listeners == null) {
listeners = new CopyOnWriteArrayList<PhaseListener>();
}
if (listeners.contains(listener)) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.log(Level.FINE,
"jsf.lifecycle.duplicate_phase_listener_detected",
listener.getClass().getName());
}
}
else {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.log(Level.FINE, "addPhaseListener({0},{1})",
new Object[] { listener.getPhaseId().toString(),
listener.getClass().getName() });
}
listeners.add(listener);
}
}
public PhaseListener[] getPhaseListeners() {
return listeners.toArray(new PhaseListener[listeners.size()]);
}
public void removePhaseListener(PhaseListener listener) {
if (listener == null) {
throw new NullPointerException(MessageUtils
.getExceptionMessageString(
MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID,
"listener"));
}
if (listeners.remove(listener) && LOGGER.isLoggable(Level.FINE)) {
LOGGER.log(Level.FINE, "removePhaseListener({0})",
new Object[] { listener.getClass().getName() });
}
}
}
faces-config.xml:
<factory>
<lifecycle-factory>org.ejs.jsf.JSFLifecycleFactory</lifecycle-factory>
</factory>
web.xml
<context-param>
<param-name>javax.faces.LIFECYCLE_ID</param-name>
<param-value>JSF</param-value>
</context-param>s
第二种网上搜的:
1. 重写一个类,继承LifecycleImpl类,重写父类的execute方法,捕捉该异常,然后进行处理(如设置跳转到登录页面),假设重写的子类名为project.jsf.test.SessionLifecycleImpl。
2. 重写一个类,继承LifecycleFactoryImpl类,添加SessionLifecycleImpl的实例到工厂中,假设重写的子类为project.jsf.test.SessionLifecycleFactoryImpl。
3.在faces-config.xml中注册SessionLifecycleFactoryImpl类。
4.在web.xml中指定SessionLifecycleFactoryImpl工厂中创建的SessionLifecycleImpl实例的键(key)。
具体如下:
1.project.jsf.test.SessionLifecycleImpl类:
import javax.faces.FacesException;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import com.sun.faces.lifecycle.LifecycleImpl;
public class SessionLifecycleImpl extends LifecycleImpl {
public final static String SESSION_TIMEOUT_PAGES = "/pages/sessionTimeOut.faces";
public SessionLifecycleImpl() {
super();
}
public void execute(FacesContext context) {
try {
super.execute(context);
}catch(ViewExpiredException vee) {
redirect(context);
}catch(FacesException fe) {
throw fe;
}
}
private void redirect(FacesContext context) {
try {
context.responseComplete();
context.renderResponse();
HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();
String url = context.getExternalContext().getRequestContextPath()+ SESSION_TIMEOUT_PAGES;
response.sendRedirect(url);
}catch(Exception e) {
System.out.println(" Error: session timeout url redirect ");
}
}
}
2. project.jsf.test.SessionLifecycleFactoryImpl类:
import com.sun.faces.lifecycle.LifecycleFactoryImpl;
public class SessionLifecycleFactoryImpl extends LifecycleFactoryImpl {
public static final String SESSION_LIFECYCLE = "SessionLifecycle";
public SessionLifecycleFactoryImpl(){
super();
addLifecycle(SESSION_LIFECYCLE, new SessionLifecycleImpl());
}
}
3. faces-config.xml中注册SessionLifecycleFactoryImpl类
<faces-config>
<factory>
<lifecycle-factory>project.jsf.test.SessionLifecycleFactoryImpl</lifecycle-factory>
</factory>
.........
</faces-config>
4. web.xml中指定SessionLifecycleImpl实例的键(key):
<context-param>
<param-name>javax.faces.LIFECYCLE_ID</param-name>
<param-value>SessionLifecycle</param-value>
</context-param>
第三种:网上搜的
现这个错误是因为session 超时。当然关掉页面重新打开就不会有这个问题,但是在可用性方面就很差。作为开发人员看见这个错误会知道为什么,普通浏览者肯定会觉得出了什么问题。所以还是解决一下好。
如果是 sun appplication server
解决办法是在web.xml中添加
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/sessionExpired.jsp</location>
</error-page>
sessionExpired.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<c:redirect url="/login.jsf" />
如果web容器是tomcat,解决办法如下:
package com.jsf.util;
import javax.faces.FacesException;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import com.sun.faces.lifecycle.LifecycleImpl;
public class TeleLifecycleImpl extends LifecycleImpl
{
public TeleLifecycleImpl()
{
super();
}
public void execute(FacesContext context)
{
try
{
super.execute(context);
}
catch (ViewExpiredException vee)
{
redirect(context);
}
catch (FacesException fe)
{
throw fe;
}
}
private void redirect(FacesContext context)
{
try
{
context.responseComplete();
context.renderResponse();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
String url = context.getExternalContext().getRequestContextPath() + "/faces/error.jsp";
response.sendRedirect(url);
}
catch (Exception e)
{
System.out.println("url redirect wrong ");
}
}
}
在jsf配置文件 faces-config.xml 中添加如下内容
<factory>
<lifecycle-factory>trackingmap.TeleLifecycleFactoryImpl</lifecycle-factory>
</factory>
在web.xml 中添加如下内容
<context-param>
<param-name>javax.faces.LIFECYCLE_ID</param-name>
<param-value>TELEEPOCH</param-value>
</context-param>
发表评论
-
JSF2 FORM组件
2013-01-14 18:10 851添加Form组件 标签h:form展示一个输入表单,包 ... -
JSF2 页面标签使用说明(一)
2013-01-14 18:08 1140Web页面代表了web应用 ... -
JSF2 使用bean验证
2013-01-14 18:03 845验证用户的输入来维 ... -
JSF相关表单控件收集
2013-01-14 17:52 761import javax.enterprise.contex ... -
jsf web.xml配置
2013-01-14 17:43 766<?xml version="1.0" ... -
JSF笔记 – JSF运行流程和生命周期介绍
2012-12-20 14:13 823JSF是一个Web应用,也会 ... -
JSF项目中实现基于RBAC模型的权限管理设计(二) 转
2012-12-20 10:33 9584.3 权限验证模块设计 一个好的权限管理机制在项目中应 ... -
JSF项目中实现基于RBAC模型的权限管理设计(一)(转)
2012-12-20 10:32 11041 概述 几乎所有的项目都会涉及到权限控制 ... -
JSF中session过期后视图恢复的问题
2012-12-20 10:16 1197在jsf中,一旦session过期,生命周期为session的 ... -
JSF获取页面路径和参数
2012-12-18 20:39 1192FacesContext facesContext ... -
JSF2拦截器
2012-12-18 20:40 1487/* * To change this template, c ...
相关推荐
JSF,全称为JavaServer Faces,是Java...这包括了解如何编写转换器和验证器类,如何将它们与JSF组件关联,以及如何处理验证和转换过程中的异常。这样的实践将增强你对JSF框架的理解,提高你在实际开发中的应用能力。
本篇文章将详细介绍如何在JSF中监测和处理session超时,特别是通过监听恢复视图阶段的`ViewExpiredException`异常。 首先,我们需要理解JSF的生命周期。JSF有多个阶段,包括恢复视图(Restore View)阶段。在这个...
同时,通过处理异常,如`javax.faces.application.FacesException`,可以确保程序在遇到错误时能给出合适的反馈。 8. **导航规则**:JSF应用中的页面跳转通常通过导航规则来定义,例如,登录成功后重定向到主页面,...
"jsf2segy.zip" 文件就是这样一个工具,它专门用于将特定的JSF格式数据转换成更通用的SEG-Y格式,以便在各种不同的软件环境中进行进一步的数据分析和处理。以下是关于这个转换过程及相关知识点的详细说明: **JSF...
### JSF生命周期的事件处理 JavaServer Faces(简称JSF)是Java平台提供的一种用于构建企业级Web应用程序的标准框架。JSF通过定义一套简洁而强大的API来帮助开发者更轻松地开发用户界面。其中,JSF的生命周期管理...
JSF(JavaServer Faces)是Java平台上用于构建用户界面的Web框架,尤其在处理表单和数据交互方面表现强大。本项目聚焦于JSF的文件上传功能,特别是针对大文件的上传,允许用户上传最大可达1.99GB的文件。在实际应用...
**生命周期** 是JSF处理请求的关键过程,包括初始化、恢复视图、应用请求值、处理事件、更新模型值、渲染响应等阶段。开发者可以在这些阶段插入自定义的行为。 **JSF与Java EE集成** 是其强大的特点之一。它可以...
**事件处理**:JSF支持事件处理机制,允许组件之间通信。当用户触发一个事件(如点击按钮),对应的事件处理器会被调用,这使得组件间的交互变得简单而直观。 **渲染器**:渲染器负责将JSF组件转化为实际的HTML或...
5. **调用应用程序(Invoke Application)**:在这个阶段,JSF会调用应用程序中的方法来处理事件。例如,如果用户点击了一个按钮,JSF会执行对应的动作方法,该方法通常在管理Bean中定义。 6. **呈现响应(Render ...
8. **异常处理**:当用户输入无效或发生错误时,JSF可以通过`FacesMessage`来显示错误信息,也可以自定义错误页面来优雅地处理异常情况。 9. **JSF生命周期**:理解JSF的请求处理流程对于调试和优化非常重要,包括...
原生的 JSF 异常处理机制较为简单,无法提供足够的信息来帮助开发者定位问题。为了解决这一问题,推荐使用 Seam 框架进行集成。 Seam 是一个为 JSF 提供增强功能的框架,它能够无缝地与 JSF 集成,并且不仅仅局限于...
jsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSFjsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSF
JavaServer Faces(JSF)是Java平台上的一种用于构建用户界面的服务器端框架,它简化了Web应用程序的开发,特别是处理用户交互和业务逻辑的集成。JSF的核心组件包括`jsf-api.jar`和`jsf-impl.jar`,这两个jar包在...
JSF的核心组件包括UI组件、事件处理、数据绑定和转换验证。 ### 2. UI组件库 JSF 1.2提供了一套丰富的预定义UI组件,如按钮、输入字段、表格等。这些组件可以通过XML(Faces配置文件)或者在JSP页面上直接声明。...
在JavaServer Faces (JSF)框架中,分页是一种常用的技术,用于处理大量数据时提供更好的用户体验。当数据集过大,一次性加载所有记录到页面上会导致性能下降且用户界面响应变慢。通过分页,我们可以将数据分成多个...
《JSF入门简体中文版》是学习JSF的基础,它涵盖了JSF的基本架构、组件库、生命周期和事件处理等方面。书中会介绍如何创建一个简单的JSF应用程序,设置开发环境,以及如何使用JSF的UI组件来构建动态网页。此外,还会...
但是,根据上下文,我们可以推断文档可能包含有关JSF的详细教程或参考资料,比如如何配置JSF环境、创建JSF组件、处理用户事件以及调试JSF应用程序等内容。 总的来说,JSF是一个强大的工具,它为Java开发者提供了...
- **JSP页面**:可以直接在JSP页面中调用`downloadFile`方法,通过传递参数获取文件名,并处理异常。示例代码显示了如何从请求参数中获取文件名,然后调用`FileUtils.downloadFile`方法。 7. **JSF与JSP的集成**:...
这些异常会被JSF处理,并显示相应的错误消息给用户。开发者可以通过`FacesMessage`设置自定义错误消息,或者在全局的异常处理器中处理这些异常。 总结来说,JSF的转换和验证功能对于确保Web应用程序的数据模型完整...
JSF是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架...