JSF中ManagedBean无法获取URL请求参数country问题求助
问题原因及解决方案
你遇到的核心问题是JSF表单默认采用POST方式提交请求,而你初始访问页面时的country=123属于GET请求的URL参数——这两种请求的参数存储位置是完全分开的,POST提交时不会自动携带之前的GET参数,所以你的submit方法只能拿到表单自身的参数(比如组件ID、ViewState这些),自然取不到country的值。
下面给你三种可行的解决办法:
方法1:页面加载时缓存GET参数到Bean属性
在Bean中添加初始化方法,在页面第一次加载(GET请求)时就把URL参数存到Bean的属性里,这样后续POST提交时直接使用该属性即可:
import javax.annotation.PostConstruct; // 保留原有的导入 @ManagedBean @SessionScoped public class HelloBean implements Serializable { private static final long serialVersionUID = 1L; private String name; private String country; // 新增存储country的属性 // 页面初始化时执行,获取GET参数 @PostConstruct public void init() { FacesContext fc = FacesContext.getCurrentInstance(); Map<String,String> params = fc.getExternalContext().getRequestParameterMap(); this.country = params.get("country"); System.out.println("页面加载时获取到的country: " + country); } // 保留原有的getName/setName方法 public String submit() { // 直接使用缓存好的country属性 System.out.println("submit时的country:" + country); return "welcome"; } // 可选:给country添加getter/setter,方便后续其他场景使用 public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } }
方法2:用隐藏字段在表单中传递参数
如果不想修改Bean的结构,可以在页面的表单里添加一个隐藏字段,绑定URL参数的值,这样POST提交时会把这个参数一起发送:
<h:form> <h:inputText value="#{helloBean.name}"></h:inputText> <!-- 添加隐藏字段,绑定GET参数country的值 --> <h:inputHidden value="#{param.country}" /> <h:commandButton value="Welcome Me" action="#{helloBean.submit}"> </h:commandButton> </h:form>
这样提交表单时,param.country会把初始GET参数的值填入隐藏字段,你的submit方法就能通过params.get("country")拿到对应的值了。
方法3:将表单提交方式改为GET(不推荐)
如果你希望提交时保留URL参数,可以把表单的提交方式改成GET:
<h:form method="get"> <h:inputText value="#{helloBean.name}"></h:inputText> <h:commandButton value="Welcome Me" action="#{helloBean.submit}"> </h:commandButton> </h:form>
不过这种方式不推荐,因为GET请求会把所有表单参数(包括JSF的ViewState)暴露在URL中,既不安全也不美观,仅适合非常简单的场景。
附:我也很期待新增的代码粘贴功能,确实能让代码分享更顺畅😊
内容的提问来源于stack exchange,提问作者James Baker
相关产品推荐
相关产品推荐

