简单模拟structs2核心控制器利用反射原理实现参数传递和物理视图跳转

  在能够运用struct2框架进行简单网站开发后,对structs2的一些较原框架强大的功能希望有更深刻的理解,于是尝试从底层开始摸索,本文就在重新学习structs2后,利用简单代码对核心控制器的主要功能进行理解。

  首先,介绍一下struct2的处理流程:

  

  1、浏览器发出请求,即***.action

  2、请求被核心控制器的StrutsPrepareAndExecuteFilter拦截

  3、搜索structs.xml配置文件,寻找Action的属性name为***的配置信息,而后根据class属性,通过反射原理创建Action实例

actionInst

  4、调用request.getParameterNames返回所有的请求参数名存入paramMap

    使用循环(String paramName : paramMap.keySet())//传入所有参数

    {

      //1、得到请求参数名对应的set方法

      Method setter = Action类.getMethod("set"+paramName的首字母大写)

      //2、获得参数名对应的参数值

      String paramValue = paramMap.get(paramName)

      //3、以Action实例为调用者,调用setter方法,把参数值作为参数传入

      setter.invoke(actionInst , paramValue)

    }

5、再次通过反射来调用method属性所指定的方法,返回一个字符串

  6、根据字符串匹配structs.xml中<result>元素的属性name值,进行相对应物理视图的跳转

/**************附模拟核心控制器代码********************************/

//自定义的Action类==========

class MyAction{  //待传值的参数    private String name ;    private String pass;

  //空构造函数    public MyAction() {    }

    public MyAction(String name, String pass) {        this.name = name;        this.pass = pass;    }

    public String getName() {        return name;    }

    public void setName(String name) {        this.name = name;    }

    public String getPass() {        return pass;    }

    public void setPass(String pass) {        this.pass = pass;    }

    public String regist(){        System.out.println("name----->"+name);        System.out.println("pass----->"+pass);        return "sucess";    }}

//核心控制器==============
public class CoreFilter {

    //模拟配置文件structs.xml    /**      <action name = "abc" class = "MyAcion" method = "regist">       <result name = "success">********.jsp</result>     ......     </action>     **/    public static void main(String[] args) throws Exception {        //假如控制器收到abc.action请求,通过解析structs.xml        String classProp = "MyAction";

        //反射原理:获取action类所对应的Class对象        Class actionClazz = Class.forName("test.MyAction");

        //利用Class对象得到类实例        Object actionInst = actionClazz.newInstance(); //此处要求action含有无参构造函数的原因

        //利用Map来模拟请求参数        // struct2的核心Filter用下面的代码。得到所有的请求<参数名--参数值>,组成Map        //Map<String , String > paramMap = request.getParamMap();        //相当于如下模拟过程:        Map <String,String> paramMap = new HashMap<String, String>();        paramMap.put("name","张三");        paramMap.put("pass","123");        for(String paramName : paramMap.keySet()){            //得到请求参数名对应的setter方法            //setName() and setPass()            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);//主调者actionInst,参数值为paramValue        }        Method targetMethod = actionClazz.getMethod("regist");        String result = (String)targetMethod.invoke(actionInst);

        if(result.equals("某个result的name属性值")){            //request.getRequestDispatcher().forward()        }    }}//执行结果

				
时间: 2024-10-08 09:23:18

简单模拟structs2核心控制器利用反射原理实现参数传递和物理视图跳转的相关文章

JavaWeb学习总结(四十九)——简单模拟Sping MVC

在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: 1 /** 2 * 使用Controller注解标注LoginUI类 3 */ 4 @Controller 5 public class LoginUI { 6 7 //使用RequestMapping注解指明forward1方法的访问路径 8 @RequestMapping("LoginUI/Lo

java web学习总结(二十二) -------------------简单模拟SpringMVC

在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: 1 /** 2 * 使用Controller注解标注LoginUI类 3 */ 4 @Controller 5 public class LoginUI { 6 7 //使用RequestMapping注解指明forward1方法的访问路径 8 @RequestMapping("LoginUI/Lo

spring之mvc原理分析及简单模拟实现

在之前的一篇博客中已经简单的实现了spring的IOC和DI功能,本文将在之前的基础上实现mvc功能. 一 什么是MVC MVC简单的说就是一种软件实现的设计模式,将整个系统进行分层,M(model 数据模型,业务逻辑层) .V(view 视图层).C(controller 控制器调度),实现应用程序的分层开发.实现原理如下图: 主要执行步骤: 1 用户在发起request请求给前端控制器: 2 控制器接收到请求后,经过一系统的过滤器,找到对应的请求处理映射: 3 根据请求映射获得请求处理适配器

简单模拟Hibernate的主要功能实现

在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作.这里就简单模拟其底层的实现. /*******代码部分,及其主要注解**********************/1.实体类User:public class User {    private int id;    private String username;    private String password; public int getId() {       

Spring 架构的简单模拟实现

Spring 架构主要有两大特点: IOC /DI: 控制反转/依赖注入 AOP  切面编程 . 今天主要是实现IOC这一特点. 主要的逻辑如下: User 用户类. UserDAO  User类的访问接口. UserDAOImpl  实现UserDAO 接口以实现拓展. UserService  包含一系列的用户功能 ,如addUser 关于以上类的代码: package com.bjsxt.model; public class User { private String username;

HDU-1034-Candy Sharing Game(C++ &amp;&amp; 简单模拟)

Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3703    Accepted Submission(s): 2311 Problem Description A number of students sit in a circle facing their teacher in the cent

Jquery源码分析与简单模拟实现

前言 最近学习了一下jQuery源码,顺便总结一下,版本:v2.0.3 主要是通过简单模拟实现jQuery的封装/调用.选择器.类级别扩展等.加深对js/Jquery的理解. 正文 先来说问题: 1.jQuery为什么能使用$的方式调用,$是什么.$()又是什么.链式调用如何实现的 2.jQuery的类级别的扩展内部是怎样实现的,方法级别的扩展有是怎样实现的,$.fn又是什么 3.jQuery选择器是如何执行的,又是如何将结果包装并返回的 带着这些问题,我们进行jquery的模拟实现,文章下方有

Linux 内核 链表 的简单模拟(2)

接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. */ #define list_for_each(pos, head) for (pos = (head)->next; pos != (head);

HDU 1048 What Is Your Grade? (简单模拟)

 What Is Your Grade? Problem Description "Point, point, life of student!" This is a ballad(歌谣)well known in colleges, and you must care about your score in this exam too. How many points can you get? Now, I told you the rules which are used in