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.....如下图
然后就一直下一步.不需要修改了..
第二步.配置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目录.
转载于:https://blog.51cto.com/hongyanwb/625222