Struts2 OGNL表达式中的下划线无效

Struts2 OGNL表达式中的下划线无效,struts2,ognl,Struts2,Ognl,我感到惊讶的是,下划线(“u”)在OGNL中不起作用。 在下面的示例中,所有属性都在OGNL/ValueStack上处理,但由于下划线的原因,属性名appfull_name除外 下面是代码示例 POJO SampleSdmAppsTabObj.java import java.io.*; import javax.persistence.*; @SuppressWarnings("serial") @Entity @Table(name="SDM_APPS") @IdClass(SdmApp

我感到惊讶的是,下划线(“u”)在OGNL中不起作用。 在下面的示例中,所有属性都在OGNL/ValueStack上处理,但由于下划线的原因,属性名appfull_name除外

下面是代码示例 POJO SampleSdmAppsTabObj.java

import java.io.*;
import javax.persistence.*;


@SuppressWarnings("serial")
@Entity
@Table(name="SDM_APPS")
@IdClass(SdmAppsPkeyObj.class)
public class SdmAppsTabObj implements Serializable 
{
  //@Id
   String                                orgid;
  //@Id
   String                                asnid;
   String                                appfull_name;
   String                                description;

  public SdmAppsTabObj(){}


  public SdmAppsTabObj
  (
    String inOrgId,
    String inAsnId,
    String inAppFullName,
    String inDescription
  )
  {
     this.OrgId = inOrgId;
     this.AsnId = inAsnId;
     this.AppFullName = inAppFullName;
     this.Description = inDescription;
  }
*/

  public String getOrgid()                          { return orgid; }
  public String getAsnid()                          { return asnid; }
  public String getAppfullname()                       { return appfull_name; }
  public String getDescription()                        { return description; }



  public void  setOrgid(String inOrgId )                  { this.orgid = inOrgId; }
  public void  setAsnid(String inAsnId )                  { this.asnid = inAsnId; }
  public void  setAppfullname(String inAppFullName )           { this.appfull_name = inAppFullName; }
  public void  setDescription(String inDescription )             { this.description = inDescription; }

  //Override equals() and hashCode()
  @Override
  public boolean equals(Object inObject)
  {
    if (this == inObject) { return true; }
    if (inObject == null) { return false; }
    if (!(inObject instanceof SdmAppsTabObj)) { return false; }
    SdmAppsTabObj other = (SdmAppsTabObj) inObject;
    if( orgid == null )
    if( other.orgid != null ) { return false; }
    else if( !orgid.equals(other.orgid) ) { return false; }
    if( asnid == null )
    if( other.asnid != null ) { return false; }
    else if( !asnid.equals(other.asnid) ) { return false; }
    return true;
  }
  public int hashCode()
  {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((orgid == null) ? 0 : orgid.hashCode());
    result = prime * result + ((asnid == null) ? 0 : asnid.hashCode());
    return result;
  }
}
import SdmAppsTabObj;
import SdmAppsPkeyObj;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class SdmAppsAction extends ActionSupport implements ModelDriven<SdmAppsTabObj>{

  private static final long serialVersionUID = 1L;
  SdmAppsTabObj lSdmAppsTabObj = new SdmAppsTabObj();

    public String execute() throws Exception {

        return SUCCESS;

    }

    public SdmAppsTabObj getModel() {

        return lSdmAppsTabObj;

    }
}


sdmappAction.java

import java.io.*;
import javax.persistence.*;


@SuppressWarnings("serial")
@Entity
@Table(name="SDM_APPS")
@IdClass(SdmAppsPkeyObj.class)
public class SdmAppsTabObj implements Serializable 
{
  //@Id
   String                                orgid;
  //@Id
   String                                asnid;
   String                                appfull_name;
   String                                description;

  public SdmAppsTabObj(){}


  public SdmAppsTabObj
  (
    String inOrgId,
    String inAsnId,
    String inAppFullName,
    String inDescription
  )
  {
     this.OrgId = inOrgId;
     this.AsnId = inAsnId;
     this.AppFullName = inAppFullName;
     this.Description = inDescription;
  }
*/

  public String getOrgid()                          { return orgid; }
  public String getAsnid()                          { return asnid; }
  public String getAppfullname()                       { return appfull_name; }
  public String getDescription()                        { return description; }



  public void  setOrgid(String inOrgId )                  { this.orgid = inOrgId; }
  public void  setAsnid(String inAsnId )                  { this.asnid = inAsnId; }
  public void  setAppfullname(String inAppFullName )           { this.appfull_name = inAppFullName; }
  public void  setDescription(String inDescription )             { this.description = inDescription; }

  //Override equals() and hashCode()
  @Override
  public boolean equals(Object inObject)
  {
    if (this == inObject) { return true; }
    if (inObject == null) { return false; }
    if (!(inObject instanceof SdmAppsTabObj)) { return false; }
    SdmAppsTabObj other = (SdmAppsTabObj) inObject;
    if( orgid == null )
    if( other.orgid != null ) { return false; }
    else if( !orgid.equals(other.orgid) ) { return false; }
    if( asnid == null )
    if( other.asnid != null ) { return false; }
    else if( !asnid.equals(other.asnid) ) { return false; }
    return true;
  }
  public int hashCode()
  {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((orgid == null) ? 0 : orgid.hashCode());
    result = prime * result + ((asnid == null) ? 0 : asnid.hashCode());
    return result;
  }
}
import SdmAppsTabObj;
import SdmAppsPkeyObj;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class SdmAppsAction extends ActionSupport implements ModelDriven<SdmAppsTabObj>{

  private static final long serialVersionUID = 1L;
  SdmAppsTabObj lSdmAppsTabObj = new SdmAppsTabObj();

    public String execute() throws Exception {

        return SUCCESS;

    }

    public SdmAppsTabObj getModel() {

        return lSdmAppsTabObj;

    }
}
导入SdmAppsTabObj;
导入sdmappskeyobj;
导入com.opensymphony.xwork2.ActionSupport;
导入com.opensymphony.xwork2.ModelDriven;
公共类SdmAppsAction扩展ActionSupport实现模型驱动{
私有静态最终长serialVersionUID=1L;
SdmAppsTabObj lSdmAppsTabObj=新的SdmAppsTabObj();
公共字符串execute()引发异常{
回归成功;
}
公共SdmAppsTabObj getModel(){
返回lSdmAppsTabObj;
}
}


sdm\u apps\u add.jsp

.....
<h2>Add Apps</h2>
<s:form  action="sdmAppsAction" >
  <s:textfield name="orgid" label="Org" />
  <s:textfield name="asnid" label="Asn" value=""/>
  <s:textfield name="appfull_name" label="App name" value=""/>
  <s:textfield name="description" label="Desc" value=""/>
  <s:submit />
</s:form>

.....
.....
<h2>Apps Details</h2>
Org : <s:property value="orgid" /><br>
Asn : <s:property value="asnid" /><br>
App name : <s:property value="appfull_name" /><br>
Desc : <s:property value="description" /><br>
.....
。。。。。
添加应用程序
.....


sdm\u apps\u success.jsp

.....
<h2>Add Apps</h2>
<s:form  action="sdmAppsAction" >
  <s:textfield name="orgid" label="Org" />
  <s:textfield name="asnid" label="Asn" value=""/>
  <s:textfield name="appfull_name" label="App name" value=""/>
  <s:textfield name="description" label="Desc" value=""/>
  <s:submit />
</s:form>

.....
.....
<h2>Apps Details</h2>
Org : <s:property value="orgid" /><br>
Asn : <s:property value="asnid" /><br>
App name : <s:property value="appfull_name" /><br>
Desc : <s:property value="description" /><br>
.....
。。。。。
应用程序详细信息
组织:
Asn:
应用程序名称:
描述:
.....


应用程序全名的获取者是

public String getAppfullname(); 公共字符串getAppfullname(); 而不是:

public String getAppfull_name(); 公共字符串getAppfull_name();
此外,setter的名称不正确。

对我来说,OGNL的行为符合预期。您尚未为属性定义公共访问说明符,因此视图无法直接访问这些属性,因此OGNL将尝试使用getter。。。由于其中一个正确的名称不存在,它将失败。架构视点成员的修饰符不能公开。就连我也试过和公众打交道,但都没用。仅供参考,我正在使用struts 2.2.1和OGNL 3.0。相信我,我用下划线尝试了所有可能的方法来创建好的公共setter/getter方法名,但没有成功。从属性名称和良好的setter/getter名称中删除下划线可以解决所有问题。如果您的操作中有:public underline_test=“Hello from underline!”;在您的jsp中,您将看到“Hello from下划线!”我已经用2.2.1.1测试过了,但是没有理由不在前面使用它。RollingBoy的进一步回答应该被接受,因为它也可以正常工作。