struts和spring的整合方式对比

阅读更多
1.业务Action类继承ActionSupport类

 

业务Action中可以调用ActionSupport类中的getWebApplicationContext(),来获得wac,然后

调用wac.getBean("myservice")来获得需要的service对象

 

这种方法虽然可以,但是不推荐使用,原因如下:

1>业务Action类跟Spring的ActionSupport类藕合在一起不是很好

2>getWebApplicationContext().getBean("myservice")这种硬编码不是很好

3>这种方法Spring并没有托管Action对象

 

2.使用Spring的DelegatingRequestProcessor类来替代struts的RequestProcessor类

 

struts-config.xml


 

DelegatingRequestProcessor类继承了RequestProcessor类,并重写了RequestProcessor的一些方法

 

DelegatingRequestProcessor.java

public class DelegatingRequestProcessor extends RequestProcessor {

	private WebApplicationContext webApplicationContext;
	

	public void init(ActionServlet actionServlet, ModuleConfig moduleConfig) throws ServletException {
		super.init(actionServlet, moduleConfig);
		if (actionServlet != null) {
			this.webApplicationContext = initWebApplicationContext(actionServlet, moduleConfig);
		}
	}

	protected WebApplicationContext initWebApplicationContext(
			ActionServlet actionServlet, ModuleConfig moduleConfig) throws IllegalStateException {

		return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, moduleConfig);
	}

	protected final WebApplicationContext getWebApplicationContext() {
		return this.webApplicationContext;
	}

	protected Action processActionCreate(
			HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)
			throws IOException {

		Action action = getDelegateAction(mapping);
		if (action != null) {
			return action;
		}
		return super.processActionCreate(request, response, mapping);
	}

	protected Action getDelegateAction(ActionMapping mapping) throws BeansException {
		String beanName = determineActionBeanName(mapping);
		if (!getWebApplicationContext().containsBean(beanName)) {
			return null;
		}
		return (Action) getWebApplicationContext().getBean(beanName, Action.class);
	}

	protected String determineActionBeanName(ActionMapping mapping) {
		return DelegatingActionUtils.determineActionBeanName(mapping);
	}

}

 

1>调用init方法的时候,初始化并获得wac

2>调用processActionCreate方法的时候,先从wac中getBean("prefix+path"),如果找不到再从struts内部获取

 

3.所有的业务Action都配置成DelegatingActionProxy类

 

struts-config.xml


    	
            
        

 

DelegatingActionProxy.java

public class DelegatingActionProxy extends Action {


	public ActionForward execute(
			ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		Action delegateAction = getDelegateAction(mapping);
		return delegateAction.execute(mapping, form, request, response);
	}


	
	protected Action getDelegateAction(ActionMapping mapping) throws BeansException {
		WebApplicationContext wac = getWebApplicationContext(getServlet(), mapping.getModuleConfig());
		String beanName = determineActionBeanName(mapping);
		return (Action) wac.getBean(beanName, Action.class);
	}

	
	protected WebApplicationContext getWebApplicationContext(
			ActionServlet actionServlet, ModuleConfig moduleConfig) throws IllegalStateException {

		return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, moduleConfig);
	}

	
	protected String determineActionBeanName(ActionMapping mapping) {
		return DelegatingActionUtils.determineActionBeanName(mapping);
	}

}

 

DelegatingActionProxy重写了execute方法,当struts调用execute方法的时候,内部会调用wac.getBean("prefix+path")获取被Spring托管的Action对象,然后再调用业务Action对象的execute方法,其实就是利用了代理模式对Action进行代理

 

Spring的配置文件:

 

applicationContext.xml


  	
	
			
	
	
	
		
		
		
	
    

 

你可能感兴趣的:(struts,spring,java,web,xml)