5.2.9 通过请求域传递对象

优质
小牛编辑
129浏览
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所示。

13

图5.13 从请求域中获得对象,并显示对象的属性值