提起Jsp的动作,第一感觉是麻烦,第二感觉是用处不大。但是我们二期的考试题中又非常多,很多人提起UseBean setProperty getProperty就感觉头大。现在我们来总结一下:
其实jsp中使用动作并不难我们给一个例子看看:
我们有一个com.xaccp.vo.ProductBean 类:
在定义Bean时,注意:
1、 必须有一个默认的构造函数。
2、 属性要有getter,setter方法。
3、 get,set方法中不能出现如getPName(),setPName(…)的现象,命名要符合规范,但是get,set后面仅接着有2个大写字母时,经常在自省时出现异常。具体的原因不太清楚。
在test1.jsp中,我们有如下代码:
……
<!--
useBean 动作这里可以看作为:
ProductBean pro=new ProductBean,
其实有更大的作用,在useBean中还有一个属性 scope,scope属性有四个值分别是:
page,request,session,application,默认是page,我们以session为例进行说明:
<jsp:useBean id="pro" class="com.xaccp.vo.ProductBean" scope="session"/>
相当于java代码:
ProductBean pro=(Product)session.getAttribute("pro" );
if (pro==null)
{
pro=new ProductBean();
session.setAttribute("pro",pro);
}
因此在bean中必须有默认构造方法。
-->
<jsp:useBean id="pro" class="com.xaccp.vo.ProductBean"/>
<!--
调用对象pro的set方法对pro进行赋值:
实质就是对标准范围中键pro对应的对象进行操作。
下面的代码相当于:
ProductBean pro=(ProductBean)pageContext.getAttribute(“pro”);
If (pro==null)
{
pro=request.getAttribute(“pro”);
if (pro==null)
{
pro=session.getAttribute(“pro”);
if (pro==null)
{
pro=application.getAttribute(“pro”);
}
}
}
pro.setPname(name1);
pro.setPrice(168);
-->
<jsp:setProperty name="pro" property="pname" value="name1"/>
<jsp:setProperty name="pro" property="price" value="168"/>
<!—
该方法同样的道理,也是先从标准范围中取到pro对象,再调用pro的get方法。Pro是对应的标准范围中的键。
-->
pname:<jsp:getProperty name="pro" property="pname"/>
<br/>
price:<jsp:getProperty name="pro" property="price"/>
……
因此可以看出useBean,setProperty,getProperty的动作是没有联系的,只不过经常在一起使用而已。他们只是对标准范围的操作而已。也就是说<jsp:getPropery>,<jsp:setProperty>,<jsp:useBean>只是对标准范围(pageContext,request,session,application)进行操作而已。相互间的联系也仅仅是通过标准范围进行联系。因此我们可以手工在java代码中放入标准范围一个对象,比如在servlet中:
request.getSession().setAttribute(“pro”,new ProductBean());
然后在jsp页面中就可以进行<jsp:getPropery>,<jsp:setProperty>操作了,当然这时在jsp界面中放入<jsp:useBean>主要是防止NullPointerException而已。
此外,在<jsp:setProperty>中的功能不仅如此,它还具有接收请求参数的功能。比如,在test.jsp中有如下代码:
<a href=”test1.jsp?name=name1&price=168”>测试一下</a>
我们把test1.jsp做如下修改:
<jsp:useBean id="pro" class="com.xaccp.vo.ProductBean"/>
<jsp:setProperty name="pro" property="pname" param="name"/>
<jsp:setProperty name="pro" property="price" param=”price”/>
pname:<jsp:getProperty name="pro" property="pname"/>
<br/>
price:<jsp:getProperty name="pro" property="price"/>
那么我们从test1.jsp页面进入test.jsp中时就会显示test1.jsp请求过来的值。我们可以看到把属性value换成param,属性param的值就是请求的参数名。
在上面的示例中我们看到:
<jsp:setProperty name="pro" property="price" param=”price”/>
中property属性与param属性的值是相同的,这时候我们就可以省略属性param,test1.jsp变成这样:
<jsp:useBean id="pro" class="com.xaccp.vo.ProductBean"/>
<jsp:setProperty name="pro" property="pname" param="name"/>
<jsp:setProperty name="pro" property="price"/>
<!—省略了属性param=”price” -->
pname:<jsp:getProperty name="pro" property="pname"/>
<br/>
price:<jsp:getProperty name="pro" property="price"/>
我们得到启示,把test.jsp中的请求参数修改一下,让参数name修改为pname与test1.jsp中<jsp:setProperty>的property的值相同。我们就可以把test.jsp修改为:
<a href=”test1.jsp?pname=pname1&price= 168”>测试一下</a>
同时我们把test1.jsp修改为:
<jsp:useBean id="pro" class="com.xaccp.vo.ProductBean"/>
<jsp:setProperty name="pro" property="pname"/>
<!—省略了 param="name" -->
<jsp:setProperty name="pro" property="price"/>
<!—省略了属性param=”price” -->
pname:<jsp:getProperty name="pro" property="pname"/>
<br/>
price:<jsp:getProperty name="pro" property="price"/>
到目前为止我们看到请求的参数与bean的属性是相同的,ok,我们就可以进一步把test1.jsp简化为:
<jsp:useBean id="pro" class="com.xaccp.vo.ProductBean"/>
<jsp:setProperty name="pro" property="*"/>
<!— 全部匹配,就可以进一步的简化-->
pname:<jsp:getProperty name="pro" property="pname"/>
<br/>
price:<jsp:getProperty name="pro" property="price"/>
呵呵,够了,一般的情况下初学者就开始晕了。