struts过滤器的原理

struts就是充当拦截器(过滤器)的作用。在web.xml配置过滤器,


  1 package cn.itcast.framework.core;
2
3 import java.io.IOException;
4 import java.lang.reflect.Method;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8
9 import javax.servlet.Filter;
10 import javax.servlet.FilterChain;
11 import javax.servlet.FilterConfig;
12 import javax.servlet.ServletException;
13 import javax.servlet.ServletRequest;
14 import javax.servlet.ServletResponse;
15 import javax.servlet.http.HttpServletRequest;
16 import javax.servlet.http.HttpServletResponse;
17
18 import org.apache.commons.beanutils.BeanUtils;
19 import org.dom4j.Document;
20 import org.dom4j.Element;
21
22 import cn.itcast.framework.util.Dom4JUtil;
23
24 public class CenterFilter implements Filter {
25 //存取配置文件信息。key:对应action中的name value:Action对象
26 private Map<String, Action> actions = new HashMap<String, Action>();
27 private FilterConfig filterConfig;
28
29 public void init(FilterConfig filterConfig) throws ServletException {
30 initCfg();//初始化配置文件
31 this.filterConfig = filterConfig;
32
33 }
34 //初始化配置文件
35 private void initCfg() {
36 //读取XML配置文件:把配置文件中的信息封装到对象中.再放到actions中
37
38 Document document = Dom4JUtil.getDocument();
39 Element root = document.getRootElement();
40 //得到所有的action元素,创建Action对象,封装信息
41 List<Element> actionElements = root.elements("action");
42 if(actionElements!=null&&actionElements.size()>0){
43 for(Element actionElement:actionElements){
44 //封装action信息开始
45 Action action = new Action();
46 action.setName(actionElement.attributeValue("name"));
47 action.setClassName(actionElement.attributeValue("class"));
48 String methodXmlAttrValue = actionElement.attributeValue("method");
49 if(methodXmlAttrValue!=null)
50 action.setMethod(methodXmlAttrValue);
51 //封装action信息结束
52
53
54 //得到每个action元素中的result元素,创建Result对象,封装信息
55 //封装属于当前action的结果
56 List<Element> resultElements = actionElement.elements("result");
57 if(resultElements!=null&&resultElements.size()>0){
58 for(Element resultElement:resultElements){
59 Result result = new Result();
60 result.setName(resultElement.attributeValue("name"));
61 result.setTargetUri(resultElement.getText().trim());
62 String typeXmlValue = resultElement.attributeValue("type");
63 if(typeXmlValue!=null){
64 result.setType(ResultType.valueOf(typeXmlValue));
65 }
66 action.getResults().add(result);
67 }
68 }
69 //封装属于当前action的结果
70
71
72
73 //把Action对象都放到Map中
74 actions.put(action.getName(), action);
75 }
76 }
77 }
78 public void doFilter(ServletRequest req, ServletResponse resp,
79 FilterChain chain) throws IOException, ServletException {
80 try {
81 HttpServletRequest request = (HttpServletRequest)req;
82 HttpServletResponse response = (HttpServletResponse)resp;
83 //真正的控制器部分
84
85 //取一个配置参数
86 String aciontPostFixs [] = {"action","","do"};//你请求的地址以action\do\空结尾的话,才真正过滤。默认值
87 String aciontPostFix = filterConfig.getInitParameter("aciontPostFix");
88 if(aciontPostFix!=null){
89 aciontPostFixs = aciontPostFix.split("\\,");
90 }
91
92 //解析用户请求的URI
93 String uri = request.getRequestURI();// /strutsDay01MyFramework/addCustomer.action
94
95 //截取后缀名,看看是否需要我们的框架进行处理
96 //切后缀名
97 String extendFileName = uri.substring(uri.lastIndexOf(".")+1);// /strutsDay01MyFramework/addCustomer.action action
98 //
99
100 /strutsDay01MyFramework/addCustomer.do do
101 //
102
103 /strutsDay01MyFramework/addCustomer ""
104 boolean needProcess = false;
105 for(String s:aciontPostFixs){
106 if(extendFileName.equals(s)){
107 needProcess = true;
108 break;
109 }
110 }
111
112 if(needProcess){
113 //需要框架处理
114 //解析uri中的动作名称
115 String requestActionName = uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf("."));
116 System.out.println("您的请求动作名是:"+requestActionName);
117 //查找actions中对应的Action对象
118 if(actions.containsKey(requestActionName)){
119 Action action = actions.get(requestActionName);
120 //得到类名称的字节码
121 Class clazz = Class.forName(action.getClassName());
122 //封装数据到JavaBean中,利用BeanUtils框架
123 Object bean = clazz.newInstance();
124 BeanUtils.populate(bean, request.getParameterMap());
125 //实例化,调用其中指定的方法名称
126 Method m = clazz.getMethod(action.getMethod(), null);
127 //根据方法的返回值,遍历结果
128 String resultValue = (String)m.invoke(bean, null);
129
130 List<Result> results = action.getResults();
131 if(results!=null&&results.size()>0){
132 for(Result result:results){
133
134 if(resultValue.equals(result.getName())){
135 //根据结果中的type决定是转发还是重定向
136 //重定向的目标就是结果中的targetUri
137 if("dispatcher".equals(result.getType().toString())){
138 //转发
139 request.getRequestDispatcher(result.getTargetUri()).forward(request, response);
140 }
141 if("redirect".equals(result.getType().toString())){
142 //重定向
143 response.sendRedirect(request.getContextPath()+result.getTargetUri());
144 }
145 }
146 }
147 }
148 }else{
149 throw new RuntimeException("The action "+requestActionName+" is not founded in your config files!");
150 }
151
152 }else{
153 chain.doFilter(request, response);
154 }
155 } catch (Exception e) {
156 throw new RuntimeException(e);
157 }
158
159 }
160
161 public void destroy() {
162
163 }
164
165 }

此过滤器初始化的时候读取 默认src下 自己定义的名字
.xml文件,根据dom4j解析,取出配置信息,实例化对象。在doFilter中过滤请求。实质就是配置 .xml文件然后 读取文件进行配置。

struts过滤器的原理,布布扣,bubuko.com

时间: 2024-09-28 17:44:07

struts过滤器的原理的相关文章

struts的工作原理

struts的工作原理是通过struts的配置文件,将你对应的请求进行转接,也就是说: 原来是:A——>B现在是:A——>C——>B 这样的好处是,当你需要改变程序的对应的代码时候,你可以通过修改C来实现,而不需要一个个去改动A了,这样你理解了吧? 当然,还有很多,不过你可以理解为一个代理的功能,他帮助你去处理负责的关系,而你只需要对配置修改,从而起到嫁接的功能.

您的位置:上海剑阀阀门有限公司 &gt; 新闻中心 &gt; 阀门原理 &gt; 过滤器工作原理(图)

过滤器(Filter Valve)是输送介质管道上不可缺少的一种装置,当介质中杂质太多,会影响设备运行的情况下,根据杂质的细粗来选择滤网目数大小,通过滤网将杂质过滤出来,确保后方设备的正常运行,当需要清洗时,只要将可拆卸的滤筒取出,清洗后重新装入即可,因此,使用维护极为方便.过滤器工作原理(图) 过滤器是除去液体中少量固体颗粒的小型设备,可保护设备的正常工作,当流体进入置有一定规格滤网的滤筒后,其杂质被阻挡,而清洁的滤液则由过滤器出口排出,当需要清洗时,只要将可拆卸的滤筒取出,处理后重新装入即可

struts 1.x 原理

Struts 当我接触到这个框架的时候,我就在想为什么是struts,而不是什么CraigFramework.结构.支撑,这样来理解也不难怪了. 为什么需要struts? 在struts in action这本书里,struts的开发者也讲到.在有了MVC后依然需要这样一个框架来支撑开发的工作,因为有了jsp和model和ejb来处理这一套流程还需要什么? 原理 首先需要在tomcat服务器启动,而tomcat启动后.部署在tomcat中的项目启动,相应在根据项目下的web.xml文件来实例化s

Struts1——从BeanUtils看struts的实现原理

在Struts中很典型的特点就是使用了ActionForm来搜集表单数据,但是搜集到的表单数据全部都是String类型的,如果我们直接拿来使用我们会面临一个很麻烦的问题就是频繁的类型装换.Struts中使用了BeanUtils来使我们从繁重的体力劳动中解脱出来. BeanUtils的工作原理: 我们通过一个简单的例子来了解一下他最基本的使用,首先建立一个实体类Student package com.tgb.struts; import java.sql.Date; public class St

Struts过滤器

StrutsPrepareAndExecuteFilter过滤器其实是包含2部分的 StrutsPrepareFilter:做准备 StrutsExecuteFilter:进入Struts2的核心处理.如果是Struts2的请求就会进入该过滤器,处理完后,不放行(由结果类负责显示).如果是非Struts2的请求,比如默认jsp的请求,直接放行. 如果用不到其他过滤器,配置StrutsPrepareAndExecuteFilter即可: 如果用到其他过滤器,还需要使用Struts2准备好的环境,使

Struts过滤器过滤某些字符

(1)天朝的规矩做项目的时候可能需要过滤某些特定的字符,在更多的用途是安全的考虑,下边就是一个过滤字符的简单案例: (2)过滤器代码如下: package com.lc.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletExc

重写struts过滤器

<filter> <filter-name>ExtendStrutsFilter</filter-name> <filter-class> com.lt.xiaoliao.util.ExtendStrutsFilter </filter-class> </filter> <filter-mapping> <filter-name>ExtendStrutsFilter</filter-name> &l

spring DelegatingFilterProxy 过滤器 的原理及运用

DelegatingFilterProxy的原理及使用 DelegatingFilterProxy就是一个对于servlet filter的代理,用这个类的好处主要是通过Spring容器来管理servlet filter的生命周期,还有就是如果filter中需要一些Spring容器的实例,可以通过spring直接注入,另外读取一些配置文件这些便利的操作都可以通过Spring来配置实现. DelegatingFilterProxy的使用方法, 首先在web.xml中配置: <filter> &l

过滤器的原理

问题1:多个过滤器,执行的顺序怎么确定? <filter-mapping>的顺序确定执行的顺序 问题2:每个请求和响应都要经过过滤器吗? 不是,是否经过过滤器,经过几个过滤器由过滤器的路径来定: <url-pattern>/servlet/*</url-pattern> <url-pattern>/*</url-pattern> 问题3:请求和响应时是不是分别将过滤器代码从头到尾执行一遍 不是: 请求时执行预处理操作,响应时执行后处理操作: 请求