import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;
import com. infotek.Creditcard.beans.Creditcard;
import com. infotek.Creditcard.business.CreditcardService;
public class SearchSubmit extends ActionSupport { |(1)
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException {
DynaActionForm searchForm = (DynaActionForm) form;
String isbn = (String) searchForm.get("cardno");
//the old fashion way
//CreditcardService creditcardService = new CreditcardServiceImpl();
ApplicationContext ctx = getWebApplicationContext(); |(2)
CreditcardService creditcardService =
(CreditcardService ) ctx.getBean("creditcardService"); |(3)
CreditCard creditard = CreditCardService.read(cardno.trim());
if (null == creditard) {
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError ("message.notfound"));
saveErrors(request, errors);
return mapping.findForward("failure") ;
}
request.setAttribute("creditcard", creditcard);
return mapping.findForward("success");
}
}
在(1)中,我们通过延伸Spring ActionSupport 类而不是Struts Action 类创建了一个action;在(2)中,我们使用getWebApplicationContext()方法获得一个 ApplicationContext;为了获得商务服务, 在(3)中,我们使用ApplicationContext去查找Spring bean;这个技术非常容易理解,不幸的是它把Struts的action和Spring framework绑定了,如果你想替换Spring你不得不重写代码,而且Struts的action不在Spring的控制之下, 遗憾的是这种方法无法获得Spring AOP的好处。
5.结论
本文我们尝试使用Spring的ActionSupport,ContextLoaderPlugIn去集成Struts,这是一种最高效的和最简单的方式,另外还可用Spring中的代理子类去代理Struts中的RequestProcessor和代理Struts的actions