【问题标题】:parameter in URL jsf2URL jsf2 中的参数
【发布时间】:2011-03-22 07:13:44
【问题描述】:

我需要这个链接:

http://myserver:/myproject/innerpage/clip.jsf&id=9099

从这样的代码中提取 id:

HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
String clipId = request.getParameter("id");

当我在 tomcat 上运行它时,我得到:

消息 /OnAir/innerpage/clip.jsf&id=9099

description 请求的资源 (/OnAir/innerpage/clip.jsf&id=9099) 不可用。

当我在没有 &id=9099 的情况下运行它时,它运行正常。

我怎样才能让它运行?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    URL 中路径和查询字符串之间的分隔符是?,而不是&& 是查询字符串中多个参数的分隔符,例如name1=value1&name2=value2&name3=value3。如果省略?,则查询字符串将被视为 URL 中路径的一部分,这将导致您遇到 HTTP 404 page/resource not found 错误。

    所以,这个链接应该可以工作http://myserver:port/myproject/innerpage/clip.jsf?id=9099


    也就是说,有一种更好的方法来访问请求参数。将其设置为值为#{param.id} 的托管属性。

    public class Bean {
    
        @ManagedProperty(value="#{param.id}")
        private Long id;
    
        @PostConstruct
        public void init() {
            System.out.println(id); // 9099 as in your example.
        }
    
        // ...
    }
    

    EL #{param.id} 返回request.getParameter("id") 的值。

    提示:当您需要从托管 bean 中的 JSF 引擎盖下获取“原始”Servlet API 时,请始终问自己(或在 SO 中):“难道没有 JSF 式的方式吗?”。很有可能你不必要地把事情复杂化了;)

    【讨论】:

    • 不客气。不,你只需要从某个地方开始。 10多年前我也犯过同样的错误。从你的错误中学习。每当您再次遇到相同的问题症状时,请记住它们。吸取的经验教训对未来很有价值。
    • 实际上,它对我不起作用。我的 bean 范围是视图,我得到了一个讨厌的异常:表达式 #{param.id} 引用的对象的范围,请求,比视图的引用托管 bean (clipBean) 范围短
    • 如果你想处理每个请求上的request参数,你的bean在逻辑上应该是request范围的。并非在每个请求上都构建视图范围的 bean。也许你会坚持你的“hack”或者创建一个单独的请求范围 bean 并将视图范围的 bean 注入新的请求范围 bean。
    【解决方案2】:

    您首先必须向我们展示您是如何在 JSF 中发送参数的,它是命令按钮/链接吗?输出链接?一种 ?你也在使用redirect=true吗?

    在请求期间您可能在某处丢失了 id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2012-07-28
      • 2013-07-30
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      相关资源
      最近更新 更多