【问题标题】:Not getting value from query string未从查询字符串中获取值
【发布时间】:2013-04-24 07:07:57
【问题描述】:

在我的申请中有一个注册表单,提交后,它将被邮寄给管理员接受/拒绝注册。

在邮件发送时,一个唯一的键会附加Accept button。单击此按钮后,控制器中将触发actionListener,并且我想从查询字符串中读取唯一键值,但我得到空值,尽管 URL http://localhost:8080/BridgeFront/app/AproveReq.xhtml?activityId=LFGP13005 包含查询字符串参数。我做错什么了吗?如果有人知道,请告诉我。 我想在我的项目中说一件事,我正在使用 spring 框架。

在 web.xml 中我写了这个用于过滤:

<filter>
    <filter-name>openSessionInView</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>

AproveReq.xhtml的代码如下:

<h:form>
<p:commandButton value="Aprove" action="#{aproveDeny.xyz}"/>
<p:commandButton value="Deny"/>
</h:form>

控制器如下:

@ManagedBean(name = "aproveDeny")
@RequestScoped
public class AproveDeny{

@ManagedProperty("#{param.activityId}")

private String activityId;

public void xyz(){
    System.out.println("-------+++"+getActivityId());
}

public String getActivityId() {
    return activityId;
}

public void setActivityId(String activityId) {
    this.activityId = activityId;
}}

这样设置邮件正文(MimeMessage):

MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setTo("xxxxxx.xxxx@gmail.com");
StringBuilder text = new StringBuilder();
StringBuilder text = new StringBuilder();
text.append("<html>");
text.append("<body>");
text.append("<a href="+URL+"?activityId="+ActivityId+">Accept Or Deny request.."+"</a>");
text.append("</body>");
text.append("</html>");
mimeMessageHelper.setText(text.toString(), true);

【问题讨论】:

    标签: java spring jsf-2 query-string jakarta-mail


    【解决方案1】:

    您不必在视图范围内使用托管 bean。首先将其更改为 request scoped,然后将参数注入到类中的变量中。

    @ManagedBean(name = "activityEntryController")
    @RequestScoped
    public class ActivityEntryController{
    
    @ManagedProperty(value="#{param.activityId}")
    private String activityId;
    
    public void aproveActivityEntryReq(ActionEvent event){
      // make your work
    }  
    }
    

    如果您的 url 中有多个参数,您应该在类中再添加一个变量并使用 ManagedProperty 对其进行注释,例如,如果您还想在 url 参数中发送一封电子邮件

    @ManagedProperty(value="#{param.email}")
    private String email;
    

    【讨论】:

    • 感谢@oko 的回复,我不明白@ManagedProperty(value="#{param.activityId}") 没有这个,我在requestScoped 中尝试了我的bean 范围它不起作用,request.getQueryString() 返回null。
    • ManagedProperty 是一个特殊的注解,它定义了一个接受 url 参数并直接注入其中的变量。当您的管理员打开页面时,此 activityId 将被注入到 key 变量中。 ManagedProperty 仅适用于 requestScoped bean。
    • 自动将参数activityId注入变量key??
    • 是的,JSF 有很多很好的专长。你为什么不试一试?
    • 如果queryString中有多个参数会发生什么?
    【解决方案2】:

    将元数据添加到您的 AproveReq.xhtml 页面会将 activityId 传递给您的托管 bean

    <f:metadata>
      <f:viewParam name="activityId" value="#{aproveDeny.activityId}"/>
    </f:metadata>
    

    元数据标签应该在页面的开头,即在head标签之前。

    【讨论】:

    • 不,它也返回 null。我认为问题是在其他地方产生的。但我不知道我在哪里做错了。谢谢回复。
    • hmm 我已经复制了您的代码 jsf 页面和控制器,我所做的唯一更改是添加了元数据标签并点击了传递 activityId 的 url,它起作用了。
    • 从哪里设置查询字符串值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2020-11-09
    • 2015-11-02
    相关资源
    最近更新 更多