文档章节

JSF---->错误讯息处理

小强斋太
 小强斋太
发布于 2016/11/09 20:06
字数 1067
阅读 2
收藏 0
点赞 0
评论 0

错误讯息处理

在使用标准转换器或验证器时,当发生错误时,会有一些预设的错误讯息显示,这些讯息可以使用<h:messages>或<h:message>卷标来显示出来,而这些预设的错误讯息也是可以修改的,您所要作的是提供一个讯息资源文件,例如:
messages.properties

javax.faces.component.UIInput.CONVERSION=Format Error.
javax.faces.component.UIInput.REQUIRED=Please input your data.

javax.faces.component.UIInput.CONVERSION是用来设定当转换器发现错误时显示的讯息,而javax.faces.component.UIInput.REQUIRED是在标签设定了required为true,而使用者没有在字段输入时显示的错误讯息

您要在faces-config.xml中告诉JSF您使用的讯息文件名称,例如:

faces-config.xml

<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">

<faces-config>
    <application>
        <local-config>
            <default-locale>en</default-locale>
            <supported-locale>zh_cn</supported-locale>
        </local-config>
        <message-bundle>messages</message-bundle>
    </application>
    .....

</faces-config>

在这边我们设定了讯息档案的名称为messages_xx_YY.properties,其中xx_YY是根据您的Locale来决定,转换器或验证器的错误讯息如果有设定的话,就使用设定值,如果没有设定的话,就使用默认值。验证器错误讯息,除了上面的javax.faces.component.UIInput.REQUIRED之外,还有以下的几个:

javax.faces.validator.NOT_IN_RANGE

javax.faces.validator.DoubleRangeValidator.MAXIMUM

javax.faces.validator.LongRangeValidator.MAXIMUM

javax.faces.validator.DoubleRangeValidator.MINIMUM

javax.faces.validator.LongRangeValidator.MINIMUM

javax.faces.validator.DoubleRangeValidator.TYPE、

javax.faces.validator.LongRangeValidator.TYPE

javax.faces.validator.LengthValidator.MAXIMUM

javax.faces.validator.LengthValidator.MINIMUM

讯息的显示有概述讯息与详述讯息,如果是详述讯息,则在识别上加上 "_detail",例如:

javax.faces.component.UIInput.CONVERSION=Error.
javax.faces.component.UIInput.CONVERSION_detail= Detail Error.

除了在讯息资源文件中提供讯息,您也可以在程序中使用FacesMessage来提供讯息,例如在自订验证器中我们就这么用过:

....
         if(password.length() < 6) {
            FacesMessage message = new FacesMessage(
                 FacesMessage.SEVERITY_ERROR,
                 "字符长度小于6",
                 "字符长度不得小于6");
            throw new ValidatorException(message);
        }
....

最好的方法是在讯息资源文件中提供讯息,这么一来如果我们要修改讯息,就只要修改讯息资源文件的内容,而不用修改程序,来看一个简单的例子,假设我们的讯息资源文件中有以下的内容:

javax.faces.component.UIInput.REQUIRED=\u8BF7\u8F93\u5165\u6570\u636E
wsz.ncepu.password_all_number_errorMessage=\u5BC6\u7801\u5FC5\u987B\u5305\u542B\u5B57\u6BCD
wsz.ncepu.password_length_errorMessage=\u5BC6\u7801\u7684\u957F\u5EA6\u5728{0}\u548C{1}\u4E4B\u95F4

则我们可以在程序中取得讯息资源文件的内容,例如:

import java.util.Locale;
	 import java.util.ResourceBundle;
	 import javax.faces.context.FacesContext;
	 improt javax.faces.component.UIComponent;
	 import javax.faces.application.Application;
	 import javax.faces.application.FacesMessage;

	     ....
	     public void xxxMethod(FacesContext context,
	                          UIComponent component,
	                          Object obj) {
	         // 取得应用程序代表对象
	         Application application = context.getApplication();
	         // 取得讯息档案主名称
	         String messageFileName = application.getMessageBundle();
	         // 取得当前 Locale 对象
	         Locale locale = context.getViewRoot().getLocale();
	         // 取得讯息绑定 ResourceBundle 对象
	         ResourceBundle rsBundle =  ResourceBundle.getBundle(messageFileName, locale);
	         String message = rsBundle.getString("wsz.ncepu.password_length_errorMessage");
	         FacesMessage facesMessage = new FacesMessage( FacesMessage.SEVERITY_FATAL, message, message);
	         ....
	     }
	     ....
	 ....

接下来您可以将FacesMessage对象填入ValidatorException或ConverterException后再丢出,FacesMessage建构时所使用的三个参数是严重程度、概述讯息与详述讯息,严重程度有SEVERITY_FATAL、SEVERITY_ERROR、SEVERITY_WARN与SEVERITY_INFO四种。

如果需要在讯息资源文件中设定{0}、{1}等参数,则可以如下:

....
String message = rsBundle.getString( "wsz.ncepu.password_length_errorMessage");
Object[] params = {"param1", "param2"};
message = java.text.MessageFormat.format(message, params);

FacesMessage facesMessage = new FacesMessage( FacesMessage.SEVERITY_FATAL, message, message);

如此一来,在显示讯息时,wsz.ncepu.password_length_errorMessage的{0}与{1}的位置就被"param1"与"param2"所取代。

完整代码如下:

UserBean.java

package wsz.ncepu;

import java.util.Locale;
import java.util.ResourceBundle;

import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

public class UserBean {
	private String name;
	private String password;
	private String errMessage;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPassword() {
		return password;
	}

	public void setErrMessage(String errMessage) {
		this.errMessage = errMessage;
	}

	public String getErrMessage() {
		return errMessage;
	}

	public String verify() {
		if (!name.equals("justin") || !password.equals("123456")) {
			errMessage = "名称或密码错误";
			return "failure";
		} else {
			return "success";
		}
	}

	public void validate(FacesContext context, UIComponent component, Object obj)
			throws ValidatorException {
		String password = (String) obj;
		// 取得应用程序代表对象
		Application application = context.getApplication();
		// 取得资源文件主名称
		String messageFileName = application.getMessageBundle();
		// 取得当前 Locale 对象
		Locale local = context.getViewRoot().getLocale();
		// 取得ResourceBundle 对象
		ResourceBundle rsBundle = ResourceBundle.getBundle(messageFileName,
				local);
		// 取得资源文件中字符串
		String password_length_message = rsBundle
				.getString("wsz.ncepu.password_length_errorMessage");
		String password_all_number_errorMessage = rsBundle
				.getString("wsz.ncepu.password_all_number_errorMessage");
		Object[] params = { "6", "12" };
		password_length_message = java.text.MessageFormat.format(
				password_length_message, params);

		if (password.length() < 6 || password.length() > 12) {
			FacesMessage message = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, password_length_message,
					password_length_message);
			throw new ValidatorException(message);
		}

		if (password.matches(".+[0-9]+")) {
			FacesMessage message = new FacesMessage(
					FacesMessage.SEVERITY_ERROR,
					password_all_number_errorMessage,
					password_all_number_errorMessage);
			throw new ValidatorException(message);
		}
	}

}

index.jsp

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@page contentType="text/html;charset=utf-8"%>
<html>
	<head>
		<title>第一个JSF程序</title>
	</head>
	<body>
		<f:view>
			<h:form>
				<h3>
					请输入您的名称
				</h3>
				<h:messages>
				</h:messages>
				
				<p>
					名称:
					<h:inputText value="#{user.name}" />
				<p>
					密码:
					<h:inputSecret value="#{user.password}" required="true"  validator="#{user.validate}">
						
					</h:inputSecret>
				<p>
					<h:commandButton value="送出" action="#{user.verify}" />
			</h:form>
		</f:view>
	</body>
</html>

效果如下


 

本文转载自:http://www.cnblogs.com/xqzt/archive/2012/05/17/5637358.html

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
JSF生命周期总结

JSF实现使用一个控制器servlet 来处理请求,然后执行 JSF 生命周期.如图显示了JSF 生命周期中的事件处理。 上图是正常的JSF组件的生命周期.一共12个. 记住,所有JSF事件都在服务器上执行,当在J...

Zhao-Qian ⋅ 2012/08/10 ⋅ 0

浅谈 JSF 生命周期

J2EE oracle 官方文档 http://docs.oracle.com/javaee/6/tutorial/doc/docinfo.html 查看其中 Part II Web tier --> javaserver faces technology --> advance concepts (高级概念) 前言:充......

triankg ⋅ 2013/07/22 ⋅ 0

JSF生命周期(life cycle)

和JSF生命周期相关的请求与响应有两类:分别是Faces response和Non-Faces response,以及Faces request和Non-Faces。 另外有三种场景与此相关分别是: Scenario 1: Non-Faces Request Genera...

崔钢 ⋅ 2011/04/08 ⋅ 0

怀疑论者的 JSF: JSF 应用程序的生命周期

级别: 中级 Rick Hightower (rhightower@arc-mind.com), CTO, ArcMind 2005 年 3 月 01 日 本系列怀疑论者的 JSF 一共包含 4 篇文章,本文是其中的第 2 篇。在本文中,Rick Hightower 对 Ja...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

.htaccess ErrorDocument使用方式

网站服务器在不能响应使用者需求下,会产生各种错误讯息,这些错误讯息均有一个代码,我们来瞧瞧这代码所代表的意义: 响应代码 响应内容 代表意义 401 Authorization failed 授权失败。用户...

萧十一郎君 ⋅ 2015/07/28 ⋅ 0

纪念一下我的第一个jsf

1.项目右键->Myeclipse->Add jsf Capabilities:默认成功 2.手动把已有jar包放入WEB-INF/lib目录:(建议先在构建路径中把myeclipse默认加载进来的jsf库先除去,避免不必要的冲突错误),所需j...

小姚 ⋅ 2012/07/20 ⋅ 0

Java Server Faces (JSF) 页面转换与验证(一)

由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统、详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还...

码上中国博客 ⋅ 2015/02/03 ⋅ 0

Spring+JSF+JPA(Hibernate)的环境搭建(一)

前言 由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统、详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚...

码上中国博客 ⋅ 2015/02/06 ⋅ 2

1.5 Hello, world! 解剖 -JSF实战 -hxzon -jsf学习笔记

1.5 Hello, world! 解剖 -JSF实战 -hxzon -jsf学习笔记 既然已经对JSF能够解决什么问题有了初步理解,我们来开始开发一个简单的应用。本节假定你已熟悉Java Web应用和JSP(关于这些技术的信息...

hxzon ⋅ 2009/03/05 ⋅ 0

JSF+Seam框架学习心得

http://developer.51cto.com 我目前的项目前端使用的是JSF+Seam框架,目前项目已经进入尾声,我想把一些心得体会给大家说说,以便大家在使用JSF的时候,少走弯路。 1.异常处理问题:请为JSF...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

阿里云云栖社区 ⋅ 今天 ⋅ 0

zabbix短信报警统计以及报表展示

一、需求 由于我们的业务报警比较频繁,之前是针对每个报警进行具体处理,但是有时还会重复出现,或者后续处理有时忘记跟进等,因此进行报警短信的统计,可以针对一些问题与业务跟进,明确后...

o翡翠谷o ⋅ 今天 ⋅ 0

JNI 输出LOG

1、导入log头文件。在你使用的 .c/ .cpp 文件中,导入 log.h 头文件。 #include<android/log.h> 2、在android.mk 加上 LOCAL_LDLIBS := -llog 或 LOCAL_SHARED_LIBRARIES := liblog 3、定义L......

国仔饼 ⋅ 今天 ⋅ 0

主线程pthread_exit 作用

#include <iostream>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 10void* say_hello(void* args){ int i = *((int*)args);/......

xxdd ⋅ 今天 ⋅ 0

崛起于Springboot2.X之Mybatis-xml方式操作mysql数据库(3)

序言:当第一篇讲道Mybatis的时候,只要使用过mybatis的java程序员100%都会知道这种方式,因为这是最广泛最全面的编写sql操作mysql数据库的方式,高级sql的编写往往通过xml方式,接下来进入正...

木九天 ⋅ 今天 ⋅ 1

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

猫耳m ⋅ 今天 ⋅ 0

spring elasticsearch 2.4 date 日期

1.mappingPUT user_behavior { "mappings": { "user_behavior": { "properties": { "date": { "type": "createDate", ......

xiaomin0322 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部