jsp:setproperty property =“*”未设置所有属性

时间:2016-12-13 14:06:55

标签: jsp jsp-tags

我有包含

的jsp页面
<jsp:useBean id="RcvMsgTransferTanseekBean" class= "com.test.RcvMsgTransferTanseekBean" />  
<jsp:setProperty name="RcvMsgTransferTanseekBean" property="*" />

和包含

的bean
private String nId = "";
public void setNId (String value){
    this.nId = value;  
}

public String getNId(){
    return this.nId;
}

我向该jsp页面发送请求

test.jsp?letId=479438&dstId=522375&nId=138393&subject=66666666666&letForInfo=1&shNotMan=true

我的问题是nId参数只是空的。

当我在jsp

中添加新行时
<jsp:setProperty name="RcvMsgTransferTanseekBean" property="nId" />

它运作正常,为什么&#39;属性=&#34; *&#34;&#39;没有像预期的那样工作?

1 个答案:

答案 0 :(得分:1)

问题出在财产名称上 CamelCase的资本化和资本化并不像您期望的单个主要信函那样有效。 对于设置属性的值,使用setter方法 nId的设置者是setNId

Java Bean Spacification说:

  <8> 8.8推断名称的大写。

     

当我们使用设计模式来推断属性或事件名称时,我们需要   决定将推断名称大写的规则。如果   我们从普通的mixedCase样式Java中间提取名称   name,默认情况下,名称将以大写字母开头。 Java的   程序员习惯于以正常的标识符开头   小写字母。充满活力的评论者的投入使我们确信我们   应遵循同样的传统财产和事件规则   名。

     

因此,当我们从中间提取属性或事件名称时   现有的Java名称,我们通常将第一个字符转换为较低的   案件。但是,为了支持偶尔使用所有大写名称,   我们检查名称的前两个字符是否都是大写   如果是这样的话,请不要理会。例如,

     

“FooBah”变为“fooBah”“Z”变为“z”“URL”变为“URL”

     

我们提供了一个实现它的方法Introspector.decapitalize   转换规则。

Documentation for Introspector

  

public static String decapitalize(String name)

     

获取字符串并将其转换为普通Java变量的实用程序方法   名称大写。这通常意味着转换第一个   从大写字母到小写字母的字符,但在(不寻常的)特殊字符中   当有多个字符并且第一个和第一个字符都有的情况   第二个字符是大写字母,我们不管它。

     

因此“FooBah”变为“fooBah”而“X”变为“x”,但“URL”保持为   “URL”。

所以为了找到参数和setter之间的匹配:

  • 设定者获得资本化。因此,从setNId开始,我们得到NId
  • 如果您提交了参数NId,则该值将包含在javaBean中,
  • 但如果您有nId,则找不到匹配的setter。

解决方案:避免此类情况:

在属性名称的开头使用多个小写字母。

在这种特殊情况下,您可以使用nId代替numId

或将setter / getter名称更改为setnId()getnId()

使用具有此类属性和getter / setter名称的Bean的意外行为

  • <jsp:setProperty name="RcvMsgTransferTanseekBean" property="*" />
    只是跳过属性nId。没有错误。没有异常。
  • <jsp:setProperty name="RcvMsgTransferTanseekBean" property="nId"/>
    throws org.apache.jasper.JasperException:PWC6054:在'com.test.RcvMsgTransferTanseekBean'类型的bean中找不到关于属性'nId'的任何信息
  • ${RcvMsgTransferTanseekBean.nId}
    throws org.apache.jasper.JasperException:javax.el.PropertyNotFoundException:类'com.test.RcvMsgTransferTanseekBean'没有属性'nId'。