??xml version="1.0" encoding="utf-8" standalone="yes"?>av网在线观看,欧美女子与性,日韩精彩视频http://www.aygfsteel.com/yanzhou/category/12970.html喂马, 劈柴, 周游世界zh-cnWed, 28 Feb 2007 04:47:56 GMTWed, 28 Feb 2007 04:47:56 GMT60[ZZ] JSF详解(从jsf的运行原理开始介l了jsf)http://www.aygfsteel.com/yanzhou/archive/2006/09/30/73012.html周游世界周游世界Sat, 30 Sep 2006 05:23:00 GMThttp://www.aygfsteel.com/yanzhou/archive/2006/09/30/73012.htmlhttp://www.aygfsteel.com/yanzhou/comments/73012.htmlhttp://www.aygfsteel.com/yanzhou/archive/2006/09/30/73012.html#Feedback0http://www.aygfsteel.com/yanzhou/comments/commentRss/73012.htmlhttp://www.aygfsteel.com/yanzhou/services/trackbacks/73012.html JSF详解(从jsf的运行原理开始介l了jsf)

1Q?  l构Q?
a)     l构图:

   
b)     说明QJSF以MVC模式为基Q与Struts不同QJSF的目标是希望以一个与Swing相类似的方式来开发网,因此Q从JSF的结构图当中Q他的核心概念不是页面,而是控g树,也就是说Q当用户提交一个请求时QJSF会先页面上的组件先转换ZSwing当中cM的,由容器和控gl成的控件树Q然后数据和事g被设|到对应的控件上Q然后以一U与SwingcM的方式,来处理后l的h。控件树是整个JSF的核心,所有其他的一切一切都是围l着q棵控g树展开的?
2Q?  生命周期Q?
a)     周期图:

 
  b)     说明Q?
  b)     说明Q?
  b)     说明Q?
              i.         Restore ViewQJSF的处理核心是控g树,他会先将面上所声明的控件{换ؓ一|件树Q后l的操作在q颗控g树上q行。ؓ了提高性能Q系l会Z前生成的控g树提供缓存。Restore View的工作就是在~存当中查找是否存在之前已经生成好的控g树,如果没有Q则Ҏ面的内容,重新生成?
            ii.         Apply Request ValuesQ把h当中的数据设|到控g树当中对应的控g当中厅R?
          iii.         Process ValidationsQ如果某一控g有配|ValidatorQ则q些Validator对刚设|的数据的正性和合法性进行验证?
            iv.         Update Model ValuesQ控件树上的控g更新其底层所对应的模型?
              v.         Invoke ApplicationQ对产生的事件进行分发?
            vi.         Render ResponseQ构Z为响应的控g树?
3Q?  UIQ?
a)     l构图:



b)     控gQ?
              i.         说明QJSF通过标签库,提供了一些主要控件的实现。包括标{,文本框,单选框Q列表等。由于JSF使用一U类gUI的方式来l织lgQ所以,除了基本的组件以外,q提供了一些用于布局的容器,例如面板{。在q里有一个要注意的地方就是,一般情况下Q页面的内容应该攑ֈJSF提供的view标签里面?
            ii.         代码Q?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="1">
<h:outputLabel>
<h:outputText value="User ID"/>
</h:outputLabel>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
c)     事g处理Q?
              i.         说明Q与Struts不同Q由于JSF使用以控件树Z心的方式来处理请求,所以,Ҏ供了一U额外的cMSwing的,事g处理的方式来处理用户的输入事件。JSF提供了两U事件类型,ActionEventQ用于处理命令和ValueChangeEventQ用于处理数据更攏V?
            ii.         代码Q?
模型代码Q?
package nick;
public class UserActionListener implements ActionListener {
  public void processAction(ActionEvent arg0)
throws AbortProcessingException {
    FacesContext context = FacesContext.getCurrentInstance();
    ValueBinding binding = Util.getValueBinding("#{user}");
    User user = (User) binding.getValue(context);
    String id = user.getId();
  }
}
面代码Q?
<%@page contentType="text/html;charset=gb2312" import="java.util.*"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="id">
<h:outputText value="User ID"/>
</h:outputLabel>
<h:commandButton id="regist" value="注册">
<f:actionListener type="nick.UserActionListener"/>
</h:commandButton>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
注:通过嵌套actionListener标签Q我们可以ؓ一个控件注册监视器?

4Q?  数据l定Q?
a)     说明Q数据绑定要解决的问题就是如何把模型中的|l定到页面的控g上。在JSF当中q可以通过JSF所提供的配|文件来完成?
b)     代码Q?
配置文gQ?
<faces-config>
<managed-bean>
<managed-bean-name> user </managed-bean-name>
<managed-bean-class> nick.User </managed-bean-class>
<managed-bean-scope> session </managed-bean-scope>
</managed-bean>
</faces-config>
模型代码Q?
package nick;
public class User {
  private String id = "Nick";
public void setId(String id) {
    this.id = id;
  }
  public String getId() {
    return this.id;
  }
}
面代码Q?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
  <head><title>Test</title></head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="id">
<h:outputText value="User ID"/>
</h:outputLabel>
<h:inputText id="id" value="#{user.id}"/>
          </h:panelGrid>
        </h:form>
    </f:view>
  </body>  
</html>
注:通过配置文gQ我们把nick.Usercȝ定到名称user上,然后面的代码就可以直接使用#{user.xxx}来引用Userq个cM的各个字Dc?
5Q?  面:
a)     面到控制器Q?
              i.         说明QJSF通过使用Ҏl定的方式来定义从页面到控制器的跌{Q和数据l定相同Qؓ了能够正找到被l定Ҏ所在的c,我们需要首先在配置文g当中声明managed-beanQ然后通过讄控g的action属性,定义面到控制器的蟩转逻辑?
            ii.         代码Q?
配置文gQ?
<faces-config>
<managed-bean>
<managed-bean-name> user </managed-bean-name>
<managed-bean-class> nick.User </managed-bean-class>
<managed-bean-scope> session </managed-bean-scope>
</managed-bean>
</faces-config>



模型代码Q?
package nick;
public class User {
  public String regist() {
    return "regist";
  }
  public String login() {
    return "login";
  }
}
面代码Q?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="2">
<h:commandButton id="regist"
action="#{user.regist}" value="注册"/>
<h:commandButton id="login"
action="#{user.login}" value="登陆"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
注:上述的页面代码,把注册按钮的动作l定到Usercȝregist()ҎQ把登陆按钮的动作绑定到Usercȝlogin()Ҏ。因此,当这两个按钮被点LQ对应的Ҏ被调用Q用于实现页面流的方法,必须声明为publicQ而且她不接受参数Q且q回值必MؓString?
b)     控制器到面Q?
              i.         说明QJSF通过名称l定的方式,来定义从控制器到面的蟩转。ؓ了实C控制器到面的蟩转,我们需要在配置文g当中定义一?lt;navigation-rule>Q这些rule主要定义了怎么Ҏ上述action标签所l定的方法的q回值来查找下一面?
            ii.         代码Q?
配置文gQ?
<faces-config>
<managed-bean>
<managed-bean-name> user </managed-bean-name>
<managed-bean-class> nick.User </managed-bean-class>
<managed-bean-scope> session </managed-bean-scope>
</managed-bean>



<navigation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-outcome>regist</from-outcome>
<to-view-id>/regist.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/login.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
模型代码Q?
package nick;
public class User {
  public String regist() {
    return "regist";
  }
  public String login() {
    return "login";
  }
}
注:上述的配|文件定义了一?lt;navigation-rule>Q该rule指明了如果?index.jsp”页面通过她内部的某个控g的action属性发生了跌{Q那么当该蟩转方法的q回gؓ字符东yregist”时Q则面蟩转到对应的?regist.jsp”中Q同理,如果q回gؓ“login”,则页面将跌{到?login.jsp”?
6Q?  数据传输Q?
a)     面到控制器Q?
              i.         说明Q在JSF的页面代码当中,通过数据l定Q我们把控g的value|与某个后台的数据bean兌h。而在前述的生命周期部分,我们看到Q当一个JSFh到达Ӟ他需要经历Restore ViewQApply Request Value{步骤,而Apply Request Value部分的工作,是把请求当中的值绑定到q个后台的bean之中Q因此,我们不需要考虑面中的Form值如何传入到后台的bean当中?
q一步,如果录入控g的value属性,和命令控件的action属性都是绑定在同一个bean上的话,那么在页面蟩转时Q我们可以直接访问到bean的属性倹{但是ؓ了不污染模型Q和实现控制与模型的分离Q一般情况下Q我们需要把输入控g的value值绑定到数据beanQ而把命o控g的action值绑定到控制beanQ由于两个bean不是同一个,所以,控制bean需要一U方法来获取数据bean中的属性倹{?
            ii.         代码Q?
配置文gQ?
<faces-config>
<managed-bean>
<managed-bean-name> user </managed-bean-name>
<managed-bean-class> nick.User </managed-bean-class>
<managed-bean-scope> session </managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name> action </managed-bean-name>
<managed-bean-class> nick.Action </managed-bean-class>
<managed-bean-scope> session </managed-bean-scope>
</managed-bean>
</faces-config>
模型代码Q?
        package nick;
public class User {
private String id = "Nick";
public void setId(String id) {
this.id = id;
}
public String getId() {
return this.id;
}
}
package nick;
public class Action {
  public String regist() {
    ValueBinding binding = Util.getValueBinding("#{user}");
    User user = (User)
binding.getValue(FacesContext.getCurrentInstance());
            ?
    return "regist";
  }
}
面代码Q?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="id">
<h:outputText value="User ID"/>
</h:outputLabel>
<h:inputText id="id" value="#{user.id}"/>
<h:commandButton id="regist"
action="#{action.regist}" value="注册"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>



注:面代码当中把输入控件的valuel定Cuser的id上,把命令控件的action值绑
定到action的regist上。当用户点击登陆按钮Ӟaction的regist()Ҏ会被调用,
而在该方法内部,Z获取之前面中的信息Q我们可以用ValueBindingcR该cM?
的数据绑定表辑ּ与页面中的类伹{?
b)     控制器到面Q?
              i.         说明Q通过之前的叙qͼ我们可以发现Q当我们需要把数据从控制器传到面Ӟ我们同样可以使用数据l定的方式,因ؓQ当我们通过数据l定表达式,获取到某个页面当中所使用的模型实例时Q便可以在该实例上直接调用对应的set()ҎQ来讑֮所希望的倹{?
7Q?  插g功能Q?
a)     ConverterQ{换)Q?
              i.         说明Q当模型中的某个字段需要在面上显C时Q她需要先被{换ؓ字符串类型;而用户在面输入的字W串|在传到模型中时也需要根据模型对应字D늚cdQ进行一个{换。另外,׃国际化的要去Q模型中的值在不同的地Z有不同的表示方式。ؓ了解决以上这些问题,JSF提供了Converter的实玎ͼ她主要做的事情就是根据所在的地区Q对面数据和模型数据进行双向的转换?
            ii.         代码Q?
模型代码Q?
package nick;
public class User {
  private Date date = new Date();
  public Date getDate() {
    return date;
  }
  public void setDate(Date date) {
    this.date = date;
  }
}
面代码Q?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="date">
<h:outputText value="date"/>
</h:outputLabel>
<h:inputText id="date" value="#{user.date}">
<f:convertDateTime pattern="M/d/yyyy"/>
</h:inputText>
<h:message for="date"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
注:通过嵌套的convertXXX标签Q我们可以ؓ控g配置用于转换的{换器。我们可以用两U方式来注册转换器,一是通过控g的convert属性,另外一U就是通过嵌套的convertXXX标签。如果在转换的时候发生错误,那么JSF蟩q{换以后的步骤Q而直接蟩到Render Response步骤Q生成响应,q在FacesContext里添加一个出错的MessageQ该Message的内容可以通过message标签q行昄?br />b)     ValidateQ验证)Q?
              i.         说明Q在数据被交付后台处理以前,我们可以通过验证器,来验证输入的数据是否合法Q这包括数值的大小Q或者是字符串的长度{。用验证器的好处就是我们可以把验证的代码从控制代码中单独出来,以便理和重用?
            ii.         代码Q?
面代码Q?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="id">
<h:outputText value="User ID"/>
</h:outputLabel>
<h:inputText id="id" value="#{user.id}">
<f:validateLength minimum="3" maximum="6"/>
</h:inputText>
<h:message for="id"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
注:通过嵌套的validateXXX标签我们可以Z个控件注册一个验证器Q与转换器不同,我们可以Z个控件注册多个验证器Q以q行复杂的验证。注册验证器的方法也有两个,一是通过控g的validator属性,另外一U就是通过嵌套的validateXXX标签。与转换器类|当验证失败时Q失败的原因也会以Message的Ş式被攑ֈFacesContext内,在页面内通过message标签可以寚w误信息进行显C?
8Q?  国际化支?
a)     说明Qؓ了提供对国际化的支持QJSF使用了与StrutscM的通过资源文g的Ş式,从外部获取需要显C的内容?
b)     代码Q?
配置文gQ?
<faces-config>
<application>
<message-bundle>nick.Messages</message-bundle>
<locale-config>
<default-locale>cn</default-locale>
<supported-locale>en</supported-locale>
</locale-config>
  </application>
</faces-config>
面代码Q?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<f:loadBundle basename="nick.Messages" var="message"/>
<body>
<f:view>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="id">
<h:outputText value="#{message.id}"/>
</h:outputLabel>
<h:inputText id="id" value="#{user.id}"/>
                </h:panelGrid>
</h:form>
</f:view>
</body>
</html>
注:如果我们需要考虑国际化的问题Ӟ那么我们需要ؓ同一个资源提供多个地区的资源文g实现。通过在配|文件中声明message-bundleQ我们可以注册资源文件的多个版本Q以上面ZQ她注册了两个资源文件nick.Messages_cn.properties和nickcen.Messages_en.properties分别对应于中国和英国地区Q当面当中通过loadBundle标签d资源Ӟ她就会根据所在的区域Q去查找对应的文件。当Ӟ所有资源文仉应该使用java所提供的native2ascii工具Q进行一下预处理?
9Q?  JSF定制Q?
a)     说明Q该部分主要展示如何对JSF提供的{换器Q验证器和控件进行定Ӟ以扩展JSF的功能?
b)     配置文g定制Q?
              i.         说明QJSF提供了比Struts更多的定制特性,包括用于实例化前端控制FacesServelt的faces-context-factoryQ用于实例化控gl画RenderKit的render-kit-factoryQ进行声明周期管理的lifecyle-factory{?
            ii.         代码Q?
配置文gQ?
<faces-config>
  <factory>
    <application-factory>?lt;/application-factory>
    <faces-context-factory>?lt;/faces-context-factory>
    <lifecycle-factory>?lt;/lifecycle-factory>
    <render-kit-factory>?lt;/render-kit-factory>
  </factory>
</faces-config>
c)     转换器定Ӟ
              i.         说明Q通过扩展JSF提供的Converter接口Q我们可以定义自q转换器。而ؓ了能在页面上使用自定义的转换器,我们需要在配置文g中,对{换器q行注册?
            ii.         代码Q?
配置文gQ?
<faces-config>
<converter>
<converter-id>nameConverter</converter-id>
<converter-class>nick.NameConverter</converter-class>
</converter>
</faces-config>
模型文gQ?
package nick;
public class NameConverter implements Converter {
public Object getAsObject(FacesContext ar0, UIComponent ar1, String ar2) {
    return ar2.toLowerCase();
}
public String getAsString(FacesContext ar0, UIComponent ar1, Object ar2) {
    retrun ((String) arg2).toUpperCase();
}
}
面文gQ?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<f:loadBundle basename="nick.Messages" var="message"/>
<body>
<f:view>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="id">
<h:outputText value="#{message.id}"/>
</h:outputLabel>
<h:inputText id="id"
value="#{user.id}" immediate="true">
<f:converter converterId="nameConverter"/>
</h:inputText>
<h:message for="id"/>
<h:commandButton
action="#{action.regist}" value="Regist"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
注:当页面数据{换ؓ后台数据ӞConverter的getAsObject()Ҏ会被调用。而当需要把后台数据昄到页面中ӞgetAsString()Ҏ会被调用。这里,我们注意刎ͼ我们的Converter是不能带M配置属性的Qؓ了让我们的Converter能够在页面中增加属性,我们需要进一步的定义自己的标{。除了可以根据converter-id来注册{换器以外Q我们还可以使用converter-for-class标签来ؓ某一特定的Javacd注册转换器。如果在转换q程中发生错误的话,那么我们可以通过抛出ConverterException来停止后l的工作?
d)     验证器定Ӟ
              i.         说明Q通过扩展Validator接口Q我们可以定义自q验证器。而ؓ了能在页面上使用自定义的验证器,我们需要在配置文g中,寚w证器q行注册?
            ii.         代码Q?
配置文gQ?
<faces-config>
<validator>
<validator-id>nameValidator</validator-id>
<validator-class>nick.NameValidator</validator-class>
</validator>
</faces-config>
模型文gQ?
package nick;
public class NameValidator implements Validator {
  public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
        throws ValidatorException {
    String name = (String) arg2;
    if (!name.startsWith("nick")) {
        throw new ValidatorException(new FacesMessage(
            "name must start with nick"));
    }
  }
}



面文gQ?
<%@page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="
http://java.sun.com/jsf/core " prefix="f"%>
<%@ taglib uri="
http://java.sun.com/jsf/html " prefix="h"%>
<html>
<head><title>Test</title></head>
<f:loadBundle basename="nick.Messages" var="message"/>
<body>
<f:view>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="id">
<h:outputText value="#{message.id}"/>
</h:outputLabel>
<h:inputText id="id" value="#{user.id}">             <f:validator validatorId="nameValidator"/>
</h:inputText>
<h:message for="id"/>
<h:commandButton
action="#{action.regist}" value="Regist"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
注:定制验证器的操作与定制{换器的操作大致相同,如果我们希望通过面的方式ؓ验证器提供属性的话,那么我们也需要定义额外的标签?
e)     控g定制Q?
              i.         说明QJSF允许用户ZJSF的框Ӟq行控g的定Ӟ控g定制需要完成以下几部分的工作,1.需要一个控件实现类Qؓ了能让控件在面上用,我们的控件还需要在配置文g中,通过component标签q行注册Q?.用于控g渲染的Renderc;3.用于在页面上使用控g的标{?
f)     控g树定Ӟ
              i.         说明Q除了可以通过面标签来声明控件以外,我们可以通过E序的方式来定制控g树,通过调用FacesContext上的getViewRoot()ҎQ我们可以获得控件树的根引用Q通过该引用,我们可以动态的Ҏ件进行增删,或者动态的为某一控g增删事g监听器,和验证器{?
g)     Web帔RQ?
              i.         说明QJSF提供了一l操作applicationQcontextQsessionQcookiesQpage{常量的Ҏ。通过调用FacesContext上的getExternalContext()ҎQ我们可以获得一个对ExternalContext的引用,通过该引用我们可以获取所有我们希望用的sessionQcookies{常量的引用Q除此以外,我们q能获取request当中的头信息和请求信息等?/font>


周游世界 2006-09-30 13:23 发表评论
]]>
[译] JSF for Nonbelievers: Clearing the FUD about JSFhttp://www.aygfsteel.com/yanzhou/archive/2006/07/17/58640.html周游世界周游世界Mon, 17 Jul 2006 12:54:00 GMThttp://www.aygfsteel.com/yanzhou/archive/2006/07/17/58640.htmlhttp://www.aygfsteel.com/yanzhou/comments/58640.htmlhttp://www.aygfsteel.com/yanzhou/archive/2006/07/17/58640.html#Feedback0http://www.aygfsteel.com/yanzhou/comments/commentRss/58640.htmlhttp://www.aygfsteel.com/yanzhou/services/trackbacks/58640.html阅读全文

周游世界 2006-07-17 20:54 发表评论
]]>
վ֩ģ壺 ڽ| Ĵʡ| | | ¡| ˱| | | Ҧ| ϴ| | | °| ˻| | | | ű| ȫ| | | ƽ| | | | Ȫ| | | ԣ| ʯ| | | | | Դ| ƽң| | | | ˫| |