ITEEDU

JSP/Servlet: JavaBean 的值设定

可以使用<jsp:setProperty>动作元素来设定JavaBean的属性,您可以使用几个方式来进行设定:

<jsp:setProperty name="someBean" 
property="someProperty" 
value="somevalue" /> 
下面的设定方式,可以将request中的某个请求参数指定至JavaBean的属性,例如将request的requestParam参数设定给 SomeProperty,如下:

<jsp:setProperty name="someBean" 
param="requestParam" 
property="someProperty" /> 

您也可以不指定request的请求参数名称,而由JSP的自省(introspection)机制来判断是否有相同的请求参数名称,如果有的话就自动设定给JavaBean:

<jsp:setProperty name="someBean" property="someProperty" /> 

上面的设定会查找request中是否有SomeProperty名称的请求参数,并自动设定给JavaBean的SomeProperty属性。

<jsp:setProperty>有个最有弹性的写法,就是将request的请求参数名称与JavaBean的属性名称交给自省机制来自动匹配,例如:

<jsp:setProperty name="someBean" property="*" /> 
要注意的是,value设定的值必须是符合JavaBean中setXXX()对应之型态,例如若JavaBean的age属性接收的参数是int,则下面这行是不可行的:

<jsp:setProperty name="someBean" 
property="age" 
value="<%= request.getParameter("userAge") %>"/> 

getParameter()所取得的一定是String型态,而age所接收的型态是int,这么撰写的话,自省机制并不会进行,如果执行上面的这行, 则会发生argument type mismatch错误讯息,您必须先作好型态转换,再设定给JavaBean,例如:

<% 
int age = Integer.parseInt(request.getParameter("userAge")); 
%> 
<jsp:setProperty name="someBean" 
property="age" value="<%= age %>" /> 

当然这样混用程序与卷标于同一个网页中是不被鼓励的,所以建议是在JavaBean的值设定时,可以接收String型态,在于JavaBean中进行字符串转数值的工作。

在使用自省机制时,有一点要注意的是,如果有些属性找不到对应的参数,则不会设定任何的值,例如属性接收的是String型态,如果请求参数没有对应至属 性,则属性会设定为null,而不是空字符串;同样的,不要预期属性的值在自省之后没有设定时,会有自动初始化为您所想象的值,基本上,连上次您设定给 JavaBean的值也会被清空,所以最保险的作法,是假设所有的属性值都有被设定为null值的可能。

您也可以在使用<jsp:useBean>时一并设定属性值,例如:

<jsp:useBean id="someBean" class="onlyfun.caterpillar.SomeBean">
<jsp:setProperty name="someBean"property="someProperty" value="somevalue" /> 
</jsp:useBean>

如此一来,如果找不到someBean时,则会新建一个Bean对象并设定其属性值;如果可以找Bean对象的话,则直接设定该Bean对象的属性值。

如果您打算直接使用某个请求参数的值设定给JavaBean,例如:

<jsp:setProperty name="someBean" 
property="name" 
value="<%= request.getParameter("userName") %>"/> 

事实上您可以使用param属性来完成这件事:

<jsp:setProperty name="someBean" 
property="age" 
param="userName"/>