浏览 5711 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-25
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()方法什么时候调用的啊?为什么? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-25
这个方法会在action初始化的时候调用,这样在action初始化的时候就把spring管理的bean付给了action(作为action的全局变量),但是要注意的是在action中只有无状态的对象才能作为action的全局变量哦,如果还不明白,看看struts源代码中的requestprocessor类你就明白了
|
|
返回顶楼 | |
发表时间:2006-12-25
Spring的jpetstore很经典啊。
|
|
返回顶楼 | |
发表时间:2006-12-25
我以前测试了下是在web应用启动时就初始化了,不信可以在这个方法里system.out.pringln一下。
|
|
返回顶楼 | |
发表时间: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()方法就要执行一次. 不知道有更好的方法没?方法里面的内容只要执行一次不就可以了吗? |
|
返回顶楼 | |
发表时间: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()方法了. 恩 看来还是要多看源代码啊,多谢楼上两位指点,我还是真菜啊 |
|
返回顶楼 | |