从另一个servlet调用servlet方法名称显示(HttpServletRequest请求,HttpServletResponse响应)

时间:2014-07-07 07:23:39

标签: java jsp servlets

我正在使用servlet开发购物车,有两个servlet: 1. ShopingCart.java 2. TotalAmount.java

在ShopingCart.java中,我创建了会话并使用

进行同步
synchronized(session)  // lock session protect this from multiple threads
      {
       TotalAmount cart = (TotalAmount)session.getAttribute("Cart");

       if(cart == null)  // new sesssion, just create a cart
       {
        cart = new TotalAmount();
        session.setAttribute("Cart", cart);
       }
      // I have to call cart.display();

和TotalAmount.java中的显示方法包含(请求,响应)作为参数。 那么,我如何将请求和响应传递给显示方法?

是的,我需要display方法中的请求和响应参数来保存TotalAmount.java中会话中的一些变量数据

请帮助..

2 个答案:

答案 0 :(得分:1)

我可以通过调用

将请求和响应传递给TotalAmount.java的display方法
-(void) doTask1{ 
    dispatch_sync(queueSerial, ^{B1});
}

-(void) doTask2{ 
    dispatch_sync(queueSerial, ^{B2});
}

因为我已经在ShopingCart.java中有了TotalAmount的对象

答案 1 :(得分:0)

根据Java EE规范,servlet是独立的,唯一的官方交互方式是通过service(ServletRequest req, ServletResponse res)doXXX方法。

如果你想调用另一个servlet的特定方法,你有两个广泛的解决方案:

  • 通过依赖注入(Java EE CDI,Spring框架等)使对象相互了解 - 如果您有一个DI机制,那么干净整洁
  • 通过静态方法手动注册它们 - 比如你想从Servlet1

    访问Servlet2
    class Servlet1 implement HttpServlet {
        private static Servlet2 servlet2 = null;
    
        public static void setServlet2(Servlet2 servlet2) {
            this.servlet2 = servlet2;
        }
        // ... other code
            servlet2.display(...);
        // ...
    }
    class Servlet2 implements HttpServlet {
        @Override
        public void init(ServletConfig config) {
            Servlet1.setServlet2(this);
            // ... other init code eventually
        }
        // ...
     }
    

    由于静态滥用,它应该可以工作,但不是很好

  • 转发到另一个servlet并传递一个请求属性以指示请求了一个特殊操作(假设Servlet2命名为" Servlet2"在web.xml中)

      Servlet1中的
    • request.setAttribute("DISPLAY", true);
      request.getServletContext().getNamedDispatcher("Servlet2").forward(req, resp);
      
    • Servlet2中的
    • public void service(ServletRequest req, ServletResponse resp) {
          if (req.getAttribute("DISPLAY") != null) {
              display(req, resp);
          }
          else {
              super.service(req, resp); // or directly your code
          }
      }
      

    还是一个不错的解决方案,因为不会在直接调用中设置属性(当然,您可以使用req.getRequestDispatcher("/Servlet2URL")代替getServletContext().getNamedDispatcher("Servlet2")