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/ ...
随机推荐
- SNOI2017(BZOJ5015~5018)泛做
T1:礼物 想错方向了,实际上很简单. 我想的是:显然题目求的是$\sum_{i=1}^{n} i^{k}2^{i}$,然后或许可以通过化式子变成与n无关的复杂度? 然后就不停往斯特林数反演和下降幂的 ...
- [xsy2309]数字表格
题意:求$\prod\limits_{i=1}^n\prod\limits_{j=1}^mf_{(i,j)}$,其中$f_0=0,f_1=1,f_n=f_{n-1}+f_{n-2}$ 很妙的题 假设$ ...
- (疯狂java)第三课
最近很忙,都没有看书,罪过... 第五章(面向对象上) 1.类是一种对数据结构的封装,也就是说,一个类在在理解上事存在实际的含义的,比如一个人类,人类也是个类,表明这个类不是家禽类,是有人的特点的生物 ...
- echarts 关系图graph force布局 拖动节点并固定不返回原点
myChart.on('mouseup',function(params){var option=myChart.getOption();option.series[0].nodes[params.d ...
- [BZOJ1003](ZJOI 2006) 物流运输trans
[题目描述] 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟 ...
- 【MySQL笔记】解除输入的安全模式,Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE tha ...
- Linux PHP 编译参数详解(二)
对于喜欢玩开源软件的童鞋么,都喜欢自己编译安装程序,本文说明下如何编译安装php的详细参数. 示例: ./configure \ --prefix=/usr/local/php --with-zlib ...
- .net中的泛型
泛型把类或方法的类型的确定推迟到实例化该类或方法的时候 ,也就是说刚开始声明是不指定类型,等到要使用(实例化)时再指定类型 泛型可以用于 类.方法.委托.事件等 下面先写一个简单的泛型 public ...
- Unity 加密解密
解密无非就为了 修改游戏功能数据.提取游戏资源.加入自己想加的广告...加密就是保护游戏不被恶意修改,经常看到有人说:"加什么密,你以为自己写的代码很NB?见不得人?"我只想说,加 ...
- 某游戏研究之字符过滤类-WorldFilter
所谓字符过滤器,常常用在聊天的内容,比如一连串的骂人难听的话,我们要屏蔽掉,避免造成不好的东西! 当然我作为中华天朝一个有文明有素质的人,肯定偶尔会做这样的事情啦,特别是打LOL的时候,算了不讲了,都 ...