【Struts2】Struts2底層原理簡單模擬
阿新 • • 發佈:2018-12-30
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對應的物理檢視"); } } }