自己做的一个登录的例子,涵盖了jsf中的国际化,类型转换,验证器,监听器等
学了jsf1.2的流程 ,现在该学jsf2.1了, 废话少说,上代码....
(文中如有错误之处,还请高手赐教)
(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
在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>
在熟看这个页面的时候,你需要去了解和学习下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>
<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}" /> 这个就是显示资源文件对应语言内容了
想要代码的初学童鞋可以email,我们一起学习,一起成长!