JSF核心编程之7 JSF事件处理

news/2024/7/4 23:08:20 标签: jsf, 编程, string, action, null, image


1.三种事件:
阶段事情,生命周期事情
值变化事件
动作事件
2JSF生命周期(包含6个阶段)
重建视图->应用请求值->处理事件(直接事件)->处理验证->处理事件(值事件)->

呈现响应<-处理事件(动作事件)<-调用应用程序<-处理事件<-更新模型值

3值变化事件
valueChangeListener
例:根据下拉选项来重构视图
    <h:selectOneMenu value="#{newsBean.news.typeId}" οnchange="submit()"
    valueChangeListener="#{newsBean.typeChanged}"  immediate="true">
      <f:selectItems value="#{newsBean.typeNames}"/>
    </h:selectOneMenu>
事件javax.faces.event.ValueChangeEvent
public void typeChanged(ValueChangeEvent event)
    {
        FacesContext context=FacesContext.getCurrentInstance();
        if(("中国").equals((String)event.getNewValue()))
        {
            //如果选择的是国内,就显示省市
        }
        else
        {
            //显示州
                       //context.getViewRoot().setLocale(Locale.US);//显示美国的视图
        }
        context.renderResponse();

    }

4动作事件
 动作之前调用动作监听器
事件:javax.faces.event.ActionEvent;
  <h:commandButton image="face.jpg" actionListener="#{newsBean.handleMouseClick}" action="#{newsBean.navigate}" immediate="true">
    </h:commandButton>

    private String outcome=null;
    private Rectangle firstRect=new Rectangle(70,30,40,40);
    private Rectangle secondRect=new Rectangle(115,45,40,40);
   
    public void handMouseClick(ActionEvent e){
        FacesContext context= FacesContext.getCurrentInstance();
        String clientId=e.getComponent().getClientId(context);
        Map requestParams=context.getExternalContext().getRequestParameterMap();
       
        int x=Integer.parseInt((String)requestParams.get(clientId+".x"));
        int y=Integer.parseInt((String)requestParams.get(clientId+".y"));
       
        outcome=null;
        if(firstRect.contains(new Point(x,y)))
        {
            outcome="firstPage";  //如果点击第一个矩形中的点,就跳转到第一个页面
        }
        if(secondRect.contains(new Point(x,y)))
        {
            outcome="secondtPage";//如果点击第二个矩形中的点,就跳转到第二个页面
        }
    }

    public String navigate()
    {
        return outcome;
    }
5事件监听器标签 (这个标签比直接写到组件中的好处就是:一个组件可以同时有多个 监听器)
但标签监听器是在属性指定的监听器后面被调用
  1)
  <h:selectOneMenu value="#{newsBean.news.typeId}" οnchange="submit()" immediate="true">
      <f:valueChangeListener type="com.pp.TypeListner"/>
      <f:selectItems value="#{newsBean.typeNames}"/>
    </h:selectOneMenu>
 自定义的事件监听器必须继承ValueChangeListener
import java.util.Locale;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;
public class TypeListner implements ValueChangeListener{
    public void processValueChange(ValueChangeEvent event)    {
         FacesContext context= FacesContext.getCurrentInstance();
         if("中国".equals((String)event.getNewValue())){
             context.getViewRoot().setLocale(Locale.CHINA);
         } else{ //... }}
              context.renderResponse();
}

2) <h:commandButton image="face.jpg" action="#{newsBean.navigate}" immediate="true">
       <f:actionListener type="com.pp.NewsListener"/>
    </h:commandButton>
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
public class NewsListener implements ActionListener {
    private String outcome=null;
    private Rectangle firstRect=new Rectangle(70,30,40,40);
    private Rectangle secondRect=new Rectangle(115,45,40,40);
    public void processAction(ActionEvent event) {
        FacesContext context= FacesContext.getCurrentInstance();
        String clientId=event.getComponent().getClientId(context);
        Map requestParams=context.getExternalContext().getRequestParameterMap();
        int x=Integer.parseInt((String)requestParams.get(clientId+".x"));
        int y=Integer.parseInt((String)requestParams.get(clientId+".y"));
        outcome=null;
        if(firstRect.contains(new Point(x,y)))
        {
            outcome="firstPage";  //如果点击第一个矩形中的点,就跳转到第一个页面
        }
        if(secondRect.contains(new Point(x,y)))
        {
            outcome="secondtPage";//如果点击第二个矩形中的点,就跳转到第二个页面
        }
    }
 
6直接组件
 直接事件在应用请求值阶段之后激发
但我们想跳过其他组件的验证。
值事件要两点:
1) immediate="true"
2)  context.renderResponse();
动作事件直接写 immediate="true"因为所有动作,直接或间接的,不管它们什么时候触发,
都直接进入呈现响应阶段。


7**从UI到服务器传递数据
有三个方法
1)f:param
此标签能将一个参数添加到组件
 <h:commandButton  action="#{newsBean.viewNews}">
       <f:param value="china" name="typeCode" />
    </h:commandButton>
FacesContext context= FacesContext.getCurrentInstance();
        Map<String,String > params=context.getExternalContext().getRequestParameterMap();
        String typeCode=params.get("typeCode");
2)f:setPropertyActionListener
<h:commandButton action="#{newsBean.view}">
      <f:setPropertyActionListener target="#{newsBean.typeCode}" value="china"/>
     </h:commandButton>
是属性可直接用
private String typeCode;

3)f:attribute

<h:commandButton actionListener="#{newsBean.change}">
       <f:attribute value="china" name="typeCode" />
    </h:commandButton>
public void Change(ActionEvent event)
    {
        UIComponent component= event.getComponent();
        Map<String,Object> attrs=component.getAttributes();
        String typeCode=(String)attrs.get("typeCode");
        //...
    }
8阶段事件  可用于调试,略。。。。


知识补充:
javax.faces.event.FacesEvent
javax.faces.context.FacesContext
java.util.Locale
java.util.Map
java.awt.Rectangle 
    contains(int x, int y)
          检查此 Rectangle 是否包含指定位置的点(x,y)。
java.awt.Point   new Point(x,y)


http://www.niftyadmin.cn/n/1425341.html

相关文章

oa开发好转行吗_【科技信息】数字档案管理系统上线OA

点击蓝字关注我们员工甲&#xff1a;数字管理系统是啥&#xff1f;你知道吗员工乙&#xff1a;额...我不知道&#xff0c;这是什么东东?员工甲&#xff1a;靓仔(女)语塞...我也不知道&#xff0c;听别人讲的。数字档案管理系统是为公司员工查询各类档案(人事档案除外)和利用电…

python:random函数

import random# 获取大于0且小于1的随机浮点型数字 print(random.random()) # 获取大于等于1且小于等于10之间的整数 print(random.randint(1,10)) # 获取大于等于1且小于10之间的整数 print(random.randrange(1,10)) # 从列表中多选一 print(random.choice([11,522,433])) # 从…

大数据实训报告_2020年河南专升本大数据报告

2020年河南专升本大数据报告一文带你全面深入地了解河南专升本各项报考大数据。现在将2020年河南省专升本各项指标数据正式公开&#xff0c;以帮助尚处于备考阶段的考生&#xff0c;能够清晰全面的了解河南省专升本报考现状及发展趋势&#xff0c;进而有针对性和目的性地进行专…

map知识补充

1 map知识 Map<String,List> resultnew HashMap<String,List>(); 取值&#xff1a; result.get(Object key); 设值&#xff1a; result.put(K key, V value);

python:hash模块

一、了解hash Python的hashlib提供了常见的摘要算法&#xff0c;如MD5&#xff0c;SHA1等等。 什么是摘要算法呢&#xff1f;摘要算法又称哈希算法、散列算法。它通过一个函数&#xff0c;把任意长度的数据转换为一个长度固定的数据串&#xff08;通常用16进制的字符串表示&a…

代码重构的方法和经验_why哥带你看看一个核心系统 3 万多行代码的重构之旅

经典著作《重构》这本书中有这么一段话&#xff1a;一开始&#xff0c;我所做的重构都停留在细枝末节上。随着代码趋向简洁&#xff0c;我发现自己可以看到一些设计层面的东西了&#xff0c;这些是我以前理解不到的&#xff0c;如果没有重构&#xff0c;我达不到这种高度。重构…

python:logging模块

一、basicConfig日志 1.案例 import logging# basicConf日志 LOG_FORMAT %(asctime)s %(name)s %(levelname)s %(pathname)s %(lineno)s %(message)s DATE_FORMAT %Y-%m-%d %H:%M:%S logging.basicConfig(levellogging.WARNING, #默认是WARNING级别formatLOG_FORMAT, …

python pyqt5获取文本框里输入的值_利用Python制作一个音乐播放器,堪比QQ音乐!...

导语利用Python制作一款简易音乐播放器&#xff0c;让我们愉快地开始吧~源代码python学习资料私信小编“01”即可获取&#xff01;开发工具Python版本&#xff1a;3.6.4相关模块&#xff1a;pyqt5模块&#xff1b;以及一些Python自带的模块。环境搭建安装Python并添加到环境变量…