5.2.9 通过请求域传递对象
优质
小牛编辑
126浏览
2023-12-01
如果要在多个Servlet或JSP中传递复杂的对象,使用请求属性是最简单的方法。HttpServletRequest接口定义了setAttribute、getAttribute和removeAttribute方法分别用于保存、获得和删除请求域中的对象。并且还可以通过getAttributeNames方法获得所有保存在请求域中的属性名。在下面的例了将演示在两个Servlet之间传递一个MyClass对象的过程。
例子 : 通过请求域传递对象
1. 实例说明
在本例子中有两个Servlet类:ObjectProducer和ObjectConsumer,在ObjectProduct类中将MyClass对象保存在请求域中,然后转入ObjectConsumer,并在ObjectConsumer类中输出MyClass对象的属性值。
2. 编写ObjectProducer类
在ObjectProducer类中有一个内嵌类MyClass,用于请求域属性的类型,ObjectProducer类的实现代码如下:
package chapter5;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ObjectProducer extends HttpServlet
{
// MyClass类,用于在请求域中传递数据
public static class MyClass
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// 建立MyClass对象
ObjectProducer.MyClass my = new ObjectProducer.MyClass();
// 设置name属性值
my.setName("bill");
// 将MyClass对象保存在请求域中
request.setAttribute("my", my);
RequestDispatcher rd = request.getRequestDispatcher("ObjectConsumer");
// 转入ObjectConsumer
rd.forward(request, response);
}
}
3. 编写ObjectConsumer类
ObjectConsumer类将请求域中所有的属性名输出到客户端,并从请求域中获得MyClass对象的实例后,输出name属性的值。ObjectConsumer类的实现代码如下:
package chapter5;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ObjectConsumer extends HttpServlet
{
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
// 获得请求域中所有的属性名
java.util.Enumeration objs = request.getAttributeNames();
out.println("---------------在请求属性中的对象的属性名--------------<br/>");
while(objs.hasMoreElements())
{
out.println(objs.nextElement() + "<br/>");
}
out.println("---------------获得MyClass对象--------------<br/>");
// 从属性域中获得MyClass对象
Object obj = request.getAttribute("my");
if(obj != null)
{
ObjectProducer.MyClass my = (ObjectProducer.MyClass)obj;
out.println(my.getName()); // 输出name属性的值
}
}
}
4. 配置ObjectProducer和ObjectConsumer类
这两个类的配置代码如下:
<!-- 配置ObjectProducer类 -->
<servlet>
<servlet-name>ObjectProducer</servlet-name>
<servlet-class>chapter5.ObjectProducer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ObjectProducer</servlet-name>
<url-pattern>/ObjectProducer</url-pattern>
</servlet-mapping>
<!-- 配置ObjectConsumer类 -->
<servlet>
<servlet-name>ObjectConsumer</servlet-name>
<servlet-class>chapter5.ObjectConsumer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ObjectConsumer</servlet-name>
<url-pattern>/ObjectConsumer</url-pattern>
</servlet-mapping>
5. 测试
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/ObjectProducer
浏览器中显示的结果如图5.13所示。
图5.13 从请求域中获得对象,并显示对象的属性值