JSF学习笔记.doc_第1页
JSF学习笔记.doc_第2页
JSF学习笔记.doc_第3页
JSF学习笔记.doc_第4页
JSF学习笔记.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Jsf学习笔记系列(一)Tag: jsf 学习入门第一课 Core的作者说你可以把JavaServer Faces(JSF)看成“swing for server-side applications”,我想这是因为:1、JSF里面定义了很多可用的UI部件(用户可自定义)。2、JSF有消息驱动机制。要用JSF,除了JDK和Tomcat(servlet container)之外,还要下载一个JavaServer Faces reference implementation,要用到里面的lib,现在sun网站上有1.1的版本。一个简单的开发例子:1、建立一个目录,这个目录是部署这个应用的单元(打包成.war),比如sample。2、在这个目录下放置jsp页面。3、在此目录下建立WEB-INF目录,在其中放置faces-config.xml和web.xml。4、在WEB-INF目录下建立class和lib目录。5、将bean的java code以包的形式放在class目录下(并且将它们编译)。6、将必要的.jar放在lib目录下。7、制作.war: jar cvf sample.war。8、将.war放到tomcat/webapps下接着就可以用http:/localhost:8080/sample来访问了。再分别把具体的东西解释下:1、必要的jar有六个,你可以像上面那样放到.war里,也可以直接将他们放到tomcat/common/lib中,而且这样的话,你就不必在每个.war中包含它们 :jsf/lib/jsf-api.jarjsf/lib/jsf-impl.jar:jsf/lib/jsf-impl.jartomcat/server/lib/commons-digester.jartomcat/server/lib/commons-beanutils.jartomcat/webapps/jsp-examples/WEB-INF/lib/jstl.jartomcat/webapps/jsp-examples/WEB-INF/lib/standard.jar2、bean class里面的getter和setter是前端和后端的管道,没什么好说的。3、jsf的页面要包含两个标签的定义:(f: core tags; h: HTML tags.)页面上似乎和struts差不多,看个例子: A Simple JavaServer Faces Application Please enter your name and password. Name: Password: 接受用户输入用户名和密码,里面是普通的html标签和jsf的标签,没什么太多东西。再看一个例子: A Simple JavaServer Faces Application Welcome to JavaServer Faces, ! 输出user bean的一个值(name)。4、两个xml的配置文件:faces-config.xml的内容: /index.jsp login /welcome.jsp user com.corejsf.UserBean session faces-config下面表明了从index.jsp通过login这个action,前进到welcome.jsp。managerd-bean表明了user的bean class,以及它的存活时间是在session级的。再看web.xml: Faces Servlet javax.faces.webapp.FacesServlet 1 Faces Servlet *.faces index.html servlet-mapping指定了url的后缀,welcome-file-list指定初识页(可以用这个页面前进到某个其他页面)。例 子讲完了,再讲下jsf的处理周期:jsf页面有encoding和decoding的过程,前者将jsf的元素树变换成html页面,后者将页面的内容 (form的数据等)变回jsf的元素,并由这些元素执行它们自己所定义的动作。具体的周期见下图,我还没完全弄懂,只是知道在每个过程之后都能处理 event。jsf学习笔记系列(二)Tag: jsf入门学习笔记 关于Bean的一些基础知识:1、bean的getter和setter可以操作indexed property,就像这样:T getFoo()T getFoo(int index)void setFoo(T newArray)void setFoo(int index, T newValue)但是JSF好像不支持indexed property,所以要在bean里面想办法。还有如果set和get的前缀后面有两个大写字母的话,那么相应property的头字母就不用像一般的规则那样处理,比如:getURL对应的property是URL,而不是uRL。2、Message Bundles:存放message的.properties文件比如在com/corejsf下,那你就可以这样用:如果你要用其他的语言,你可以定义_+指定语言的.properties,比如messages_perties。接着有三种方式实现它,我觉得以下这种比较好(修改WEB-INF/faces-config.xml ): en de 3、Backing Beans,还不清楚它的意思,好像它里面含有UIOutput和UIInput类型的成员,而且在页面上的用法也不一样。4、Bean Scopes:有三种:Request如果request被forward到其他request,那数据将丢失。Session通过cookies或者URL rewriting实现,实现是透明的。一个session只有再调用了不合法的方法或者time out的时候才会结束。Application所有的request和session里都可以访问。5、Configuring Beans:我们一般通过faces-config.xml来配置,不过也可以通过其他的配置文件,这些文件在WEB-INF/web.xml里指明,比如: javax.faces.CONFIG_FILES WEB-INF/navigation.xml,WEB-INF/beans.xml .我们可以在配置文件中直接初始化bean中成员的值,比如: user com.corejsf.UserBean session name me password secret list和map类型的也可以,例子就不说了。初始化的值如果不指定的话,默认是String的。6、Predefined Objects:以下这些是可以直接在页面上访问的object:header: a Map of HTTP header parameters, containing only the first value for each nameheaderValues: a Map of HTTP header parameters, yielding a Stringarray of all values for a given nameparam: a Map of HTTP request parameters, containing only the first value for each nameparamValues: a Map of HTTP request parameters, yielding a Stringarray of all values for a given namecookie: a Map of the cookie names and values of the current requestinitParam: a Map of the initialization parameters of this web application. requestScope: a Map of all request scope attributessessionScope: a Map of all session scope attributesapplicationScope: a Map of all application scope attributesfacesContext: The FacesContext instance of this request. view: The UIViewRoot instance of this request. JSF 是这样来找一个object的:它首先找这些predefined的,如果没有的话,它到servlet容器中寻找request、session、 application scope里面的object,如果还是没有的话,它就到配置文件里面的managed-bean里面定义的object去找,找到的话就把它放到相应 scope的list里面,这样下次就能找到拉。- JSF学习笔记系列(三) 关键词: JSF学习笔记(3) JSF学习笔记(3)Navigation:Navigation就是指在页面间的跳转,有两种方式:静态和动态。先说静态,就像前面的例子那样,你在页面上放一个按钮,然后在faces-config.xml里写上: /index.jsp login /welcome.jsp 就可以实现静态跳转了。要注意的是,里面指名的是文件名,而不是url。如果不指明from-view-id的话,那所有的页面都可以通过这个action来跳转,这个有时候很有用,比如logout的跳转。下面讲讲动态跳转,在页面上的按钮就应该这样写:loginController 是你的一个bean class,你用里面的一个函数verifyUser来实现动态跳转,这个函数必须返回String类型的值,然后在faces-config,.xml 里面指定每一种返回的String的对应跳转页面,如果返回的是null的话,就仍然回到原页面。比如在login的页面,当用户输入用户名和密码,并点 击确定按钮时,就可以调用action方法,这个方法在验证之后,返回“success”或者“failure”,然后根据faces-config里面 的规则跳转:在bean中:String verifyUser() if (.) return success; else return failure;faces-config.xml: success /success.jsp again /again.jsp .最后补充点里有用的元素:1、 使得“JSP container terminates the current request and sends an HTTP redirect to the client.”,这样会使页面跳转变慢,但是有一个好处:在browser的url栏里的地址会变化,便于用户将其加到bookmark中。比如: success /success.jsp 2、Wildcards:比如/secure/*,这样所有以secure打头的页面都可以利用这个跳转规则,3、可以指明从那个action来的,这样可以分别同样action名的跳转,比如: #quiz.answerAction again /again.jsp #quiz.startOverAction again /index.jspJSF学习笔记(四)JSF有Event Handling的机制,它支持三种event:1) Value change events:在input component中产生(发生在form提交之后,通常在Process Validations阶段即当验证通过之后),比如h:inputText, h:selectOneRadio,h:selectManyMenu:就像: . 2)Action events(通常在Invoke Application阶段即当所有的值都update之后):用于command components,像h:commandButton 和 h:commandLink。 3)Phase events:在JSF生命周期中会产生。 先来介绍下jsf的生命周期,它有以下这些阶段:Restore View Apply Request Values Process Validations Update Model Values Invoke Application(做action操作) Render Response(forward) 在这些阶段之间都可以产生events,并用event listener来处理他们,处理之后的jsf有以下三种结果:1)保持正常的周期2)跳过余下的周期, 直接到render response3)跳过余下所有的周期 对于value change events我们可以来个例子:在页面上 其中当选项改变时,调用javascript代码提交form。再来看看这个event listener:private static final String US = United States; . public void countryChanged(ValueChangeEvent event) FacesContext context = FacesContext.getCurrentInstance(); if(US.equals(String)event.getNewValue() context.getViewRoot().setLocale(Locale.US); else context.getViewRoot().setLocale(Locale.CANADA); 其中我们用event来访问改变之后的新值。 再来看看action events,我们用action listener来处理它。很重要的一点是action listener和action的差别:action是用来处理页面的跳转的,它不能涉及内部的逻辑这要用action listener来处理。两者的调用顺序是先action listener后action。看一个例子:在页面上我们这样写: listener是这样的:public void listen(ActionEvent e) FacesContext context = FacesContext.getCurrentInstance(); String clientId = e.getComponent().getClientId(context); Map requestParams = context.getExternalContext(). getRequestParameterMap(); int x = new Integer(String)requestParams.get(clientId + .x).intValue(); int y = new Integer(String)requestParams.get(clientId + .y).intValue(); outcome = null; if(washingtonRect.contains(new Point(x,y) outcome = washington; if(jeffersonRect.contains(new Point(x,y) outcome = jefferson; if(rooseveltRect.contains(new Point(x,y) outcome = roosevelt; if(lincolnRect.contains(new Point(x,y) outcome = lincoln; 而action是这样的:public String act() return outcome; 我们其实可以用其他的办法来处理action events和value change events的:我们可以采用f:actionListener和f:valueChangeListener 标签,这样做的好处是可以让一个component连接到多个event handler上面,就像这样: 要注意的是这里type里指明的是一个类名,具体的处理方法是此类中的processValueChange或者processAction方法。 现在已经知道一般的value change event和action event的处理时间,但是有时候有必要将这个处理时间推前,这时就要用到Immediate Components,具体的做法是这样的:对于value change events:将immediate属性加到input tag里面,并在listener的末尾加上FacesContext.renderResponse() ;对于action events:只需要加入immediate属性。 最后看phase events,与前两者不同的是,它的listener要在配置文件中指明,比如: com.corejsf.PhaseTracker 可以指明多个listener,他们都会被调用,其顺序和配制文件的顺序一致。我们的listener要继承PhaseListener接口,它有三个方法:PhaseId getPhaseId() /表明处理哪个phase的event,也可以PhaseId.ANY_PHASE来处理所有的phase void afterPhase(PhaseEvent) /在这个phase之前和之后所进行的处理 void beforePhase(PhaseEvent) 使用JSF构建数据驱动的应用程序 看了 使用JSF 构建数据库驱动的应用程序 一文后,动手做了练习。这是一个 订阅时事通讯的示例 Web 应用程序。订户通过提供他们的电子邮件地址、姓名和首选项进行注册。他们还必须选择一个口令, 以便以后可以更改他们的配置文件。 收获不少。1、 这个没有什么可说的。2、 登录页面link rel=stylesheet type=text/css href=典型的jstl加jsf,看来要好好学习jsp2.0了,赶上不形势啊!点击链接 Subscribe可进入subscribe.jsp(如图一),填订单页面。命令按钮的action绑定到了视图loginInfo Bean的loginAction()方法, loginAction() 方法会根据登录用户的角色(订户或管理员)返回 profile 或 list(导航法则在faces-config.xml文件中定义) , 请求转向订户修改配置文件页面 profile.jsp(图二) 或订户列表页面 list.jsp(图三)。先看看LoginInfoBean.java源码:package jsfdb.view;import jsfdb.model.LoginInfo;import jsfdb.model.Subscriber;import jsfdb.model.ModelUtils;import jsfdb.model.err.LoginException;import jsfdb.model.err.IncorrectPasswordException;import jsfdb.model.err.UnknownSubscriberException;public class LoginInfoBean extends LoginInfo public String login

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论