简单模拟struts2核心控制器利用反射原理实现参数传递和物理视图跳转
在能够运用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核心控制器利用反射原理实现参数传递和物理视图跳转的更多相关文章
- 简单模拟struts2及struts2的处理流程介绍
用了几天模拟struts2,最后结果还是很成功的,也基本没有什么遇上比较难解决的问题,万事开头难,在最开始的时候无从下手,看着下面这张struts2工作流程图配合着网上的博客看了一天终于有了眉目. 看 ...
- STRUTS2核心控制器:FilterDispatcher
1. 在 struts1.x 系列中 , 所有的请求是通过一个 servlet(ActionServlet) 来管理控制的 , 在 Struts2.X 而是经过一个 Filter 来处理请求的. St ...
- 利用链式队列(带头节点)解决银行业务队列简单模拟问题(c++)-- 数据结构
题目: 7-1 银行业务队列简单模拟 (30 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客 ...
- 简单介绍Struts2
Struts2概述 Struts2虽然是Struts1的基础上发展起来的,但是实质上是以WebWork框架为核心,为传统的Struts1注入了WebWork的设计理念,统一了Struts1和WebWo ...
- java web学习总结(二十二) -------------------简单模拟SpringMVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- Struts2入门(一)——环境搭建和简单例子(Struts2 2.5.2版本)
一.前言 1.了解三大框架 什么是框架? 框架是一种规范,一种规则,一种把技术组织起来的规则,这就是框架. 什么是三大框架(SSH),Struts.hibernate和spring的作用是什么? St ...
- JavaWeb学习总结(四十九)——简单模拟Sping MVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- 如何创建一个简单的struts2程序
如何创建一个简单的Struts2程序 “计应134(实验班) 凌豪” 1.创建一个新的Web项目test(File->new->Web Project) 2.Struts2框架的核心配置文 ...
- spring之mvc原理分析及简单模拟实现
在之前的一篇博客中已经简单的实现了spring的IOC和DI功能,本文将在之前的基础上实现mvc功能. 一 什么是MVC MVC简单的说就是一种软件实现的设计模式,将整个系统进行分层,M(model ...
随机推荐
- eclipse 护眼色
eclipse windows 窗口背景颜色 保护视力 博客分类: 工具使用 EclipseWindows eclipse 窗口背景颜色 windows 窗口背景颜色
- spring利用javamail,quartz定时发送邮件 <转>
原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...
- String的那点小事儿
1.== 比较的是什么? 1 package xupengwei.string; 2 /** 3 * @describe: 4 * @author chenmo-xpw 5 * @version 20 ...
- 《JavaScript高级程序设计》 读书笔记(一)
标签的位置 按照传统的做法,所有<script>元素都应该放在页面的<head>元素中,例如: <!DOCTYPE html> <html> <h ...
- 【不积跬步,无以致千里】mysql 多行合并函数
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- linux 下部署 java quartz job
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- HDU 5002 Tree LCT 区间更新
Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action?c ...
- careercup-排序和查找 11.7
11.7 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.处于实际和美观的考虑,在上面的人要比下面的人矮一点.轻一点.已知马戏团每个人的高度和重量,请编写代码计算叠罗汉最多能叠几个人. ...
- 信号之alarm和pause函数
使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时.当计时器超时时,产生SIGALRM信号.如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程. #incl ...
- Elasticsearch 搜索不到数据问题(_mapping 设置)
需求 由于 kibana3 中,不支持直接在请求的 url 中设置搜索的 type (是不是我不知道???). 为了支持特定 type 的搜索,所以我设置了个下每个 panel 的查询语句,让它增加一 ...