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过滤器的原理的更多相关文章

  1. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  2. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_03 过滤器_1_FileFilter过滤器的原理和使用

    FileFilter 需要先定义接口的实现类.并重写过滤的方法 使用 并没有起作用 过滤器的原理 缺少了a.java和b.java 如果是文件夹,就返回true,那么就会返回到Files[]数组中.然 ...

  3. python实现布隆过滤器及原理解析

    python实现布隆过滤器及原理解析     布隆过滤器( BloomFilter )是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地 ...

  4. 综合案例_文件搜索和FileFilter过滤器的原理和使用

    文件搜索 需求 : 遍历D:\aaa文件夹,及 aaa 文件夹的子文件夹并且只要.java结尾的文件 分析: 1.目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录 2.遍历目录时,获取的子文件 ...

  5. FileFilter过滤器的原理和使用和FileNameFilter过滤器的使用

    FileFilter过滤器的原理和使用 package com.yang.Test.FileStudy; import java.io.File; /** * 在File类中有两个和ListFiles ...

  6. struts过滤器和拦截器的区别

    拦截器的工作原理:当接收到一个httprequest ,a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDisp ...

  7. Struts1——从BeanUtils看struts的实现原理2

        上一篇博客中我们简单的介绍了BeanUtils的使用.以及其最主要的原理,今天我们进一步的理解这个类在Struts1中的使用.     首先我们先回想一下搭建一个简单的基于Struts1框架的 ...

  8. struts 1.x 原理

    Struts 当我接触到这个框架的时候.我就在想为什么是struts,而不是什么CraigFramework.结构.支撑,这样来理解也不难怪了. 为什么须要struts? 在struts in act ...

  9. Struts简介、原理及简单实现

    struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/ ...

随机推荐

  1. [xsy2880]取石子游戏

    题意:有$n$堆石子,每堆石子数量相同,以质因数分解给出,不停地从$1$到$n$依次拿石子,使得取完后石子个数为原来的因数(不能不取),当一堆只剩$1$个时结束,问在每堆石子结束的方案数 记石子个数为 ...

  2. vue组件续和前端工程化

    1.3 插槽 slot template: ` <button> <slot></slot> </button> ` <my-button> ...

  3. RMI(Remote Method Invocation ) 概念恢复

    1.RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法. 2.EMI术语 在研究 ...

  4. ACM/CF赛制getstart模板

    (包含整型变量快速读入.简易循环和连续容器的迭代器循环的宏定义.调试时的运行时间输出(编译选项应有“DEBUG”宏定义)等)  1 /*================================ ...

  5. MYSQL复习笔记2-自带工具介绍

    Date: 20140102Auth: Jin 一.mysql 命令行客户端1)base-h host-P port--socket=path,-S path用于连接的套接字文件替换使用IP PORT ...

  6. Word中设置三栏式表格

    一般期刊要求三栏式表格,我原来是选中表格,用橡皮差擦去不必要的线,但是今天发现只能查去横线,竖线一插曲格式就乱了,我想起了上图,不选“内部竖框线”就好了.

  7. [NHibernate]使用AttributeNHibernate.Mapping.Attributes

    系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate ...

  8. [Java基础] java的守护线程与非守护线程

    最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以 ...

  9. pytho文件命名不要内部模块或者引用模块名字相同

    自己写的包和模块,注意命名不要和python内置模块和包.以及引用的模块和包名字冲突

  10. 15.同步类容器Vector

    同步类容器1 1.线程都是安全的. 2.在某些场景下需要加锁来保护“复合操作” a.迭代:反复去访问元素.遍历完容器所有的元素 b.跳转:根据下标制定去访问查找元素 c.条件运算 3.复合操作在多线程 ...