Spring与Struts的整合_使用ActionSupport代替Action

发布时间:2023-05-12 10:17:31

  Spring与Struts的整合有一种方法:让Action在程序中手动获得AplicationContext的实例。在这种集成策略下,Struts的Action不接受IoC容器管理,Action代码和Spring API部分耦合,造成代码污染。 该策略也有其优点:代码具有很强的可读性,Action代码中显式调用业务逻辑组件,而无需等待容器注入。 在Action中访问ApplicationContext有两种方法: 1.使用Webaplicationcontextils工具类 2.使用ActionSuport支持类

  Webaplicationcontextutils可以通过servletcontext获得spring容器实例。ActionSupport类提出了一个更简单的方法:getWebApplicationContext()该方法用于获取Aplicationcontext的实例。 Spring扩展了Struts标准Action类,SpringAction在StrutsAction后添加Sppport,SpringAction如下: 1.ActionSupport。 2.DispatchActionSupport。 3.LookupDispatchActionSupport。 4.MappingDispatchActionSupport。

  使用ActionSupport的示例代码如下: 继承SpringActionSuport类的新业务控制器public class LoginAction extends ActionSupport {//仍将ValidBean作为成员变量privateean ValidBean vb;//构造器,注:getWebaplicationcontext()方法publict()不能在构造器中调用 LoginAction(){}//完成ValidBean的初始化publicic ValidBean getVb(){ return (ValidBean)getWebApplicationContext().getBean("vb");} //必须重写核心方法,该方法actionform将表单的请求参数包装成值对象public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception{ 当ActionServlet转发请求时,//form创建包装所有请求参数 LoginForm loginForm = (LoginForm)form; ///获得username请求参数 String username = loginForm.getUsername(); ///获得pass请求参数 String pass = loginForm.getPass(); ////以下服务器端的数据验证 String errMsg = ""; if (username == null || username.equals("")){ errMsg += “您的用户名丢失或未输入,请重新输入“请重新输入”; }else if(pass == null || pass.equals("")){ errMsg += "您的密码丢失或没有输入,请重新输入“请重新输入”; }else{///如果用户名和密码不空,只能调用业务组件 if (getVb().valid(username,pass)){//vb是业务逻辑组件,通过上述初始化方法获得 return mapping.findForward("welcome"); }else{ errMsg = “您的用户名与密码不匹配”; } } //判断是否生成了错误的信息, if (errMsg != null && !errMsg.equals("")){ ///将错误信息保存在request中,跳转到input对应的forward对象 request.setAttribute("err" , errMsg); return mapping.findForward("input"); }else{///如果没有错误的信息,跳转到welcome对应的forward对象 return mapping.findForward("welcome"); } }}

  在这种集成策略下,表示层的控制器组件不再接受物联网容器管理。因此,没有控制器context,原始action应该是没有控制器的-servlet.删除xml文件,修改plug-in元素,不要加载文件。还需要修改action配置,将action配置的type元素修改为实际处理类。这种集成策略也有一个优点:代码可读性强,对传统Struts应用开发变化小,使用方便。 将Action部署在strutss中-config.在xml中,Struts将负责创建Action。struts-config.xml文件的源代码如下:

  此时,Spring不需要使用配置Action的配置文件,这非常简单。业务逻辑组件的配置文件如下:

  由于Spring容器负责实现配置文件中的业务逻辑组件,ActionSupport可以先定位Spring容器,然后获得容器的业务逻辑组件。

  这种整合策略的执行效果与前两种整合策略完全相同。 从代码分析来看,在这种集成策略下,业务控制器再次返回到Struts的初始设计:仅由Struts设计-config.Action在xml中充当,避免了DelegatingActionProxy整合策略的低性能,因为只能创建实际的Action实例。 这种集成策略的代价是代码污染。

上一篇 记录一些 PostgreSQL问题分析思路
下一篇 自动代码Copilot背后的模型

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题