jsp:setProperty教训

首先看代码:

//test.jsp

<%@page contentType="text/html;charset=gb2312"%>

//下面一行可无,是无意义的,只是为了和错误对比:

<jsp:useBean id="tt" class="pro.one.Demo" scope="request"/>
<html>
 <head>
  <title>
   test
  </title>
 </head>
 <body>
  <form action="test01.jsp" method="get">
   <input type="text" name="name">
   <input type="password" name="password">
   <input type="submit" name="提交">
  </form>
 </body>
</html>

//test01.jsp

<%@page contentType="text/html;charset=gb2312"%>

//通过下面的scope="request",加深了对request范围的理解:request是一次请求,哪么除了一般的表单提交,

还有什么是一次用户请求?地址栏中输入URL也是,而本例中从test.jsp跳转到test01.jsp,就相当于在地址栏中

输入了test01.jsp的URL,所以tt这个bean只在该页面范围有效果(不考虑服务器端跳转)。
<jsp:useBean id="tt" class="pro.one.Demo" scope="request">
<jsp:setProperty name="tt" property="*"/>
</jsp:useBean>

<html>
 <head>
  <title>test
  </title>
 </head>
 <body>
  姓名是:<%=tt.getName()%>

//这里进行了服务器端的跳转,所以test02.jsp中的tt也是有效果的。
  <jsp:forward page="test02.jsp"/>
  <%--response.sendRedirect("test02.jsp");--%>
 </body>
</html>

//test02.jsp

<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="tt" class="pro.one.Demo" scope="request"/>
<html>
 <head>
  <title>test
  </title>
 </head>
 <body>
  姓名是:<%=tt.getName()%>//可以获得正常输出(若在test01.jsp中是客户端跳转,此处当然为null,非空指针异常,因为这时的tt和test01.jsp中tt对象不是同一个,是该页面重新实例化了一个tt对象)
 </body>
</html>

==================================================

有问题代码test.jsp:

<%@page contentType="text/html;charset=gb2312"%>

<jsp:useBean id="tt" class="pro.one.Demo" scope="request">
<jsp:setProperty name="tt" property="*"/>     //------错误!!
</jsp:useBean>
<html>
 <head>
  <title>
   test
  </title>
 </head>
 <body>
  <form action="" method="get">//注意,这里是提交到本页面。
   <input type="text" name="name">
   <input type="password" name="password">
   <input type="submit" name="提交">//--------输出结果总为null !!!!!!!!!!!
  </form>
 </body>
</html>

输出结果总为null 的原因:       在使用

  <jsp:useBean id="myName" ... >

  <jsp:setProperty name="myName"........>

  </jsp:useBean>的时候,jsp:setProperty只有在新建Bean实例时才会执行,如果是使用现有实例则不执行jsp:setProperty。   在有问题的代码test.jsp中,显示面页的时候会立刻实例化一个tt对象,而在这时调用动作元素jsp:setProperty,会直接将null给bean的所有属性(实质上是setProperty中Property的参数还没有和表单有任何关联,如Property="name" 这时name和表单中name的参数没有任何关系,值为null,所以将null值赋给bean的各个属性)。

可以如下修改:

<%@page contentType="text/html;charset=gb2312"%>
<html>
 <head>
  <title>
   test
  </title>
 </head>
 <body>
  <form action="" method="get">
   <input type="text" name="name">
   <input type="password" name="password">
   <input type="submit" name="提交">
  </form>

//每次提交表单,都相当于一个request请求,会重新实例化一个Demo对象,所以可以获得name的值。
  <jsp:useBean id="tt" class="pro.one.Demo" scope="request">
  <jsp:setProperty name="tt" property="*"/>
  </jsp:useBean>
  姓:<%=tt.getName()%>
 </body>
</html>

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值