spring的作用.之前也说明了很多.其实就是IoC和AOP...很多人都说,spring就是玩配置文件....其实,spring最大的作用就是为了减少类之间的耦合.平时使用两个类,调用的时候难免会发生耦合.但是又不能没有一点耦合.那这两个类将一点关系都没有..spring的解决办法就是IoC.叫依赖注入...比如.类A要调用类B里的办法..怎么解决呢.我们以前的办法就是类A主动去调用类B.但是spring给出的办法是需要的时候给你...而且这个地方是通过配置文件来实现的.也就是说,是配置文件来给你.

   开始之前,首先要说明一点,在struts的流程里有一步是struts.xml以后根据action name来调用对应的action类..我们之前的struts实现办法是自动生成一个action实例..是struts自动通过自带的factory来实现的..但是,我们这里需要用spring来帮我们生产action实例.当然,action里面调用的方法也通过spring来注入.

  第一步,当然是导入相应的jar包.将struts2下载里面的struts2-spring-plugin.jar放入lib下..然后通过myeclipse导入spring..具体的办法是在相应的工程目录,右键,Myeclipse -->Add Spring Capabilities.然后在对话框里面.Spring 2.0 Core 打钩(这个默认已经打钩了),还有Spring 2.0 Web 打钩,因为我们需要用到里面的一个Listener.下面选择Copy checked Library contents.....如下图

struts2整合spring - jingbo2759 - 馒头的学习经历

然后就一直下一步.不需要修改了..

 第二步.配置web.xml..因为我们需要通过spring来生成action实例..(也就是说.告诉struts ,spring的存在)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
 
   
 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
 </filter>
 
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
<listener >
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

</web-app>

 

第三步,写两个jsp页面测试.很简单,一个登陆页面,一个结果页面

login2.jsp

 <s:form action="login" >
 
 <s:textfield name="username" label="username"></s:textfield>
 <s:password name="password" label="password"></s:password>
 <s:submit ></s:submit>
 
 </s:form>

result.jsp

<body>

 username:<%=request.getParameter("username") %>
 password:<%=request.getParameter("password") %>

  </body>

两个都很简单,不多说了

第四步.写个业务处理类.包括一个接口,一个实现类..两个java文件

我们以前写的例子都是将业务代码放到action里面.很明显,这样做是不好的..我们需要将业务代码分离出来.而action只需要调用..

接口类LoginService.java 就定义了一个方法.返回一个布尔值

package com.test.service;

public interface LoginService {
 public boolean isLogin(String username,String password);
}

实现类 LoginServiceImpl.java 实现类..假如username为hello.password为world的时候返回真..其他都为假

package com.test.serviceImpl;

import com.test.service.LoginService;

public class LoginServiceImp implements LoginService {

 @Override
 public boolean isLogin(String username, String password) {
  
  if("hello".equals(username)&&"world".equals(password))
  {
   return true;
  }
  else
  {
   return false;
  }
  
 }

}

第五步,当然是写我们的action...LoginAction.java

package com.test.action;

import com.opensymphony.xwork2.ActionSupport;
import com.test.service.LoginService;

public class LoginAction extends ActionSupport {
 private String username;
 private String password;
 private LoginService loginService;//这里引入了一个LoginService.但是没有实例化.(如果在这里实例化,那就不用spring了...我们就是靠spring来注入这个loginService)
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
   
 public void setLoginService(LoginService loginService) {//注意这里需要定义一个set方法.因为spring需要调用这个set方法
  this.loginService = loginService;
 }
 public String execute() throws Exception{
  
  if(loginService.isLogin(username, password))
  {
   return SUCCESS;//注意,这里只有调用的代码,没有业务逻辑代码了
  }
  else {
   return INPUT;
  }
  

}
 

第六步..配置struts.xml

  <action name="login" class="loginAction">//注意,这里的class已经不是和以前那样的一个类的全名.而是一个自定义的名字.这个名字对应到了等下我们将要配置的applicationContext.xml(也就是spring的配置文件)里定义的bean Id ..
   <result name="input">/login2.jsp</result>
   <result name="success">/result.jsp</result>
   </action>
第七步,applicationContext.xml   spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">


<bean id="loginservice" class="com.test.serviceImpl.LoginServiceImp"></bean>//这里定义了一个loginservice的组件.对应业务逻辑的实现类

<bean id="loginAction" class="com.test.action.LoginAction" scope="prototype">//定义action.scope="prototype 表示请求一次,实例化一次
 <property name="loginservice">
  <ref local="loginservice"/>//将这个业务逻辑的实现类注入...
 </property>
</bean>

</beans>

第八步..差不多都弄好了..不过需要将applicationContext.xml移到WEB-INF下面.测试,应该OK了

最后说明下,系统默认是将applicationContext.xml放到WEB-INF下的.也就是说,系统在读取spring的配置文件的时候默认是到web-inf目录下的.而且读取的配置文件名也必须是applicationContext.xml..

如果你不想把这个applicationContext.xml放到web-inf下..你可以在web.xml里面指定对应的存放地址.甚至可以写多个配置文件 ..方法是

<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>

</context-param>

上面这个是官方网站上拉来的代码..很容易懂.不多说了...注意对应的目录. classpath*:表示的是classpath目录.也就是我们开发的时候src目录.