`

struts03:拦截器、过滤器与拦截器的区别、文件上传

 
阅读更多

第一:概念

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 中拦截器与过滤器的区别及执行顺序 Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器...

    Struts2 拦截器过滤方法(二十八)

    在"Struts2 拦截器过滤方法(二十八)"这个主题中,我们将深入探讨Struts2拦截器的工作原理、如何创建自定义拦截器以及它们在实际应用中的作用。 首先,拦截器是基于Java的动态代理机制实现的,它们在Action执行...

    Struts 2 过滤器和拦截器的区别

    ### Struts 2 过滤器与拦截器的深入解析 #### 一、概述 在Struts 2框架中,过滤器(Filter)和拦截器(Interceptor)都是用于处理请求的关键组件,但它们之间存在本质的区别。正确理解这些差异有助于开发者更高效地...

    struts2 拦截器

    2. **配置拦截器**:在`struts.xml`配置文件中定义拦截器,指定其执行顺序和关联的Action。 3. **注册拦截器**:将自定义拦截器加入到`struts-default`或`struts-plugin`拦截器栈中,或者创建新的拦截器栈并应用到...

    Struts2拦截器实现权限控制demo

    在Struts2的核心配置文件`struts.xml`中,我们可以定义拦截器链,指定哪些拦截器应用于哪些Action。 权限控制是web应用中不可或缺的一部分,它可以防止未经授权的用户访问特定资源。在Struts2中,我们可以通过拦截...

    struts2 trim拦截器 过滤首尾空格

    Struts2 Trim拦截器过滤首尾空格 Struts2框架提供了拦截器机制,可以在Action执行前后执行某些操作,以满足特定的需求。TrimInterceptor就是一个这样的拦截器,它的主要功能是过滤请求数据的首尾空格。 ...

    使用struts2拦截器对登陆权限验证

    在Struts2配置中,我们需要将这个拦截器添加到拦截器栈中,通常是在`struts.xml`文件中。这样,每次请求到达Action之前,都会先经过这个拦截器: ```xml &lt;struts&gt; ...

    Struts2 拦截器

    在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的基本概念。拦截器是在Action调用之前和之后执行的一段代码,可以用来做日志记录、权限检查...

    Java Struts 实现拦截器

    ### Java Struts 实现拦截器的关键知识点 #### Struts2框架概述 Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架。它利用一系列的组件来处理用户请求并生成响应。其中,拦截器...

    12 struts2拦截器

    自定义拦截器需要在配置文件中声明并添加到拦截器栈中,与其他拦截器一起工作。 6. **拦截器栈**: 拦截器栈是由多个拦截器组成的一个链条,它们按顺序执行。同一个拦截器栈中的拦截器可以重复出现,每次出现的...

    Struts2编写的通用(拦截器,过滤器)Filter

    在本项目中,过滤器可能与拦截器协同工作,同样负责验证用户登录状态。通常,过滤器通过实现`javax.servlet.Filter`接口并重写`doFilter()`方法来实现。过滤器可以全局应用,对所有请求或特定URL模式生效。 **非法...

    Struts2拦截器的实现原理(csdn)————程序.pdf

    1. **初始化拦截器栈**:当Struts2框架启动时,会根据配置文件(struts.xml)中的配置信息,创建一个拦截器栈。这个栈包含了所有需要执行的拦截器,它们按照配置的顺序排列。 2. **请求到来**:当用户发起HTTP请求...

    浅谈Struts2拦截器的原理与实现.docx

    以下是对Struts2拦截器原理与实现的详细解析: 1. **拦截器的概念** Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加...

    struts2实例 自定义过滤器 文件上传下载 登录功能

    本实例展示了如何在Struts2环境中实现几个关键功能:自定义过滤器、文件上传下载以及用户登录功能。这些功能是任何Web应用程序的基础组成部分,理解和掌握它们对于提升Web开发技能至关重要。 首先,我们来探讨...

    struts2拦截器原理

    配置拦截器通常在`struts.xml`配置文件中进行。例如,你可以这样配置一个Action: ```xml &lt;result name="success"&gt;/success.jsp &lt;result name="error"&gt;/error.jsp ``` 在这个例子中,`defaultStack`是...

    struts2工作原理及拦截器和过滤器

    Struts2 工作原理及拦截器和过滤器 Struts2 框架的工作原理可以分为以下几个步骤: 1. 客户端发出一个指向 Servlet 容器的请求(Tomcat); 2. 这个请求会经过几个过滤器,最后会到达 FilterDispatcher 过滤器。...

    拦截器和过滤器的区别

    ### 拦截器与过滤器的区别 #### 一、概念理解 - **拦截器**:拦截器(Interceptor)主要用于AOP(面向切面编程)领域,在Java Web开发中主要应用于Struts2框架中,其核心是利用Java的反射机制实现特定功能的执行。...

    基于struts2的文件上传+过滤器

    本篇文章将详细介绍如何在Struts2中实现文件上传功能以及使用过滤器进行文件类型的过滤。 首先,理解Struts2文件上传的基本原理。Struts2提供了`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器来...

Global site tag (gtag.js) - Google Analytics