前沿:使用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); }
如果你对生命周期不太理解,请参见本人的博客。