Struts2 OGNL表达式中的下划线无效
我感到惊讶的是,下划线(“u”)在OGNL中不起作用。 在下面的示例中,所有属性都在OGNL/ValueStack上处理,但由于下划线的原因,属性名appfull_name除外 下面是代码示例 POJO SampleSdmAppsTabObj.javaStruts2 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
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的进一步回答应该被接受,因为它也可以正常工作。