struts过滤器的原理
struts就是充当拦截器(过滤器)的作用。在web.xml配置过滤器,
package cn.itcast.framework.core; import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils;
import org.dom4j.Document;
import org.dom4j.Element; import cn.itcast.framework.util.Dom4JUtil; public class CenterFilter implements Filter {
//存取配置文件信息。key:对应action中的name value:Action对象
private Map<String, Action> actions = new HashMap<String, Action>();
private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException {
initCfg();//初始化配置文件
this.filterConfig = filterConfig; }
//初始化配置文件
private void initCfg() {
//读取XML配置文件:把配置文件中的信息封装到对象中.再放到actions中 Document document = Dom4JUtil.getDocument();
Element root = document.getRootElement();
//得到所有的action元素,创建Action对象,封装信息
List<Element> actionElements = root.elements("action");
if(actionElements!=null&&actionElements.size()>0){
for(Element actionElement:actionElements){
//封装action信息开始
Action action = new Action();
action.setName(actionElement.attributeValue("name"));
action.setClassName(actionElement.attributeValue("class"));
String methodXmlAttrValue = actionElement.attributeValue("method");
if(methodXmlAttrValue!=null)
action.setMethod(methodXmlAttrValue);
//封装action信息结束 //得到每个action元素中的result元素,创建Result对象,封装信息
//封装属于当前action的结果
List<Element> resultElements = actionElement.elements("result");
if(resultElements!=null&&resultElements.size()>0){
for(Element resultElement:resultElements){
Result result = new Result();
result.setName(resultElement.attributeValue("name"));
result.setTargetUri(resultElement.getText().trim());
String typeXmlValue = resultElement.attributeValue("type");
if(typeXmlValue!=null){
result.setType(ResultType.valueOf(typeXmlValue));
}
action.getResults().add(result);
}
}
//封装属于当前action的结果 //把Action对象都放到Map中
actions.put(action.getName(), action);
}
}
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//真正的控制器部分 //取一个配置参数
String aciontPostFixs [] = {"action","","do"};//你请求的地址以action\do\空结尾的话,才真正过滤。默认值
String aciontPostFix = filterConfig.getInitParameter("aciontPostFix");
if(aciontPostFix!=null){
aciontPostFixs = aciontPostFix.split("\\,");
} //解析用户请求的URI
String uri = request.getRequestURI();// /strutsDay01MyFramework/addCustomer.action //截取后缀名,看看是否需要我们的框架进行处理
//切后缀名
String extendFileName = uri.substring(uri.lastIndexOf(".")+1);// /strutsDay01MyFramework/addCustomer.action action
// /strutsDay01MyFramework/addCustomer.do do
// /strutsDay01MyFramework/addCustomer ""
boolean needProcess = false;
for(String s:aciontPostFixs){
if(extendFileName.equals(s)){
needProcess = true;
break;
}
} if(needProcess){
//需要框架处理
//解析uri中的动作名称
String requestActionName = uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf("."));
System.out.println("您的请求动作名是:"+requestActionName);
//查找actions中对应的Action对象
if(actions.containsKey(requestActionName)){
Action action = actions.get(requestActionName);
//得到类名称的字节码
Class clazz = Class.forName(action.getClassName());
//封装数据到JavaBean中,利用BeanUtils框架
Object bean = clazz.newInstance();
BeanUtils.populate(bean, request.getParameterMap());
//实例化,调用其中指定的方法名称
Method m = clazz.getMethod(action.getMethod(), null);
//根据方法的返回值,遍历结果
String resultValue = (String)m.invoke(bean, null); List<Result> results = action.getResults();
if(results!=null&&results.size()>0){
for(Result result:results){ if(resultValue.equals(result.getName())){
//根据结果中的type决定是转发还是重定向
//重定向的目标就是结果中的targetUri
if("dispatcher".equals(result.getType().toString())){
//转发
request.getRequestDispatcher(result.getTargetUri()).forward(request, response);
}
if("redirect".equals(result.getType().toString())){
//重定向
response.sendRedirect(request.getContextPath()+result.getTargetUri());
}
}
}
}
}else{
throw new RuntimeException("The action "+requestActionName+" is not founded in your config files!");
} }else{
chain.doFilter(request, response);
}
} catch (Exception e) {
throw new RuntimeException(e);
} } public void destroy() { } }
此过滤器初始化的时候读取 默认src下 自己定义的名字 .xml文件,根据dom4j解析,取出配置信息,实例化对象。在doFilter中过滤请求。实质就是配置 .xml文件然后 读取文件进行配置。
struts过滤器的原理的更多相关文章
- Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题
Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_03 过滤器_1_FileFilter过滤器的原理和使用
FileFilter 需要先定义接口的实现类.并重写过滤的方法 使用 并没有起作用 过滤器的原理 缺少了a.java和b.java 如果是文件夹,就返回true,那么就会返回到Files[]数组中.然 ...
- python实现布隆过滤器及原理解析
python实现布隆过滤器及原理解析 布隆过滤器( BloomFilter )是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地 ...
- 综合案例_文件搜索和FileFilter过滤器的原理和使用
文件搜索 需求 : 遍历D:\aaa文件夹,及 aaa 文件夹的子文件夹并且只要.java结尾的文件 分析: 1.目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录 2.遍历目录时,获取的子文件 ...
- FileFilter过滤器的原理和使用和FileNameFilter过滤器的使用
FileFilter过滤器的原理和使用 package com.yang.Test.FileStudy; import java.io.File; /** * 在File类中有两个和ListFiles ...
- struts过滤器和拦截器的区别
拦截器的工作原理:当接收到一个httprequest ,a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDisp ...
- Struts1——从BeanUtils看struts的实现原理2
上一篇博客中我们简单的介绍了BeanUtils的使用.以及其最主要的原理,今天我们进一步的理解这个类在Struts1中的使用. 首先我们先回想一下搭建一个简单的基于Struts1框架的 ...
- struts 1.x 原理
Struts 当我接触到这个框架的时候.我就在想为什么是struts,而不是什么CraigFramework.结构.支撑,这样来理解也不难怪了. 为什么须要struts? 在struts in act ...
- Struts简介、原理及简单实现
struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/ ...
随机推荐
- [Codeforces-div.1 55D] Beautiful numbers
[Codeforces-div.1 55D] Beautiful numbers 试题分析 还是离散化...\(f_{i,j,k}\)表示i位,gcd为j,余数为k. #include<iost ...
- FZU 2105 Digits Count(按位维护线段树)
[题目链接] http://acm.fzu.edu.cn/problem.php?pid=2105 [题目大意] 给出一个序列,数字均小于16,为正数,每次区间操作可以使得 1. [l,r]区间and ...
- 【数论】【莫比乌斯反演】【线性筛】bzoj2301 [HAOI2011]Problem b
对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 100%的数据满足:1≤n≤50000,1≤a≤b ...
- 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
题意:给你一张图,给你每个点的权值,要么是-1,要么是1,要么是0.如果是-1就不用管,否则就要删除图中的某些边,使得该点的度数 mod 2等于该点的权值.让你输出一个留边的方案. 首先如果图内有-1 ...
- [JSOI2018]军训列队
[JSOI2018]军训列队 题目大意: \(n(n\le5\times10^5)\)个学生排成一排,第\(i\)个学生的位置为\(a_i\).\(m(m\le5\times10^5)\)次命令,每次 ...
- Problem C: 程序改错(递归函数):数字转字符
Description 下面程序中“/ ***** N ***** /”的下一行中有错误,请改正(注意:不得加行.减行.加句.减句,否则后果自负). 该程序功能:用递归法将一个六位整数n转换成字符串, ...
- 调整Chrome中文字体为雅黑
几天试了一下Chrom发布的Chrome 37,感觉所谓的Direct2D渲染还是有些效果的,但这只体现在英文上,中文的宋体还是非常的不舒服,便试着将其替换成了雅黑,这里介绍一下相关方法. Chrom ...
- 各种GCC
Cross GCC Cygwin GCC Linux GCC MacOSX GCC MinGW GCC Solaris GCC Clang
- material design动画
这是一篇material design 文档动画部分的学习! Summary: Material Design动画交互 动画速度的3个原则 3种交互方式 如何设计有意义的动画 使人高兴的动画细节 1 ...
- 加速 Android Studio 的编译速度 2.2
Android studio 2.2 当中有一项新的功能:Dex In Process. 这项功能可以动态的加快编译速度,以及提高Instant Run 的效率. 那么怎么来使用这项新功能呢?你只需要 ...