struts2动态调用+Servlet过滤器+struts2拦截器
周末真的是懒到心慌。。。。。。
本文是在完整s2sh项目基础上添加的,不太了解s2sh项目构建的朋友可以先参考一下这几篇文章:
eclipse环境下基于tomcat-7.0.82构建struts2项目
eclipse环境下基于已构建struts2项目整合spring+hibernate
基于已构建S2SH项目配置全注解方式简化配置文件
首先简单说明一下为什么需要在s2sh项目中配置题目所述三项:
1.struts2动态调用:
如果不配置动态调用,我们只能在一个action中调用一个默认excute()方法,每请求调用一个方法就需要编写一个action,这样就会加大开发的工作量,因此这是刚需。
2.Servlet过滤器
Servlet过滤器我们可以理解为一个独立的web组件,它拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。
3.struts2拦截器
struts2拦截器是是其核心,拦截器可以让我们在action和result执行之前或者之后完成一些操作,比如权限验证,未登陆的用户不被允许访问某些资源等。
过滤器与拦截器的区别
首先过滤器是基于servlet的基础上进行的操作,是属于全局的,可过滤到所有请求资源,包括.css等文件,而拦截器是基于struts2的,只能过滤到请求action的方法。
相同点,二者的实现都可看作是模块化的,可理解为是aop的一种策略。
配置步骤:
第一步:配置struts2动态调用
在struts.xml配置文件中的<struts></struts>节点内声明struts2支持动态调用、并规定匹配怎样的字符交给struts2进行处理,代码如下:
<!-- 让struts2支持动态方法调用 以感叹号方式调用action中的多个方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 所有匹配*.action、do的请求都由struts2处理 -->
<constant name="struts.action.extension" value="action,do" />
第二步:配置servlet过滤器
过滤器的配置需要我们实现servlet的Filter接口,并实现其抽象方法destroy()、doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2)、init(FilterConfig arg0),三个方法含义分别是初始化、过滤操作、销毁,接着需要我们在web.xml进行声明自定义过滤器,因为web.xml才是servlet的第一容器,给出自定义过滤器代码如下:
package wjt.com.test.filter; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class CharacterFilter implements Filter{ @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("过滤器...");
arg2.doFilter(arg0, arg1);
} @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub } }
修改后的web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SSHDemo</display-name> <!-- spring的监听器配置开始 -->
<!-- spring监听器的作用:提供实例(IOC) -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param> <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!--过滤非法字符,该配置必须在最前面 -->
<filter>
<filter-name>characterFilter</filter-name>
<filter-class>wjt.com.test.filter.CharacterFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping> <!-- 指定过滤器映射 -->
<filter-name>characterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 将请求路径交由struts过滤 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
第三步:配置struts2拦截器
struts2的拦截器接口有多个,根接口也包含初始化、执行拦截操作、销毁三个抽象方法,这里我们继承MethodFilterInterceptor抽象类,该类内部已经对初始化和销毁的方法进行了实现,因此只需要实现执行拦截操作的抽象方法即可,当然如果有初始化和销毁操作,我们这里也可以对其进行定义覆盖父类同名方法的实现,代码如下:
package wjt.com.test.interceptor; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; /**
* 自定义方法拦截器
*
* @author Together
*
*/
public class MethodInterceptor extends MethodFilterInterceptor{ /**
*
*/
private static final long serialVersionUID = 1L; @Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
System.err.println("拦截器生效...");
String action=(String) ServletActionContext.getRequest().getSession().getAttribute("action");
System.out.println("action:"+action);
StringBuffer requstPath=ServletActionContext.getRequest().getRequestURL();
System.out.println("requstPath:"+requstPath);
System.err.println("拦截器结束...");
return arg0.invoke();
} }
配置struts.xml文件,使拦截器生效,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"><!-- 这里要和struts2版本号统一 --> <struts> <!-- 告知Struts2运行时使用Spring来创建对象 -->
<constant name="struts.objectFactory" value="spring" /> <!-- 让struts2支持动态方法调用 以感叹号方式调用action中的多个方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 所有匹配*.action、do的请求都由struts2处理 -->
<constant name="struts.action.extension" value="action,do" /> <package name="default" namespace="/" extends="struts-default"> <interceptors> <!-- 先定义拦截器 -->
<interceptor name="myInterceptor" class="wjt.com.test.interceptor.MethodInterceptor">
<!-- 指定系统初始化给拦截器的参数 -->
<!-- <param name="hello">吴静涛</param> -->
</interceptor> <!-- 加到自己设置的拦截器栈里边去 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack> </interceptors> <!-- 改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去 -->
<default-interceptor-ref name="myStack" /> </package> </struts>
配置action实现类,若使对action实现类的请求经过自定义拦截器的处理,需要我们对其添加@ParentPackage("default"),该注解添加到action类名上方,作为action的第一注解存在。
测试:
到这里题目所属三项配置就完毕了,启动项目并请求action后截图如下所示表示配置成功:
这里只给出简单配置,读者朋友最好还是在理解原理的前期下使用,本人还是刚毕业小白,对原理的理解还不够深,还没能达到陈述原理的水平,有不合理的地方还请大家指出。
struts2动态调用+Servlet过滤器+struts2拦截器的更多相关文章
- Servlet 过滤器、拦截器、监听器以及文件上传下载
在学习之初,总是对过滤器.拦截器.监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力! 如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户 ...
- Struts2之过滤器和拦截器的区别
刚学习Struts2这个框架不久,心中依然有一个疑惑未解那就是过滤器和拦截器的区别,相信也有不少人跟我一样对于这个问题没有太多的深入了解 那么下面我们就一起来探讨探讨 过滤器,是在java web中, ...
- Struts2 过滤器与拦截器
学习Struts2时,发现有过滤器和拦截器,他们貌似都是一样的功能,但是为什么会有2个不同的名称呢?肯定是有区别的,所以打算自己整理一下. 过滤器,是在java web中,你传入的request,re ...
- struts2 过滤器和拦截器的区别和使用
java web 过滤器和拦截器的区别和使用 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然 ...
- Struts2中过滤器和拦截器的区别
拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...
- [ SSH框架 ] Struts2框架学习之四(自定义拦截器)
一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...
- struts2.1.6教程五、拦截器
在前面我们已经初步使用过拦截器,下面继续细细探讨. 1.概述strust2中的拦截器 拦截器是Struts2框架的核心,它主要完成解析请求参数.将请求参数赋值给Action属性.执行数据校验.文件上传 ...
- Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】
什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...
- Struts2.0 封装请求数据和拦截器介绍
1. Struts2 框架中使用 Servlet 的 API 来操作数据 1.1 完全解耦合的方式 Struts2 框架中提供了一个 ActionContext 类,该类中提供了一些方法: stati ...
随机推荐
- playbooks框架部署远程主机
进入到ansible和python环境 进入python3.6虚拟环境 #su - deploy #source .py3-a2.5-env/bin/activate 加载ansible 2.5版本 ...
- java 赋值运算
注意:在赋值运算的时候,会自动发生数据类型转变 例子 public class test{ public static void main(String[] args){ byte num = 5; ...
- kafka(一)-为什么选择kafka
作为开发人员,我们在选择一个框架或者工具时,我们都需要考虑些什么,我们不是头脑发热,一拍脑袋就它了,我们首先要认清这个框架或工具的作用是什么,能给我们带来什么样的好处,同时也要考虑带来什么样的负面结果 ...
- IDEA新建maven项目没有webapp目录解决方法
转载地址:https://www.cnblogs.com/oldzhang1222/p/10429827.html 先创建的页面修改路径 修改路径如下 添加并完善路径\src\main\webapp ...
- PSP第一次总结
项目计划总结 周活动总结表 姓名:王金萱 ...
- (转) exp1-1:// 一次有趣的XSS漏洞挖掘分析(1)
from http://www.cnblogs.com/hookjoy/p/3503786.html 一次有趣的XSS漏洞挖掘分析(1) 最近认识了个新朋友,天天找我搞XSS.搞了三天,感觉这一套 ...
- Nito.AsyncEx 这个库
有一个非常聪明的小伙子 (我高度赞扬) 叫 Stephen Cleary ,他写了一个很棒的 Extension 集,共同参与开发的还有 Stephen Toub (他显然是经验丰富的),所以我充分信 ...
- Yum注册
我虚拟机安装的系统是RedHat Enterprise Linux 6.4-i686,是32位的.使用yum命令安装软件时候出现以下错误: This system is not registered ...
- ReactNative---卡顿问题及性能优化
ReactNative性能优化 在reactnative 中如果要更改DOM中的数据显示,只有通过setState方法来实现:但是当setState时,要刷新整个DOM:在一般情况先还能保证体验,但是 ...
- 机器学习-计算机视觉和卷积网络CNN
概述 对于计算机视觉的应用现在是非常广泛的,但是它背后的原理其实非常简单,就是将每一个像素的值pixel输入到一个DNN中,然后让这个神经网络去学习这个模型,最后去应用这个模型就可以了.听起来是不是很 ...