日期:2014-05-16  浏览次数:20388 次

JSF 中如果获取get请求参数

前沿:使用JSF的难兄难弟们,可能都为JSF中get请求郁闷过。。因为真正意义上的数据提交,在JSF中全部通过post进行。所以get请求,在JSF生命周期中处理确实有些蹩脚。。下面我给大家简单列举几种方式。

?

?

Page部分:

?

<h:commandButton(/Link也可以) value="提交(/浏览)" actionListener="#{homeAction.lookUpListener}" action="#{homeAction.lookUpAction}">

   <f:param id="id" name="id" value="1000"/>

   <!-- 如果你想基于a4j下异步提交参数 -->

   <!--

      <a4j:actionparam name="id" value="1000" id="id"></a4j:actionparam>

   -->


</h:commandButton(/Link)>

?

?

以上()中为可替换部分,你可以使用按钮,当然可以使用连接,不过他们是command类型。

?

静态get链接:

?

<h:outputLink value="...."...><f:param id="id" name="id" value="1000"/></h:outputLink>

?

?

下面给大家介绍一些,如果如何使用参数。

?

?

? 1)command组件中使用参数。

?

?

public void lookUpListener(ActionEvent event){
	UIParameter paramId=(UIParameter)event.getComponent().findComponent("id");
	System.out.print(paramId.getValue().toString());
.....	
}

public String lookUpAction(){
    HttpServletRequest request = FacesContext.getCurrentInstance().getExternalContext().getRequest() 

     Integer id = request.getParameter("id");
}

?

?? 第一,我们把<f:param>作为组件从触发事件的按钮或者链接中查找。以组件的形式处理,这种方式可以接受考虑。当然最好在listener中处理。

?

? 第二,我们使用http的方式去考虑,毕竟JSF生命周期的处理,还是基于servlet容器。但是需要走些弯路,从JSF应用容器上下文,获取servlet或者其他三方上下文,然后获取请求。。得到request,那么就很容易获取请求参数了。其实无论是command还是output组件,它的提交数据均可以在http中获取,但是command组件还可以通过listener事件去侦听。

?

?

?? 2)对于http--get请求

?

?

??? 在JSF中get请求处理,也无外乎那么一套,如果你是在找不到更好的方案,那你就回归到servlet--http普通的web模式。JSF基于servlet当然能够在任何时候获取http的数据。

?

?? 对于静态get请求如:http://***.com/home.jspx?id=1000,你可以参看上面的<h:outputLink>

?

?? 如果你知道JSF的生命周期,那么一切都那么简单。如果你不太清楚,那么就简单的认为在渲染页面的之前,必须首先实例化后台bean,在实例化bean的时候,bean可以获取请求中的数据。。。只要bean不脱离JSF应用管理器,那么http等所有servlet、jsp能干的事情,JSF都给你提供了接口。。。

?

?

?

public class HomeAction {

   /**
    *查询字符串
    */
  private Integer id;//get,setter方法别忘了。

  public HomeAction(){
   //如果JSF准备渲染页面,那么它肯定需要执行构造参数,前提是你定义了这个默认构造函数
    HttpServletRequest request = FacesContext.getCurrentInstance().getExternalContext().getRequest() 
    id = request.getParameter("id");//自己进行类型转换

   
  }
   
}

?

?此时id的值被更新,如果id参数是通过command组件提交的,这个id可以在“更新模型”生命周期之后的阶段周期中被使用:如调用listener方法,action驱动等等。

?

?

?

? 3)seam中使用参数,依赖注入是神话

?

?? 无论你通过何种output/command等传递参数导航,均可使用如下模板:

?

?

......
@requestParamter
private Integer id;//自动类型转化,但是你需要自己祈祷类型正确



public void lookUpAction(){
  //此处可以直接使用id,因为生命周期中此id已经被seam拦截并通过serlvet处理。
   log.info("id:"+id);
}

?

?

如果你对生命周期不太理解,请参见本人的博客。

1 楼 yinlongfei 2010-05-13  
seam提供这个注释真是太爽啦,很方便
@requestParamter 
private Integer id;