我有包含
的jsp页面<jsp:useBean id="RcvMsgTransferTanseekBean" class= "com.test.RcvMsgTransferTanseekBean" />
<jsp:setProperty name="RcvMsgTransferTanseekBean" property="*" />
和包含
的beanprivate 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;没有像预期的那样工作?
答案 0 :(得分:1)
问题出在财产名称上
CamelCase的资本化和资本化并不像您期望的单个主要信函那样有效。
对于设置属性的值,使用setter方法
nId
的设置者是setNId
。
<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"/>
${RcvMsgTransferTanseekBean.nId}