Spring整合struts2(二)

       之前我已经讲过让Action类访问到业务逻辑组件有两种策略,一种是Spring容器负责管理控制器Action,并利用依赖注入为控制器注入业务逻辑组件。另一种便是利用Spring的自动装配,Action将会自动从Spring容器中获取所需要的业务逻辑组件。其中之前的文章Spring整合struts2(一)讲述的就是第一种策略,而本文就来讲述第二种策略。

       首先,最开始的步骤还是不变,需要将相应的jar包复制到web应用WEB-INF\lib目录下,对于jar包,需要什么就复制什么,过多容器造成冲突,Spring整合struts2需要的jar包如下:

1.struts项目中apps中的struts2-blank解压,将jar包复制到web项目WEB-INF\lib下

2.struts2项目中lib目录下的struts2-spring-plugin-2.3.34.jar

3.spring项目lib目录下的jar包

        然后,进行web.xml的配置,配置内容与策略一的一致,并放在WEB-INF下,配置内容如下:



	
	
		org.springframework.web.context.ContextLoaderListener
		
	
	
	
		struts2
		org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
	
	
	
		struts2
		/*
	
	

        接着就是Action类的编写,以及Action中需要的组件类:

package handle.action;

import com.opensymphony.xwork2.ActionSupport;

import handle.service.*;

public class LoginAction extends ActionSupport
{
	// 下面是用于封装用户请求参数的两个成员变量
	private String username;
	private String password;
	// 系统所用的业务逻辑组件
	private MyService ms;
	// 设值注入业务逻辑组件所必需的setter方法
	public void setMs(MyService ms)
	{
		this.ms = ms;
	}
	// username的setter和getter方法
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getUsername()
	{
		return this.username;
	}
	// password的setter和getter方法
	public void setPassword(String password)
	{
		this.password = password;
	}
	public String getPassword()
	{
		return this.password;
	}

	// 处理用户请求的execute方法
	public String execute() throws Exception
	{
		// 调用业务逻辑组件的validLogin()方法
		// 验证用户输入的用户名和密码是否正确
		if (ms.validLogin(getUsername(), getPassword()) > 0)
		{
			addActionMessage("哈哈,整合成功!");
			return SUCCESS;
		}
		return ERROR;
	}
}
package handle.service;

public interface MyService {
	int validLogin(String username , String pass);
}
package handle.service.impl;

import handle.service.MyService;

public class MyServiceImpl implements MyService
{
	public int validLogin(String username , String pass)
	{
		// 此处只是简单示范,故直接判断用户名、密码是否符合要求
		if ( username.equals("carson")
			&& pass.equals("0408") )
		{
			return 99;
		}
		return -1;
	}
}
        因为本文介绍的是利用Spring的自动装配,所以相当于将业务逻辑组件在Spring容器中配置好之后, Action将会自动从Spring容器中获取所需要的业务逻辑组件。所以这里先对业务逻辑组件进行配置,这里可以知道,业务逻辑组件是MyService类产生的对象。所以先对其进行配置,配置文件为applicationContext.xml。



	
	

        由以上配置文件可以看出,spring不再对Action进行管理,而是管理业务逻辑组件,而Action需要什么业务逻辑组件,则会自动获取,这里配置的要求是业务逻辑组件的id必须与Action的setter方法名对应。接下来便是jsp文件的编写:

error.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>



	错误页面


	您不能登录!

welcome.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>



	成功页面


	您已经登录!
loginForm.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>



	登录页面


用户登录

        最后便是对struts.xml的配置,配置控制器,这里的配置与策略一的稍有不同,策略一元素中class属性是bean id,那是因为策略一将Action也放入Spring容器进行管理了,而策略二Action类并未放入容器进行管理,所以与一般地struts.xml配置相同,class是指Action类。配置内容如下:






	
	
	
	
	
		
		
			
			/error.jsp
			/welcome.jsp
		
		
		
			/content/{1}.jsp
		
	

        运行项目,得到结果如下:

                                          Spring整合struts2(二)_第1张图片
                                           Spring整合struts2(二)_第2张图片

Spring管理Action能够达到解耦效果,但也有不足:

1.必须将所有Action配置在Spring容器中,而struts.xml还需要配置一个伪Action,从而导致配置文件臃肿冗余。

2.Action的业务逻辑组件接收容器注入,将导致代码可读性降低。

使用自动装配可以简化配置文件,但也有不足:

1.Action与业务逻辑组件的耦合降低到代码层次,必须在配置文件中配置与Action所需控制器同名的业务逻辑组件,不利于高层次解耦。

2.Action接收Spring容器的自动装配,代码可读性较差。




        










你可能感兴趣的:(SSH开发,SSH框架)