第一:概念
1.拦截器(默认完成了struts基本功能,我们写的方法专门做我们自己的事):过滤器filter是针对web请求和响应进行过滤。拦截器interceptor是针对某个方法执行之前和之后进行拦截(特定的逻辑操作)(其实就是在前后加特定的功能)。
例如:params拦截器:负责将请求参数设置成为action属性。
servletConfig:拦截器将源于servlet的api中的各种对象注入到action
fileUpdate拦截器:对文件上提供支持。
exception拦截器:捕获异常,并且将异常映射到用户自定义的错误页面。
vaildation拦截器:调用验证框架进行数据验证。
workflow拦截器:调用action类的validate(),执行编码验证。
2.代理对象:包含原来的功能(目标对象的功能)和扩展的功能。原理是代理对象和被代理对象实现同一个接口。(代理对象持有被代理类的引用类)
3.实现拦截器的步骤:注意:拦截器随着项目的加载而加载
---1.创建一个类实现interceptor接口(struts的接口),重写三个方法(我们是在struts框架下的拦截器,拦截的是action,也就是对execute方法(action中的方法)进行前后拦截)
在重写的方法中的Actioninvoaction形参中能够获得目标对象和代理对象。拦截器中返回被代理对象的返回结果。
---2.配置Interceptor拦截器,并注册到action中(针对action中的方法进行拦截)
interceptor-stack 是拦截器栈,<interceptor-ref name="defaultStack"></interceptor-ref>是引用struts2默认的拦截器栈,只要上面有extends=struts-default这个属性,name="defaultStack"就会有效。
3.Actioninvoaction.getAction是得到目标对象。
Actioninvoaction.invoke是调用应用action(目标对象)中的方法。(并继续执行剩余的拦截器和Action
)。
ActionInvocation(action印我k神)是获得应用action的状态
4.配置拦截器:在struts.xml中,<interceptors>进行配置拦截器,这个标签里放的是拦截器或者是拦截器栈。(因特塞pt)
里面的<interceptor>标签是通过反射创建一个拦截器对象,也就是说这样在项目加载的时候创建对象。
里面的拦截器栈<interceptor-stack>里面的<interceptor-ref>是指拦截器栈中引用哪个拦截器。注意:拦截器栈就是在所有拦截器中选出几个最基本最常用的放在一起。
也就是说我的拦截器中包含系统拦截器栈,还有我的拦截器,因为只有加了系统的才能完成struts中拦截的基本功能。(把系统的拦截器栈放在我的拦截器前面,是因为栈的先进后出原则)。
最后把拦截器栈加入action中,表示给这个action加入了拦截器。
5.文件上传:其实就是在使用系统的拦截器fileUpload类。把内存中的临时文件拷贝到磁盘中。
---1.固定的属性(因为我们用的是系统的)。三个属性:文件域。文件的名字,文件内容的类型
注意:cope是将文件从一个文件拷贝到另外一个文件。
FileUtils是struts提供的,在commons-io-1.3.2.jar这个jar包中
/* (1)如果没有下一个拦截器,invocation.invoke()方法
* 的执行,实际上是action的execute的方法的执行
* (2)如果有下一个拦截器,invocation.invoke()方法的执行,
* 是指下一个拦截器的interpt方法的执行*/
项目执行过程:jsp页面--->struts核心控制器(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)-->struts2核心配置文件(struts.xml)
注意:action中的属性如果绑定到了值栈上下文中,其实也就是绑定到了值栈中,也同时绑定到了值栈上下文中的request对象中。
问1:为什么action中的属性如果绑定到了值栈上下文中,其实也就是绑定到了值栈中?
答:因为值栈上下文中有个固定绑定叫action(放的是action层的属性),这个固定绑定的键是action,值就是值栈,因此如果是把action层属性放到值栈上下文中了,也就是把属性放在了值栈了
问2:为什么也同时绑定到了值栈上下文中的request对象中?
答:放在值栈上下文中的东西默认也放在了request对象中。
第二:拦截器
1.jsp页面:表单提交到struts.xml里的login里
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="login.action" method="post">
姓名:<input type="text" name="uname" value=""><br/>
密码:<input type="text" name="upwd" value=""><br/>
角色:<input type="text" name="role" value=""><br/>
<input type="submit" name="sub" value=" 登 录 "><br/>
</form>
<s:debug></s:debug>
</body>
</html>
2.action类:struts.xml的login将会调用class="com.action.UserAction"
package com.action;
import java.util.ArrayList;
import java.util.Map;
import javax.servlet.http.HttpSession;
import com.opensymphony.xwork2.ActionContext;
public class UserAction {
private String uname;
private String upwd;
private String role;
//private ArrayList<String> opList=new ArrayList<String>();
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
/*public ArrayList<String> getOpList() {
return opList;
}
public void setOpList(ArrayList<String> opList) {
this.opList = opList;
}*/
public String execute(){
if(uname.equals("admin")&&upwd.equals("0000")){
ActionContext ac = ActionContext.getContext();
Map<String,Object> session=ac.getSession();
session.put("role",role);
//opList.add("lllllllllll");
//session.put("opList",opList);
return "success";
}else{
return "index";
}
}
}
3.拦截器的调用(但是在调用class="com.action.UserAction"这个类之前先会进入拦截器(看struts.xml可以看出来))
package com.action;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor{
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("---------destroy");
}
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("---------init");
}
//前后拦截action
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//1.调用方法之前拦截
Object obj = invocation.getAction();//得到被代理对象(目标对象),得到此时被拦截器拦截的action
System.out.println("----------被拦截action:"+obj);
//2.调用方法
String result=invocation.invoke();//调用应用action中的方法(由于拦截器配置在了action中,因此拦截器对象能够找到这个应用action(目标对象))。调用完成后继续执行剩余的过滤器和action
//3.调用之后拦截
ActionContext ac = ActionContext.getContext();//获得上下文对象
Map<String, Object> session = ac.getSession();//通过值栈上下文对象获得该对象的一个固定绑定:session
Object role = session.get("role");
if(result.equals("success")){
List<String> opList=new ArrayList<String>();
//UserAction u=new UserAction();
//ArrayList<String> opList = u.getOpList();
if(String.valueOf(role).equals("1")){
opList.add("会员管理");
opList.add("---会员添加");
opList.add("---会员列表");
opList.add("商品管理");
opList.add("---商品添加");
opList.add("---商品列表");
}else
if(String.valueOf(role).equals("2")){
opList.add("任务管理");
opList.add("---定制任务");
opList.add("---任务分配");
}
session.put("opList",opList);
return result;
}
return "index";
}
}
5.返回成功
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'success.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
${session.opList}
<h2>dddddddddd</h2>
<s:property value="opList"/><br><!-- 获得的是值栈中的属性,由于opList不是action层的属性,因此也不是值栈中的属性,因此不能输出 -->
<c:forEach var="str" items="${opList}">
${str}<br>
</c:forEach>
<s:debug/>
</body>
</html>
第三:文件上传
1.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="faction.action" method="post" enctype="multipart/form-data">
img:<input type="file" name="img" value=""><br/>
<input type="submit" name="sub" value=" 上 传 "><br/>
</form>
</body>
</html>
2.struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="text_file" namespace="" extends="struts-default">
<action name="faction" class="com.action.FileAction">
<result name="success">success.jsp</result>
</action>
</package>
</struts>
3.action层
package com.action;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import freemarker.template.utility.Execute;
public class FileAction {
private File img;//文件,这里这个文件保存的是点击上传按钮时候的临时文件
private String imgFileName;//文件名
private String imgContenttype;//文件类型,文件内容的类型,不是文件后缀
public File getImg() {
return img;
}
public void setImg(File img) {
this.img = img;
}
public String getImgFileName() {
return imgFileName;
}
public void setImgFileName(String imgFileName) {
this.imgFileName = imgFileName;
}
public String getImgContenttype() {
return imgContenttype;
}
public void setImgContenttype(String imgContenttype) {
this.imgContenttype = imgContenttype;
}
public String execute() {
System.out.println("临时文件:"+img);//\Tomcat 6.0\work\Catalina\localhost\chu_struts03_file\\upload__5c8a98d2_1495a86f8cd__8000_00000000.tmp;
//1.获得文件在tomcat服务器上的保存目录。其实就是获得img文件夹的绝对路径
/*
* ServletContext application = ServletActionContext.getServletContext();//这是通过ServletActionContext获得servlet技术中的application
application.getRealPath("img");//获得绝对路径(getRealPath方法没过时)
HttpServletRequest request = ServletActionContext.getRequest();//通过servletActionContext对象获得servletAPI中的request对象
request.getRealPath("img");//获得绝对路径(他的getRealPath方法过时了)
*/
String path=ServletActionContext.getServletContext().getRealPath("img");//这是目录,当项目启动的时候webroot下面的img文件夹将部署到tomcat服务器中,这里是找到这个文件夹的绝对(物理)路径
System.out.println("----------"+path);//F:\Tomcat 6.0\webapps\chu_struts03_file\img
//2.这是获得文件在tomcat下保存的文件。也就是目录+文件名。
File f=new File(path+"/"+imgFileName);//这是目录下的文件
System.out.println("文件:"+f);//F:\Tomcat 6.0\webapps\chu_struts03_file\img\1247561947.jpg
try {
//拷贝文件,第一个参数是原来文件(也就是我们的属性,当我们点击按钮的时候文件已经被保存到这里了,可以看jsp中写了name="img"。第二个参数是我要拷贝到哪个文件里)
FileUtils.copyFile(img, f);//从tomcat下的临时文件换成tomcat服务器下固定的文件
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
}
相关推荐
Struts2 中拦截器与过滤器的区别及执行顺序 Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器...
在"Struts2 拦截器过滤方法(二十八)"这个主题中,我们将深入探讨Struts2拦截器的工作原理、如何创建自定义拦截器以及它们在实际应用中的作用。 首先,拦截器是基于Java的动态代理机制实现的,它们在Action执行...
### Struts 2 过滤器与拦截器的深入解析 #### 一、概述 在Struts 2框架中,过滤器(Filter)和拦截器(Interceptor)都是用于处理请求的关键组件,但它们之间存在本质的区别。正确理解这些差异有助于开发者更高效地...
2. **配置拦截器**:在`struts.xml`配置文件中定义拦截器,指定其执行顺序和关联的Action。 3. **注册拦截器**:将自定义拦截器加入到`struts-default`或`struts-plugin`拦截器栈中,或者创建新的拦截器栈并应用到...
在Struts2的核心配置文件`struts.xml`中,我们可以定义拦截器链,指定哪些拦截器应用于哪些Action。 权限控制是web应用中不可或缺的一部分,它可以防止未经授权的用户访问特定资源。在Struts2中,我们可以通过拦截...
Struts2 Trim拦截器过滤首尾空格 Struts2框架提供了拦截器机制,可以在Action执行前后执行某些操作,以满足特定的需求。TrimInterceptor就是一个这样的拦截器,它的主要功能是过滤请求数据的首尾空格。 ...
在Struts2配置中,我们需要将这个拦截器添加到拦截器栈中,通常是在`struts.xml`文件中。这样,每次请求到达Action之前,都会先经过这个拦截器: ```xml <struts> ...
在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的基本概念。拦截器是在Action调用之前和之后执行的一段代码,可以用来做日志记录、权限检查...
### Java Struts 实现拦截器的关键知识点 #### Struts2框架概述 Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架。它利用一系列的组件来处理用户请求并生成响应。其中,拦截器...
自定义拦截器需要在配置文件中声明并添加到拦截器栈中,与其他拦截器一起工作。 6. **拦截器栈**: 拦截器栈是由多个拦截器组成的一个链条,它们按顺序执行。同一个拦截器栈中的拦截器可以重复出现,每次出现的...
在本项目中,过滤器可能与拦截器协同工作,同样负责验证用户登录状态。通常,过滤器通过实现`javax.servlet.Filter`接口并重写`doFilter()`方法来实现。过滤器可以全局应用,对所有请求或特定URL模式生效。 **非法...
1. **初始化拦截器栈**:当Struts2框架启动时,会根据配置文件(struts.xml)中的配置信息,创建一个拦截器栈。这个栈包含了所有需要执行的拦截器,它们按照配置的顺序排列。 2. **请求到来**:当用户发起HTTP请求...
以下是对Struts2拦截器原理与实现的详细解析: 1. **拦截器的概念** Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加...
本实例展示了如何在Struts2环境中实现几个关键功能:自定义过滤器、文件上传下载以及用户登录功能。这些功能是任何Web应用程序的基础组成部分,理解和掌握它们对于提升Web开发技能至关重要。 首先,我们来探讨...
配置拦截器通常在`struts.xml`配置文件中进行。例如,你可以这样配置一个Action: ```xml <result name="success">/success.jsp <result name="error">/error.jsp ``` 在这个例子中,`defaultStack`是...
Struts2 工作原理及拦截器和过滤器 Struts2 框架的工作原理可以分为以下几个步骤: 1. 客户端发出一个指向 Servlet 容器的请求(Tomcat); 2. 这个请求会经过几个过滤器,最后会到达 FilterDispatcher 过滤器。...
### 拦截器与过滤器的区别 #### 一、概念理解 - **拦截器**:拦截器(Interceptor)主要用于AOP(面向切面编程)领域,在Java Web开发中主要应用于Struts2框架中,其核心是利用Java的反射机制实现特定功能的执行。...
本篇文章将详细介绍如何在Struts2中实现文件上传功能以及使用过滤器进行文件类型的过滤。 首先,理解Struts2文件上传的基本原理。Struts2提供了`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器来...