大可制作:QQ群:31564239(asp|jsp|php|mysql)

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"/>