スプリングのAOPブロックはStruts動作に適用されます.


Struts動作をSpringフレームに委託してStrutsとSpringを統合することで、主な利点は、SpringのAOPブロックをStruts動作に適用することができます.SpringスクリーンをStruts動作に適用することで、懸念点を最小の価格で横に切ることができます.
 
       ここでは自分のスクリーンショットを作成してStrutsに適用する動作を紹介します.ブロックを使うためには、次の仕事が必要です.
       1,ログブロックを作成します.
 
/**
 *             
 */
package cn.dip.struts.filter;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class LoggingInterceptor implements MethodBeforeAdvice {

	public void before(Method method, Object[] args, Object target)
			throws Throwable {
		System.out.println("Logging before!");
		System.out.println("method.getName():"+method.getName());
		System.out.println("method.toString():"+method.toString());
		System.out.println("args.length:"+args.length);
		System.out.println("args[0].getClass().getName():"+args[0].getClass().getName());
		System.out.println("target.getClass().getName():"+target.getClass().getName());
	}

}
 
 
   2,ログブロックを登録する
    Springのプロファイルに以下のコードを追加します.
 
<!--  Struts   -->
<bean name="/register" class="cn.dip.struts.action.UserAction" scope="prototype">
		<property name="userManager" ref="userManager"/>
	</bean>
	<bean name="/admin" class="cn.dip.struts.action.AdminAction" scope="prototype">
		<property name="userManager" ref="userManager"/>
	</bean>
	
	<!--         (1) -->
  <bean name="logger"    
    class="cn.dip.struts.filter.LoggingInterceptor"/> 
  <!--       bean       ,          。            ,           。 -->
  <bean name="loggingAutoProxy" 
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
    		<!--   Struts            bean。           Struts   ,      "beanNames"         <value>   。 -->
          <list>
	          <value>/register</value>
	          <value>/admin</value>
          </list>
    </property>
    <property name="interceptorNames">
    	<!--       ,     (1)         bean    。              "beanNames"。 -->
        <list>
          <value>logger</value>
        </list>
    </property>
   </bean>
    ここでログブロックの準備はもうできました.次にStruts動作を実行したら、どのような結果が得られますか?
 
   この例では、Struts動作管理をSpringに委託し、  struts-config  動作マップにエージェントを登録して実装します.エージェントは、Spring環境におけるStruts動作の検索を担当する.Springの制御の下で動作するので、動作のJavaBean属性を充填し、SpringのAOPブロッカーなどの特性を適用することが可能となります.
 
    struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
  <form-beans >
    <form-bean name="userForm" type="cn.dip.struts.form.UserForm" />

  </form-beans>

  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action
      attribute="userForm"
      input="register.jsp"
      name="userForm"
      path="/register"
      scope="request"
      parameter="method"
      type="org.springframework.web.struts.DelegatingActionProxy">
      <forward name="error" path="/register.jsp" />
      <forward name="success" path="/success.jsp" />
    </action>
	
	
  </action-mappings>

  <message-resources parameter="cn.dip.struts.ApplicationResources" />
  
  </struts-config>

 
  UserActionのコードは以下の通りです.
 
package cn.dip.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import cn.dip.model.User;
import cn.dip.service.impl.UserManager;
import cn.dip.struts.form.UserForm;
import cn.dip.utils.DateUtil;


public class UserAction extends DispatchAction {
	/** 
	 * Method execute
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return ActionForward
	 */
	private UserManager userManager;
	public ActionForward register(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
               System.out.println("................");
		UserForm userForm = (UserForm) form;
		User user = new User();
		try {
			org.apache.commons.beanutils.BeanUtils.copyProperties(user, userForm);
		} catch (Exception e) {
			e.printStackTrace();
		}
		userManager.save(user);
		return mapping.findForward("success");
	}
	
	/**
	 * @param userManager the userManager to set
	 */
	public void setUserManager(UserManager userManager) {
		this.userManager = userManager;
	}

}
 
   ページの要求のURLがhttp://localhost:8080/onlinexam/register.do?method=registerを選択すると、UserActionのregisterの方法が実行されます.register方法が実行される前に、定義されたスクリーンセーバがStrutsの動作にブロックされ、before方法が実行される.
具体的な出力結果は以下の通りです.
Logging before!
method.getName():execute
method.toString():public org.apache.struts.action.ActionForward org.apache.struts.actions.DispatchAction.execute(org.apache.struts.action.ActionMapping,org.apache.struts.action.ActionForm,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception
args.length:4
args[0].getClass().getName():org.apache.struts.action.ActionMapping
target.getClass().getName():cn.dip.struts.action.UserAction
................
 
  このようにして、簡単なログ記録ブロックが実現されます.
 
 
  弟はSpringです  Struts初心者の方ですので、以上に漏れや間違いがありましたら、よろしくお願いします.