首先看代码:
//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>