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

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

自己做的一个登录的例子,涵盖了jsf中的国际化,类型转换,验证器,监听器等

学了jsf1.2的流程 ,现在该学jsf2.1了, 废话少说,上代码....

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

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

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

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

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

commons-beanutils.jar

commons-collections.jar

commons-digester.jar

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,我们一起学习,一起成长!


你可能感兴趣的:(JSF,JSF2.0)