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,咱們一塊兒學習,一塊兒成長!

相關文章
相關標籤/搜索