使用param标记抑制空参数

时间:2014-09-11 20:10:46

标签: java jsp struts2 url-parameters

我编写的JSP用于许多操作。它有一个参数链接

链接:

<s:a namespace="/some" action="view">
  <s:param name="purpose" value="%{purpose}"/>
  <s:param name="type" value="%{type}"/>
  <s:property value="%{name}"/>
</s:a>

动作类:

public class ViewAction extends ActionSupport {

  private Long purpose;
  private Long type;
  private String name;

  public Long getPurpose() {
    return purpose;
  }

  public void setPurpose(Long purpose) {
    this.purpose = purpose;
  }

  public Long getType() {
    return type;
  }

  public void setType(Long type) {
    this.type = type;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

通常我会初始化两个参数,但有时一个参数是null。因此,链接是使用href生成的

/context/some/view?purpose=1&type=

但我想删除&type=

我在Param Examples尝试了一个例子。

<s:a namespace="/some" action="view">
  <s:param name="purpose" value="%{purpose}"/>
  <s:param name="type" value="%{type}"/>
  <s:property value="%{name}"/>
  <s:param name="suppressEmptyParameters" value="true"/>
</s:a>

但它无效

我也试过

<s:a namespace="/some" action="view">
  <s:param name="purpose" value="%{purpose}"/>
  <s:param name="type" value="%{type}" suppressEmptyParameters="true"/>
  <s:property value="%{name}"/>
</s:a>

我得到了

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
    at org.apache.struts2.components.Param.end(Param.java:129)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)

如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

该行<s:param name="suppressEmptyParameters" value="true"/>没有意义,应该从<s:param>文档中删除。

<s:param name="type" value="%{type}" suppressEmptyParameters="true"/>是抑制空参数的正确方法,因为bug WW-4275而无法使用String-s。

同时,在下一个版本发布之前,您可以使用toString()方法来避免ClassCastException例外。

<s:param name="type" value="type.toString()" suppressEmptyParameters="true"/>