程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 整合Spring與Struts的幾種方法

整合Spring與Struts的幾種方法

編輯:關於JAVA

Spring與Struts對Model-View-Controller模式均提供了很好的支持。相比之下,Struts是一個比較單純的MVC框架,在實際應用中,開發人員更喜歡使用Struts完成MVC的設計,因而在有必要對Spring與Struts進行整合。

整合的關鍵點在於:將Struts中Action的實例生成不再由Struts自己負責,而交於Spring容器去管理。因此,進行整合的一個技術前提是Struts中作為Controller的ActionServlet必須能夠裝載Spring的應用程序環境,而Spring的org.springframework.web.struts.ContextLoaderPlugin恰好提供了這種支持。在Struts的配置文件struts-config.xml中,將ContextLoaderPlugin注冊即可,示例如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
...
<plug-in className=”org.springframework.web.struts.ContextLoaderPlugin”>
<set-property property=”contextConfigLocation” value=”/WEB-INF/config.xml”/>
</plug-in>
...
</struts-config>

其中的config.xml是Spring的配置文件。

之後,我門可以采用三種方式之一來整合Spring和Struts:

1.Struts的Action繼承Spring的ActionSupport類,並在Action中獲取Spring的ApplicationContext。這是最簡單的一種整合方式,但有三個缺點:第一,Struts與Spring緊密耦合,不能改換到其他IoC容器;第二,難以使用Spring AOP特性;第三,對於需要使用DispatchAction的Struts應用無能為力。

2.在Struts的配置文件中,以Spring的DelegatingRequestProcessor類代替Struts的RequestProcessor類,並在Spring的配置文件中定義與Struts配置文件中<action-mappings>對應的bean,從而將Struts的Action與Spring分開,並把Struts的動作置於Spring的控制之下。這種整合方式的優點是將不再依賴Spring這個特定的IoC容器,但必須依賴Struts的RequestProcessor類。  

3.通過Spring的DelegatingActionProxy類代理Struts的動作,即在Struts配置文件中,定義<action-mappings>的type屬性全部改為DelegatingActionProxy,而不是具體的類名,並在Spring配置文件中定義與Struts動作映射對應的bean,從而將Struts的Action與Spring分開,並把Struts的動作置於Spring的控制之下。無疑,這是最靈活的一種整合方式。

下面就通過HelloWorld示例來分析一下第三種整合方式的實施步驟。

Step 1:修改Struts的配置文件struts-config.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="helloWorld" type="com.strutstest.action.HelloWorld"/>
</form-beans>
<action-mappings>
<!--注意此處的type屬性定義為DelegatingActionProxy 類-->
<action path="/helloWorld" type="org.springframework.web.struts.DelegatingActionProxy" name="helloWorld" validate="true" input="/WEB-INF/jsp/input.jsp">
<forward name="index" path="/WEB-INF/jsp/index.jsp"/>
<forward name="show" path="/WEB-INF/jsp/show.jsp"/>
</action>
<action
path="/input"
type="org.apache.struts.actions.ForwardAction"
parameter="/WEB-INF/jsp/input.jsp"/>
</action-mappings>
<!--注冊ContextLoaderPlugIn -->
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/config.xml" />
</plug-in>
<message-resources parameter="messages"/>
</struts-config>

Step 2:修改Spring的配置文件config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id=”helloWorldService” class=”com.strutstest.service.impl.HelloWorldServiceImpl”>
</bean>
<!--注意此處的映射必須與Struts中的動作對應-->
<bean name=”/helloWorld” class=”com.strutstest.action.HelloWorldAction”>
<property name=”helloWorldService”>
<ref bean=”helloWorldService”/>
</property>
</bean>
</beans>

Step 3:定義作為Model的Action Form類及相應接口、實現

定義Action Form:

package com.strutstest.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class HelloWorld extends ActionForm {
private String msg = null;
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return this.msg;
}
public void reset(ActionMapping mapping, HttpServletRequest req) {
this.msg = null;
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if("".equals(getMsg())) {
errors.add("msg",new ActionError("error"));
}
return errors;
}
}

定義HelloWorld類的接口:

package com.strutstest.service;
import com.strutstest.action.HelloWorld;
public interface HelloWorldService {
public abstract String addMsg(HelloWorld helloWorld);
}

定義接口的實現:

package com.strutstest.service.impl;
import com.strutstest.action.HelloWorld;
import com.strutstest.service.HelloWorldService;
public class HelloWorldServiceImpl implements HelloWorldService {
public String addMsg(HelloWorld helloWorld) {
helloWorld.setMsg("Hello World... " + helloWorld.getMsg());
return helloWorld.getMsg();
}
}

Step 4:定義Action

package com.strutstest.action;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.*;
import org.apache.struts.actions.DispatchAction;
import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;
import com.strutstest.service.HelloWorldService;
public class HelloWorldAction extends Action {
private Logger logger = Logger.getLogger(this.getClass().getName());
//依賴注入
private HelloWorldService helloWorldService;
public HelloWorldService getHelloWorldService () {
return helloWorldService;
}
public void setHelloWorldService (HelloWorldService helloWorldService) {
this.helloWorldService = helloWorldService;
}
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
String msg = getHelloWorldService().addMsg((HelloWorld)form);
request.setAttribute("helloWorld", msg);
return mapping.findForward("show");
}
}

Step 5:定義視圖

定義用戶輸入界面input.jsp:

<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@page contentType="text/html;charset=GBK"%>
<html:html locale="true">
<head>
<title><bean:message key="title"/></title>
<html:base/>
</head>
<html:messages id="msg">
<bean:write name="msg"/>
</html:messages>
<body>
<form name="HelloWorld" action="/myStruts/helloWorld.do" method="post">
<bean:message key="welcome"/><input type="text" name="msg" value=""/><br>
<input type="submit" name="method" value="<bean:message key="submit"/>"/>
</form>
</body>
</html:html>

定義系統響應界面show.jsp:

<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@page contentType="text/html;charset=GBK"%>
<html:html locale="true">
<head>
<title><bean:message key="title"/></title>
<html:base/>
</head>
<body bgcolor="white">
<html:errors/>
<html:messages id="msg">
<bean:write name="msg"/>
</html:messages>
<%
String str = (String)request.getAttribute("helloWorld");
%>
<body>
<font color=”blue”>
<bean:message key="input"/>"${helloWorld}"<br>
</font>
</body>
</html:html>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved