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

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

  

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

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

  3、搜索struts.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、根据字符串匹配struts.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 {

     //模拟配置文件struts.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()
}
}
}
//执行结果

												

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

  1. 简单模拟struts2及struts2的处理流程介绍

    用了几天模拟struts2,最后结果还是很成功的,也基本没有什么遇上比较难解决的问题,万事开头难,在最开始的时候无从下手,看着下面这张struts2工作流程图配合着网上的博客看了一天终于有了眉目. 看 ...

  2. STRUTS2核心控制器:FilterDispatcher

    1. 在 struts1.x 系列中 , 所有的请求是通过一个 servlet(ActionServlet) 来管理控制的 , 在 Struts2.X 而是经过一个 Filter 来处理请求的. St ...

  3. 利用链式队列(带头节点)解决银行业务队列简单模拟问题(c++)-- 数据结构

    题目: 7-1 银行业务队列简单模拟 (30 分)   设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客 ...

  4. 简单介绍Struts2

    Struts2概述 Struts2虽然是Struts1的基础上发展起来的,但是实质上是以WebWork框架为核心,为传统的Struts1注入了WebWork的设计理念,统一了Struts1和WebWo ...

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

    在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...

  6. Struts2入门(一)——环境搭建和简单例子(Struts2 2.5.2版本)

    一.前言 1.了解三大框架 什么是框架? 框架是一种规范,一种规则,一种把技术组织起来的规则,这就是框架. 什么是三大框架(SSH),Struts.hibernate和spring的作用是什么? St ...

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

    在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...

  8. 如何创建一个简单的struts2程序

    如何创建一个简单的Struts2程序 “计应134(实验班) 凌豪” 1.创建一个新的Web项目test(File->new->Web Project) 2.Struts2框架的核心配置文 ...

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

    在之前的一篇博客中已经简单的实现了spring的IOC和DI功能,本文将在之前的基础上实现mvc功能. 一 什么是MVC MVC简单的说就是一种软件实现的设计模式,将整个系统进行分层,M(model ...

随机推荐

  1. 详解struts.multipart.saveDir的临时文件路径

    Struts2中的struts.multipart.saveDir主要是用来设置上传文件的临时目录,在不同的配置方式下,它的临时文件目录大有不同,好多人在设置后往往找不到这个临时目录在哪里,下面我就来 ...

  2. iOS开发-控件设置

    一.用户界面控件共有三种基本模式:动态.静态(非动态)和被动 动态:点击它们时会发生事情——通常是出发一段自己编写的时间代码. 被动:仅用于存储用户输入的值,以备后续使用.这些控件不会触发任何操作方法 ...

  3. 教你50招提升ASP.NET性能(七):总是在服务器端执行验证

    (13)Always perform validation on the server as well 招数13: 总是在服务器端执行验证 This isn’t exactly a performan ...

  4. iOS开发- 文件共享(利用iTunes导入文件, 并且显示已有文件)

    实现过程: 1.在应用程序的Info.plist文件中添加Application supports iTunes file sharing键,并将键值设置为YES. - (void)viewDidLo ...

  5. 【44】将与参数无关的代码抽离templates

    1.template是产生代码的代码,这就意味着源码看起来很少,生成的目标码大量膨胀. 2.考虑,如果两个方法有重复代码,我们会新建一个方法,把重复的代码放进去,原先两个方法调用第三个方法.如果两个类 ...

  6. SQLSERVER中返回修改后的数据

    在公司看到同事写了个SQL2005的新特性的文章,觉得很实用,在这里和大家分享下. 这种技术主要是用到了inserted和deleted虚拟表,这两张表相信大家都很熟悉.以前我们主要是在触发器中使用. ...

  7. git 回退和删除操作

    今天不小心把分支的commit提交到master上了.衰 主要通过下面几个命令解决了,很简单记录一下. git reset –hard  回退到某一个版本git push origin :xxxx  ...

  8. bmp to jpg

    uses Jpeg; function BMPtoJPG(var BMPpic, JPGpic: string): boolean;var  Bitmap: TBitmap;  JpegImg: TJ ...

  9. iOS开发——新特性Swift篇&Swift 2.0 异常处理

    Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...

  10. 警告:Pointer is missing a nullability type specifier (__nonnull or __nullable)

    当我们定义某个属性的时候  如果当前使用的编译器版本比较高(6.3+)的话经常会遇到这样一个警告: 而且奇怪的是在某些文件中定义这个属性是没有任何警告的 但是在某些文件中定义同样的属性就会报错: 其实 ...