论坛首页 Java企业应用论坛

springframe中的petstore中的setServlet()什么时候调用

浏览 5711 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-25  
springframework 自带的例子jpetstore中的BaseAction类
public abstract class BaseAction extends Action {

private PetStoreFacade petStore;

public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.petStore = (PetStoreFacade) wac.getBean("petStore");
}

protected PetStoreFacade getPetStore() {
return petStore;
}

}

中的setServlet()方法什么时候调用的啊?为什么?
   发表时间:2006-12-25  
这个方法会在action初始化的时候调用,这样在action初始化的时候就把spring管理的bean付给了action(作为action的全局变量),但是要注意的是在action中只有无状态的对象才能作为action的全局变量哦,如果还不明白,看看struts源代码中的requestprocessor类你就明白了
0 请登录后投票
   发表时间:2006-12-25  
Spring的jpetstore很经典啊。
0 请登录后投票
   发表时间:2006-12-25  
我以前测试了下是在web应用启动时就初始化了,不信可以在这个方法里system.out.pringln一下。
0 请登录后投票
   发表时间:2006-12-26  
我在log4j配置文件中加入一条:
引用
log4j.logger.org.springframework.samples.jpetstore.web.struts.BaseAction=INFO


而后把BaseAction中的setServlet()改为:
private PetStoreFacade petStore;
public void setServlet(ActionServlet actionServlet) {
		super.setServlet(actionServlet);
		if (actionServlet != null) {
			ServletContext servletContext = actionServlet.getServletContext();
			WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
			this.petStore = (PetStoreFacade) wac.getBean("petStore");
		}
		
	  System.out.println("俺已经初始化了么?");	
	}


启动tomcat时候,没有输出该语句.
我进入首页后,点击  Enter the Store,控制台输出了该语句,此时执行的DoNothingAction
其代码如下:
public class DoNothingAction extends BaseAction {

  /* Public Methods */

  public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    return mapping.findForward("success");
  }
}


所以看来确实是在Action初始化的时候执行的该方法.
不过每次执行一个BaseAction子类,setServlet()方法就要执行一次.
不知道有更好的方法没?方法里面的内容只要执行一次不就可以了吗?
0 请登录后投票
   发表时间:2006-12-26  
RequestProcessor.java中有
protected Action processActionCreate(HttpServletRequest request,
        HttpServletResponse response, ActionMapping mapping)
        throws IOException {
        ..............
        // If there were a mapping property indicating whether
        // an Action were a singleton or not ([true]),
        // could we just instantiate and return a new instance here?
        Action instance;

        synchronized (actions) {
            // Return any existing Action instance of this class
            instance = (Action) actions.get(className);

            if (instance != null) {
                if (log.isTraceEnabled()) {
                    log.trace("  Returning existing Action instance");
                }

                return (instance);
            }
        .............
        if(instance.getServlet() == null) {
           instance.setServlet(this.servlet);
        }
        return (instance);
    }


应该就是在
if(instance.getServlet() == null) {
           instance.setServlet(this.servlet);
        }

中执行setServlet()方法了.
恩 看来还是要多看源代码啊,多谢楼上两位指点,我还是真菜啊
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics