我正在使用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中会话中的一些变量数据
请帮助..
答案 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的特定方法,你有两个广泛的解决方案:
通过静态方法手动注册它们 - 比如你想从Servlet1
访问Servlet2class 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中)
:
request.setAttribute("DISPLAY", true);
request.getServletContext().getNamedDispatcher("Servlet2").forward(req, resp);
:
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")
)