- 浏览: 36436 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 828添加Form组件 标签h:form展示一个输入表单,包 ... -
JSF2 页面标签使用说明(一)
2013-01-14 18:08 1134Web页面代表了web应用 ... -
JSF2 使用bean验证
2013-01-14 18:03 833验证用户的输入来维 ... -
JSF相关表单控件收集
2013-01-14 17:52 747import javax.enterprise.contex ... -
jsf web.xml配置
2013-01-14 17:43 760<?xml version="1.0" ... -
JSF笔记 – JSF运行流程和生命周期介绍
2012-12-20 14:13 808JSF是一个Web应用,也会 ... -
JSF项目中实现基于RBAC模型的权限管理设计(二) 转
2012-12-20 10:33 9224.3 权限验证模块设计 一个好的权限管理机制在项目中应 ... -
JSF项目中实现基于RBAC模型的权限管理设计(一)(转)
2012-12-20 10:32 10981 概述 几乎所有的项目都会涉及到权限控制 ... -
JSF中session过期后视图恢复的问题
2012-12-20 10:16 1188在jsf中,一旦session过期,生命周期为session的 ... -
JSF获取页面路径和参数
2012-12-18 20:39 1176FacesContext facesContext ... -
JSF2拦截器
2012-12-18 20:40 1477/* * 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实例 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处理,并显示相应的错误消息给用户。开发者可以通过`FacesMessage`设置自定义错误消息,或者在全局的异常处理器中处理这些异常。 总结来说,JSF的转换和验证功能对于确保Web应用程序的数据模型完整...
但是,根据上下文,我们可以推断文档可能包含有关JSF的详细教程或参考资料,比如如何配置JSF环境、创建JSF组件、处理用户事件以及调试JSF应用程序等内容。 总的来说,JSF是一个强大的工具,它为Java开发者提供了...
1. **JSF生命周期**:JSF有六个主要阶段,包括恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑以及渲染响应。开发者可以在这些阶段插入自定义行为。 2. **JSF页面(Facelets)**:JSF使用Facelets...
JSF是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架...
在数据处理方面,JSF内置了标准转换器和验证器,这些转换器和验证器能够自动处理数据类型转换和输入验证,开发者也可以实现自定义转换器和验证器来满足特定的业务需求。JSF还包含了一套错误信息处理机制,能够在用户...