JSF2.1 代码示例(包含国际化,类型转换,验证器,监听器等)

JSF2.1 代码示例(包含国际化,类型转换,验证器,监听器等)

本身作的一个登陆的例子,涵盖了jsf中的国际化,类型转换,验证器,监听器等 html

学了jsf1.2的流程 ,如今该学jsf2.1了, 废话少说,上代码.... java

(文中若有错误之处,还请高手赐教) jquery

1.首先去官网下载jsf包(从Mojarra项目中找),copy到lib下,这个不用说了吧

(jsf1.2是jsf-api.jar和jsf-impl.jar;   web

jsf2.1已经合并成一个.jar了:javax.faces-2.1.11.jar) spring

使用JSF 还须要其它加包的支持,这些都是开源公共接口和类库: api

commons-beanutils.jar app

commons-collections.jar webapp

commons-digester.jar jsp

commons-logging.jar 性能

jstl.jar

standard.jar

2,跟我一块儿建立人生中第一个jsf程序吧,建立一个web程序,
我建立的叫jsf_demo2.1,修改WEB-INF/web.xml

在web.xml中增长FacesServlet,如:

<servlet>

               <servlet-name>Faces Servlet</servlet-name>

<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

    <servlet-mapping>

    <servlet-name>Faces Servlet</servlet-name>

    <url-pattern>/faces/*</url-pattern>

    <url-pattern>*.xhtml</url-pattern>  jsf1.2 用的是*.faces,不用纠结这个你懂的

    </servlet-mapping>

3.建立个登陆页面index.xhtml (JSF2.x采用W3Cxhtml规范,是一个严格的xml规范,组件树渲染再也不须要如jsp同样编译成class文件后再运行,能够直接渲染,而大大提高了渲染速度,总体性能比jsp应该会提高很多。)

在熟看这个页面的时候,你须要去了解和学习下jsf的一些标签知识。

index.xhtml开头

<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"

xmlns:ui="http://java.sun.com/jsf/facelets">

引入标签库,也是一种规范,(JSF2.X中引入了全新的界面表现模型Facelets,能够方便的实现自有组件定制和页面模版化。既强化了JSF提出以来的组件式开发思想,又简化了自有组件的开发。从Tapestry吸取来的模版方式不只可让开发工程师像搭积木同样组合一个页面,更能够搭好架子后只在相关页面中只修改须要改变的部分。Facelets还有一大好处,就是将全部java代码从页面标签中移出,让分工更明细了,分工合做原本就是人类发展的一大基石,在这儿也体现了

接下来的部分:(这里我给初学者重点说明下:--高手见笑了)

<f:view locale="#{user.locale}"> // 能够设置国际化语言

<h:head>

<title>My first JSF2.1</title>

<meta http-equiv="content-type" content="text/html;  charset=GBK" />

</h:head>

<h:body>

<f:loadBundle var="msgs" basename="message" />  //读取国际化资源文件

<h:form>

<h3>

<h:outputText value="#{msgs.title}" /> 

 //这个标签是显示打印的,value 是资源文件中的内容

<h:outputText value="#{user.date}">

<f:convertDateTime pattern="yyyy-MM-dd"/>

   //<f:convertDateTime 是jsf标准的转换器 ,pattern就是你要转化的格式,好比 pattern="yyyy/MM/dd" ,jsf还提供自定义转换器,这里不做详细说明。

</h:outputText>

</h3>

<h:outputText value= "#{user.msg}" /><br/>

<h:messages layout="table" style="color:red"/> // 这里能够显示异常提示信息,并设置格式等

<h:outputText value="#{msgs.name}" />:<h:inputText value="#{user.name}" required="true"/>

// required="true"  用过struts2校验器或jquery校验器的童鞋不难理解,这个是jsf中的校验:必填,不能为空!

<br />

<h:outputText value="#{msgs.pwd}" />:

<h:inputSecret value="#{user.password}" required="true">

<!--<f:validateLength minimum="6"/>-->//jsf标准校验器  “最少为6个字符”

<f:validator validatorId="pwdValidator"/>

//jsf也很灵活,提供自定义校验器,这里就是我自定义的校验器,用于验证密码的,下面有详解

</h:inputSecret>

<br />

<h:outputText value="#{msgs.date}" />:

<h:inputText id="dateField" value="#{user.date}">

<f:convertDateTime pattern="yyyy-MM-dd"/>

</h:inputText><br/>

<h:commandButton actionListener="#{user.verify_event}" action="#{user.outcome}" value="#{msgs.submit}" />

//这个就是一个提交按钮了,action=“要提交的地方” 这里要提交到welcome.xhtml,就是但愿登陆成功后跳到welcome.xhtml。若是#{user.outcome}的值是welcome,也就是说action="welcome"的时候,页面就到welcome.xhtml页面了,懂了吧;固然有时候用到转发,jsf中是这样的:action="xxx?faces-redirect=true"。

讲讲actionListener吧,jsf是基于事件驱动的,这个事件(指点击按钮)对应的处理方法就是

(actionListener="#{user.verify_event}" )名称为“user”的这个Bean中的verify_event方法,这个方法在下文找

<!-- <h:commandButton immediate="true">

//对于JSF 的input 与command 组件,都有一个immediate 属性,

    若是immediate="true" ,

    则指定的事件就成为当即事件。当按下这个按钮后,

    JSF 套用请求值以后会当即处理指定的actionListener,

    而再也不进行验证、更新模型值,简单的说,就这个程序来讲,

    您在输入字段与密码字段中填入的值,不会影响您的user.name与user.password;

若是您要注册多个ActionListener

<f:actionListener type= "com.dengyang.mylistener.LogActioinListener"/> 

        <f:actionListener type= "com.dengyang.mylistener.VertifyActioinListener" /> 

          </h:commandButton> 

-->

<h:selectOneMenu value="#{user.locale}" onchange="this.form.submit();" valueChangeListener="#{user.changeLocale}">

    <f:selectItem itemLabel="Chinese" itemValue="zh_CN"/>

    <f:selectItem itemLabel="English" itemValue="en_US"/>

    </h:selectOneMenu>

</h:form>

 

</h:body>

</f:view>

</html>

 以上初学着 或许有不少疑惑之处,以上出现的user 咱们能够看作成一个实体,user.  就是取实体中的某个属性!

4.国际化资源文件

<f:loadBundle var="msgs" basename="message" />  //读取国际化资源文件     想懂这个  你要先看看资源文件

message_en_US.properties  英文:

title=JSF2.1test

name=name

pwd=password

submit=submit

langunge=English

hello=Hello

welcome=welcome to use JavaServer Faces

date=date

message_zh_CN.properties 中文:
title=JSF2.1\u793A\u4F8B
name=\u540D\u5B57
pwd=\u5BC6\u7801
submit=\u63D0\u4EA4
langunge=\u4E2D\u6587
hello=\u60A8\u597D
welcome=\u6B22\u8FCE\u4F7F\u7528JavaServer Faces
date=\u65E5\u671F
<f:loadBundle var="msgs" basename="message" /> 默认根据系统语言环境读取对应国际化资源文件
<h:outputText value="#{msgs.title}" /> 这个就是显示资源文件对应语言内容了


5.好了,咱们看看实体内容吧:

package com.dengyang.demo;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;

@ManagedBean(name="user")  //jsf2.x使用的是注解方式,会spring3.x的都知道 注解如今很流行,name值就是咱们页                                                 面引用的user.xxx  ,不难懂吧
@SessionScoped                     //做用域范围  jsf1.2这些都是配置文件中的

public class UserBean {

 private String name="dengyang";
 private String password;
 private String msg;
 private Date date = new Date();
 private List<Integer> array;
 private Map<String,String> map;
 
 private String locale;
 private String outcome;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public List<Integer> getArray() {
return array;
}
public void setArray(List<Integer> array) {
this.array = array;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public String getLocale() {
if(locale == null)
locale = "zh_CN";
return locale;
}
public void setLocale(String locale) {
this.locale = locale;
}
/**
 * 值变事件
 页面中  <h:selectOneMenu value="#{user.locale}" onchange="this.form.submit();"                                                                    valueChangeListener="#{user.changeLocale}">
 * @param e
方法的名字对应   valueChangeListener="#{user.changeLocale}">
 */
public void changeLocale(ValueChangeEvent e) {
if(locale.equals("zh_CN"))
locale = "en_US";
else
locale = "zh_CN";
}

/**
 * 动做事件  对应页面中: <h:commandButton actionListener="#{user.verify_event}" action="#{user.outcome}" value="#{msgs.submit}" />
 * @param e
 */
public void verify_event(ActionEvent e){
if(!name.equals("邓洋")||!password.equals("123456")){
msg ="名字或密码错误!";
outcome = "index";
}else
outcome = "welcome";
}
public String outcome() {
return outcome;
}
}
自定义校验器:
/**
 * 自定验证器
 * 
 * @author dengyangyang
 * 
 */
@FacesValidator(value="pwdValidator")       //对应页面<f:validator validatorId="pwdValidator"/>
public class MyValidator implements Validator {
/*
* 还能够把如下验证方法写在实体Bean中
*  页面这样调用:
*  <h:inputSecret value="#{user.password}" required="true" validator="#{user.validate}" /> 
*/
public void validate(FacesContext context, UIComponent component,
Object object) throws ValidatorException {
String password = (String) object;
if (password.length() < 6) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR, "您输入的密码过短!", "密码长度不能小于6个字符!");
throw new ValidatorException(message);
}
if (password.length()>8) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR,"您输入的密码太长!", "密码长度不能大于8个字符!");
throw new ValidatorException(message);
}
}
}

还有一些事件监听 等相似于struts的拦截器  ,这里时间有限 不做详细代码说明( implements ActionListener)

想要代码的初学童鞋能够email,咱们一块儿学习,一块儿成长!

相关文章
相关标签/搜索