1. 程式人生 > >【Struts2】Struts2底層原理簡單模擬

【Struts2】Struts2底層原理簡單模擬

class MyAction
{
	private String name;
	private String pass;

	// getter和setter方法
	public void setName(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return this.name;
	}
	public void setPass(String pass)
	{
		this.pass = pass;
	}
	public String getPass()
	{
		return this.pass;
	}

	public String regist()
	{
		System.out.println("name:"+name);
		System.out.println("name:"+pass);

		return "SUCCESS";
	}
}
import java.util.*;
import java.lang.reflect.*;

public class MockFilter
{
	/*
		假如struts.xml檔案裡的內容:
		<action name="my" class="MyAction" method="regist"/>
			<result name="success"></result>
		</action>
	*/

	public static void main(String[] args) throws Exception
	{
		// 假設該Filter收到my.action請求,通過解析struts.xml
		String classProp = "MyAction";
		// 使用反射獲得Action類對應的Class物件
		Class actionClazz = Class.forName(classProp);
		// 建立例項
		Object actionInst = actionClazz.newInstance();  ///// 這裡就要求Action必須要有無參的構造器

		///// Struts2核心Filter這樣得到請求引數(引數名-引數值)組成的map
		///// Map<String, String> paramMap = request.getParameterMap();
		
		// 這裡用一個Map模擬請求引數
		Map<String, String> paramMap = new HashMap<>();
		paramMap.put("name", "xiaoming");
		paramMap.put("pass", "123");

		for(String paramName : paramMap.keySet())
		{
			// 得到請求引數名對應的setter方法,請求引數名首字母大寫,如setName
			Method setter = actionClazz.getMethod("set"
				+ paramName.substring(0, 1).toUpperCase()
				+ paramName.substring(1), String.class);

			// 得到請求引數對應的值
			String paramValue = paramMap.get(paramName);
			// 以Action例項為呼叫者,呼叫setter方法,請求引數值作為引數傳進
			setter.invoke(actionInst, paramValue);
		}

		Method targetMethod = actionClazz.getMethod("regist");
		String result = (String)targetMethod.invoke(actionInst);

		if(result.equals("SUCCESS"))
		{
			// request.getRequestDispatcher().foward("");
			System.out.println("跳轉到該result對應的物理檢視");
		}
	}
}