架构:
===============================struts2 核心接口和类=========================
名称 作用
ActionMapper 根据请求的URI查找是否存在对应Action调用
ActionMapping 保存调用Action的映射信息,如namespace、name等
ActionProxy 在XWork和真正的Action之间充当代理
ActionInvocation 表示Action的执行状态,保存拦截器、Action实例
Interceptor 在请求处理之前或者之后执行的Struts 2组件
===============================struts2 拦截器=========================
struts2大多数核心功能是通过拦截器实现,每个拦截器完成某项功能,拦截器之间可以互相自由组合
拦截器方法在Action执行之前或执行之后
拦截器栈
1.结构:相当于多个拦截器的组合
2.功能:也是拦截器
与过滤器原理相似
为Action提供附加功能,无须修改Action代码,使用拦截器来提供
三阶段执行周期:
1.Action执行前的预处理
2.将控制交给后续拦截器或者返回字符串(执行Action)
3.Action执行后的处理
范例:
1 public class MyTimeInterceptor extends AbstractInterceptor { 2 /* (non-Javadoc) 3 * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) 4 */ 5 @Override 6 public String intercept(ActionInvocation actionInvocation) throws Exception { 7 //预处理工作 8 System.out.println("执行Action之前"); 9 long startTime = System.currentTimeMillis(); 10 11 //执行后续拦截器或Action 12 String result = actionInvocation.invoke(); 13 14 //后续处理工作 15 System.out.println("执行Action之后"); 16 long execTime = System.currentTimeMillis() - startTime; 17 System.out.println("The interval time is "+execTime+" ms"); 18 19 //返回结果字符串 20 return result; 21 } 22 }
拦截器的xml配置:struts.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" > 3 <struts> 4 <!-- namespace是请求路径 --> 5 <package name="default" namespace="/" extends="struts-default"> 6 7 <!-- 配置拦截器 --> 8 <interceptors> 9 <!-- 定义单个拦截器 --> 10 <interceptor name="myTime" class="com.Elastic.StrutsDemo3.ivy.interceptor.MyTimeInterceptor"></interceptor> 11 <interceptor name="authorization" class="com.Elastic.StrutsDemo3.ivy.interceptor.AuthorizationInterceptor"></interceptor> 12 13 <!-- 自定义拦截器栈 --> 14 <interceptor-stack name="myDefault"> 15 <interceptor-ref name="myTime"></interceptor-ref> 16 <interceptor-ref name="defaultStacks"></interceptor-ref> 17 </interceptor-stack> 18 19 </interceptors> 20 21 <action name="login" class="com.Elastic.StrutsDemo3.ivy.action.UserAction" method="login"> 22 <result name="success" type="redirectAction">index</result> 23 <!-- 引用拦截器 --> 24 <interceptor-ref name="myTime"></interceptor-ref> 25 <!-- 引用Struts默认的拦截器栈。如果用了自定义拦截器,一定要加载struts-default中的defaultStacks --> 26 <interceptor-ref name="defaultStacks"></interceptor-ref> 27 28 <!-- 引用拦截器栈 --> 29 <!-- <interceptor-ref name="myDefault"></interceptor-ref> --> 30 </action> 31 32 </package> 33 </struts>
自带拦截器
1.params拦截器:负责将请求参数设置为Action属性
2.servletConfig拦截器:将源于servlet API的各种对象注入到Action
3.fileUpload拦截器:对文件上传提供支持
4.exception拦截器:捕获异常,并将异常映射到自定义d错误页面
5.validation拦截器:调用验证框架进行数据验证
6.workflow拦截器:调用Action类的validate(),执行数据验证
自定义拦截器:
void init():初始化拦截器所需资源
void destroy():释放在init()中分配的资源
String intercept(ActionInvocation actionInvocation) throws Exception:
1.实现拦截器功能
2.利用ActionInvocation参数获取Action状态
3.返回结果码(result)字符串
继承AbstractInterceptor类
1.提供了init()和destroy()方法的空实现
2.只需要实现intercept方法即可
3.推荐使用
范例:权限验证拦截器
1 public class AuthorizationInterceptor extends AbstractInterceptor { 2 public String intercept(ActionInvocation invocation) throws Exception{ 3 //获取用户会话信息 4 Map session = invocation.getInvocationContext().getSession(); 5 User user = (User)session.get("login"); 6 if (user == null) { 7 //终止执行,返回登录页面 8 return Action.LOGIN; 9 } else { 10 //继续执行剩余的拦截器和Action 11 return invocation.invoke(); 12 } 13 } 14 }
===================================文件上传下载==========================
一、文件上传
Commons-FileUpload组件
Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目
特点:
a.使用简单:可以方便地嵌入到JSP文件中,编写少量代码即可完成文件的上传功能
b.能够全程控制上传内容
c.能够对上传文件的大小、类型进行控制
环境要求:commons-fileupload-xxx.jar commons-io-xxx.jar(在 struts2 的jar包中查找)
范例:
1 public class UploadAction extends ActionSupport { 2 private File upload; 3 private String uploadContentType; 4 private String uploadFileName; 5 private String savePath; 6 //…省略set和get方法 7 public String execute() throws Exception { 8 FileInputStream fis=new FileInputStream(getUpload()); 9 FileOutputStream fos=new FileOutputStream(getSavePath()+"\”+this.getUploadFileName()); 10 } 11 }
1 <s:form action="upload.action" enctype="multipart/form-data" method="post"> 2 <s:file name="upload" label="选择文件"/> 3 </s:form> 4 5 <action name="upload" class="com.xuetang9.demo.action.UploadAction"> 6 <!--通过param参数设置保存目录的路径--> 7 <param name="savePath">/upload</param> 8 <result name="success">/upload_success.jsp</result> 9 </action>
多文件上传
【name属性相同】
将三个属性的类型修改成数组类型
//获取提交的多个文件
private File[] upload;
//封装上传文件的类型
private String[] uploadContentType;
//封装上传文件名称
private String[] uploadFileName;
二、文件下载
stream结果类型
1.将文件数据(通过InputStream获取)直接写入响应流
2.相关参数的配置
名称 作用
contentType 设置发送到浏览器的MIME类型
contentLength 设置文件的大小
contentDisposition 设置响应的HTTP头信息中的Content-Disposition参数的值(一方面表示文件的处理方式,另一方面指定下载文件的显示文件名称)
inputName 指定Action中提供的inputStream类型的属性名称
bufferSize 设置读取和下载文件时的缓冲区大小
contentType:指定文件下载的类型
文件类型 类型设置
Word application/msword
Execl application/vnd.ms-excel
PPT application/vnd.ms-powerpoint
图片 image/gif , image/bmp,image/jpeg
文本文件 text/plain
html网页 text/html
可执行文件 application/octet-stream
范例:
1 public class FileDownAction extends ActionSupport { 2 //读取下载文件的目录 3 private String inputPath; 4 //下载文件的文件名 5 private String fileName; 6 //下载文件的类型 7 private String conetntType; 8 //创建InputStream输入流 9 public InputStream getInputStream() throws FileNotFoundException{ 10 String path=ServletActionContext.getServletContext().getRealPath(inputPath); 11 return new BufferedInputStream(new FileInputStream(path+"\"+fileName)); 12 } 13 }
1 <action name="download" class="com.xuetang9.demo.action.FileDownAction"> 2 <param name="inputPath">/upload</param> 3 4 <!-- 指定类型为stream --> 5 <result name="success" type="stream"> 6 7 <!-- 通用设置 --> 8 <param name="contentType">application/octet-stream</param> 9 <param name="inputName">inputStream</param> 10 <param name="contentDisposition"> 11 <!-- 12 attachement表示以附件形式下载 13 filename表示下载时显示的文件名称 14 --> 15 attachment;filename="${fileName}" 16 </param> 17 <param name="bufferSize">4096</param> 18 </result> 19 </action>
只有首页用,清除session内容
范例:
1.实体类及其配置文件
a.User类
1 package com.Elastic.StrutsDemo3.ivy.entity; 2 3 import java.io.Serializable; 4 public class User implements Serializable{ 5 private String userName; 6 private String passWord; 7 8 public String getUserName() { 9 return userName; 10 } 11 public void setUserName(String userName) { 12 this.userName = userName; 13 } 14 public String getPassWord() { 15 return passWord; 16 } 17 public void setPassWord(String passWord) { 18 this.passWord = passWord; 19 } 20 }
b.User.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <hibernate-mapping> 5 <class name="com.Elastic.StrutsDemo3.ivy.entity.User" table="user"> 6 <id name="userName" type="java.lang.String"> 7 <column name="userName"></column> 8 <generator class="assigned"></generator> 9 </id> 10 <property name="passWord" type="java.lang.String"> 11 <column name="passWord"></column> 12 </property> 13 </class> 14 </hibernate-mapping>
2.action包
a.UserAction类
1 package com.Elastic.StrutsDemo3.ivy.action; 2 3 import com.Elastic.StrutsDemo3.ivy.entity.User; 4 import com.opensymphony.xwork2.ActionContext; 5 import com.opensymphony.xwork2.ActionSupport; 6 public class UserAction extends ActionSupport{ 7 private User user; 8 9 public User getUser() { 10 return user; 11 } 12 13 public void setUser(User user) { 14 this.user = user; 15 } 16 17 public String login(){ 18 System.out.println("执行登录功能!"); 19 if ("admin".equals(user.getUserName().trim()) && "123456".equals(user.getPassWord().trim())) { 20 ActionContext.getContext().getSession().put("loginUser", "admin"); 21 return SUCCESS; 22 } 23 return LOGIN; 24 } 25 }
b.IndexAction类
1 package com.Elastic.StrutsDemo3.ivy.action; 2 3 import com.opensymphony.xwork2.ActionContext; 4 import com.opensymphony.xwork2.ActionSupport; 5 public class IndexAction extends ActionSupport{ 6 private String data; 7 8 public String getData() { 9 return data; 10 } 11 12 public void setData(String data) { 13 this.data = data; 14 } 15 16 public String index(){ 17 System.out.println("查询数据"); 18 data = "从数据库中得到了数据"; 19 ActionContext.getContext().getSession().put("data", data); 20 return SUCCESS; 21 } 22 }
c.上传文件 -- FileAction类
1 package com.Elastic.StrutsDemo3.ivy.action; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.UnsupportedEncodingException; 10 11 import org.apache.struts2.ServletActionContext; 12 13 import com.opensymphony.xwork2.ActionSupport; 14 public class FileAction extends ActionSupport{ 15 //文件夹的名称与表单name属性值一致 16 private File head; 17 //文件类型(后缀固定写法) 18 private String headContentType; 19 //文件名称(后缀固定写法) 20 private String headFileName; 21 22 public File getHead() { 23 return head; 24 } 25 26 public void setHead(File head) { 27 this.head = head; 28 } 29 30 public String getHeadContentType() { 31 return headContentType; 32 } 33 34 public void setHeadContentType(String headContentType) { 35 this.headContentType = headContentType; 36 } 37 38 public String getHeadFileName() { 39 return headFileName; 40 } 41 42 public void setHeadFileName(String headFileName) { 43 this.headFileName = headFileName; 44 } 45 46 /** 47 * 文件上传 48 * @return 49 * @throws IOException 50 */ 51 public String fileUpload() throws IOException { 52 //1.读成二进制文件 53 FileInputStream fis = new FileInputStream(head); 54 //虚拟路径--项目下 55 String path = "/head/" + headFileName; 56 //绝对路径 -- 物理路径 57 String realPath = ServletActionContext.getServletContext().getRealPath(path); 58 //获取文件的总大小 59 int length = fis.available(); 60 //读成二进制文件 61 byte[] buffers = new byte[length]; 62 fis.read(buffers); 63 64 //2.输出文件 65 FileOutputStream fos = new FileOutputStream(realPath); 66 fos.write(buffers); 67 fis.close(); 68 fos.close(); 69 return SUCCESS; 70 } 71 }
c2.下载文件 -- FileAction类
1 package com.Elastic.StrutsDemo3.ivy.action; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.UnsupportedEncodingException; 10 11 import org.apache.struts2.ServletActionContext; 12 13 import com.opensymphony.xwork2.ActionSupport; 14 public class FileAction extends ActionSupport { 15 // 文件夹的名称与表单name属性值一致 16 private File head; 17 // 文件类型(后缀固定写法) 18 private String headContentType; 19 // 文件名称(后缀固定写法) 20 private String headFileName; 21 22 private String savePath; 23 24 public String getSavePath() { 25 return savePath; 26 } 27 28 public void setSavePath(String savePath) { 29 this.savePath = savePath; 30 } 31 32 public File getHead() { 33 return head; 34 } 35 36 public void setHead(File head) { 37 this.head = head; 38 } 39 40 public String getHeadContentType() { 41 return headContentType; 42 } 43 44 public void setHeadContentType(String headContentType) { 45 this.headContentType = headContentType; 46 } 47 48 public String getHeadFileName() { 49 return headFileName; 50 } 51 52 public void setHeadFileName(String headFileName) { 53 this.headFileName = headFileName; 54 } 55 56 /** 57 * 文件上传 58 * 59 * @return 60 * @throws IOException 61 */ 62 public String fileUpload() throws IOException { 63 // 1.读成二进制文件 64 FileInputStream fis = new FileInputStream(head); 65 // 虚拟路径--项目下 66 String path = savePath + "/" + headFileName; 67 // 绝对路径 -- 物理路径 68 String realPath = ServletActionContext.getServletContext().getRealPath(path); 69 // 获取文件的总大小 70 int length = fis.available(); 71 // 读成二进制文件 72 byte[] buffers = new byte[length]; 73 fis.read(buffers); 74 75 // 2.输出文件 76 FileOutputStream fos = new FileOutputStream(realPath); 77 fos.write(buffers); 78 fis.close(); 79 fos.close(); 80 return SUCCESS; 81 82 } 83 84 private String fileName; 85 86 public String getFileName() { 87 return fileName; 88 } 89 90 public void setFileName(String fileName) { 91 this.fileName = fileName; 92 } 93 94 private InputStream inputStream; 95 96 public void setInputStream(InputStream inputStream) { 97 this.inputStream = inputStream; 98 } 99 100 public InputStream getInputStream() throws FileNotFoundException { 101 102 try { 103 fileName = new String(fileName.getBytes("iso-8859-1"), "utf-8"); 104 String path = "/head/" + fileName; 105 String realPath = ServletActionContext.getServletContext().getRealPath(path); 106 inputStream = new FileInputStream(realPath); 107 } catch (Exception e) { 108 e.printStackTrace(); 109 } 110 return inputStream; 111 } 112 }
3.interceptor包
a.MyTimeInterceptor类
1 package com.Elastic.StrutsDemo3.ivy.interceptor; 2 3 import com.opensymphony.xwork2.ActionInvocation; 4 import com.opensymphony.xwork2.interceptor.AbstractInterceptor; 5 public class MyTimeInterceptor extends AbstractInterceptor { 6 7 /* (non-Javadoc) 8 * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) 9 */ 10 @Override 11 public String intercept(ActionInvocation actionInvocation) throws Exception { 12 System.out.println("执行Action之前"); 13 String result = actionInvocation.invoke(); 14 System.out.println("执行Action之后"); 15 return result; 16 } 17 }
b.AuthorizationInterceptor类
1 package com.Elastic.StrutsDemo3.ivy.interceptor; 2 3 import com.opensymphony.xwork2.Action; 4 import com.opensymphony.xwork2.ActionContext; 5 import com.opensymphony.xwork2.ActionInvocation; 6 import com.opensymphony.xwork2.interceptor.AbstractInterceptor; 7 public class AuthorizationInterceptor extends AbstractInterceptor{ 8 9 /* (non-Javadoc) 10 * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) 11 */ 12 @Override 13 public String intercept(ActionInvocation actionInvocation) throws Exception { 14 System.out.println("登录验证之前"); 15 // 执行Action之前判断用户是否登录 16 boolean isLogined = ActionContext.getContext().getSession().containsKey("loginUser"); 17 if (!isLogined) { 18 return Action.LOGIN; 19 } 20 String result = actionInvocation.invoke(); 21 System.out.println("登录验证之后"); 22 return result; 23 } 24 }
4.jsp
a.index.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 设置浏览器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 设置支持移动设备 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>首页</title> 15 <!-- 引用bootstrap样式 --> 16 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 17 </head> 18 <body> 19 20 <div class="container"> 21 ${data } 22 </div> 23 24 <!-- 引用外部JS文件 --> 25 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 26 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 27 28 </body> 29 </html>
b.login.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 6 <%@ taglib uri="/struts-tags" prefix="s"%> 7 <!DOCTYPE html> 8 <html language="zh-CN"> 9 <head> 10 <meta charset="utf-8"> 11 <!-- 设置浏览器渲染的引擎 --> 12 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 13 <!-- 设置支持移动设备 --> 14 <meta name="viewport" content="width=device-width, initial-scale=1"> 15 <title>网页标题</title> 16 <!-- 引用bootstrap样式 --> 17 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 18 </head> 19 <body> 20 <s:debug></s:debug> 21 <div class="container-fluid"> 22 <div class="panel panel-default center-block" style=" 500px;"> 23 <div class="panel-heading">登录</div> 24 <div class="panel-body"> 25 <form action="user/login" method="post" class="form-horizontal"> 26 <div class="form-group"> 27 <label class="col-md-3 control-label" for="userName">用户名:</label> 28 <div class="col-md-6"> 29 <input class="form-control" id="userName" name="user.userName" 30 type="text" autocomplete="off" /> 31 </div> 32 <div class="col-md-3"> 33 ${fieldErrors.userName[0] } 34 </div> 35 </div> 36 <div class="form-group"> 37 <label class="col-md-3 control-label" for="passWord">密码:</label> 38 <div class="col-md-6"> 39 <input class="form-control" id="passWord" name="user.passWord" 40 type="password" /> 41 </div> 42 <div class="col-md-3"> 43 44 </div> 45 </div> 46 <div class="form-group"> 47 <input class="btn btn-primary btn-block" type="submit" value="登录" /> 48 </div> 49 </form> 50 </div> 51 </div> 52 </div> 53 54 <!-- 引用外部JS文件 --> 55 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 56 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 57 58 </body> 59 </html>
c.fileUpload.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 设置浏览器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 设置支持移动设备 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>网页标题</title> 15 <!-- 引用bootstrap样式 --> 16 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 17 </head> 18 <body> 19 <div class="container-fluid"> 20 <form action="upload" enctype="multipart/form-data" method="post"> 21 <input name="head" type="file" /> 22 <input type="submit" value="上传头像" /> 23 </form> 24 </div> 25 26 <!-- 引用外部JS文件 --> 27 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 28 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 29 30 </body> 31 </html>
d.downLoad.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 设置浏览器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 设置支持移动设备 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>网页标题</title> 15 <!-- 引用bootstrap样式 --> 16 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 17 </head> 18 <body> 19 <div class="container-fluid"> 20 <a href="downLoad?fileName=面试.txt">面试.txt</a> 21 </div> 22 23 <!-- 引用外部JS文件 --> 24 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 25 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 26 27 </body> 28 </html>
5.Struts配置文件
a1.拦截器 -- struts.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" > 3 <struts> 4 <package name="default" namespace="/" extends="struts-default"> 5 6 <!-- 配置拦截器 --> 7 <interceptors> 8 <!-- 定义单个拦截器 --> 9 <interceptor name="myTime" class="com.Elastic.StrutsDemo3.ivy.interceptor.MyTimeInterceptor"></interceptor> 10 <interceptor name="authorization" class="com.Elastic.StrutsDemo3.ivy.interceptor.AuthorizationInterceptor"></interceptor> 11 12 <!-- 自定义拦截器栈 --> 13 <interceptor-stack name="myDefault"> 14 <interceptor-ref name="myTime"></interceptor-ref> 15 <interceptor-ref name="defaultStack"></interceptor-ref> 16 </interceptor-stack> 17 18 <!-- 自定义拦截器栈 --> 19 <interceptor-stack name="myAuthorStack"> 20 <interceptor-ref name="myTime"></interceptor-ref> 21 <interceptor-ref name="authorization"></interceptor-ref> 22 <interceptor-ref name="defaultStack"></interceptor-ref> 23 </interceptor-stack> 24 </interceptors> 25 26 <!-- 全局的result --> 27 <global-results> 28 <result name="login" type="redirect">/login.jsp</result> 29 </global-results> 30 31 <action name="login" class="com.Elastic.StrutsDemo3.ivy.action.UserAction" method="login"> 32 <result name="success" type="redirectAction">index</result> 33 <!-- 方法1 --> 34 <!-- 引用拦截器 --> 35 <!-- <interceptor-ref name="myTime"></interceptor-ref> --> 36 <!-- 引用Struts默认的拦截器栈 --> 37 <!-- <interceptor-ref name="defaultStack"></interceptor-ref> --> 38 39 <!-- 方法2 --> 40 <interceptor-ref name="myDefault"></interceptor-ref> 41 </action> 42 43 <action name="index" class="com.Elastic.StrutsDemo3.ivy.action.IndexAction" method="index"> 44 <result name="success" type="redirect">/index.jsp</result> 45 <!-- 拦截器配置有顺序 --> 46 <!-- 方法1 --> 47 <interceptor-ref name="authorization"></interceptor-ref> 48 <interceptor-ref name="myTime"></interceptor-ref> 49 <!-- 引用Struts默认的拦截器栈 --> 50 <interceptor-ref name="defaultStack"></interceptor-ref> 51 52 <!-- 方法2 --> 53 <!-- <interceptor-ref name="myAuthorStack"></interceptor-ref> --> 54 </action> 55 </package> 56 </struts>
a2.上传文件 -- struts.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" > 3 <struts> 4 <package name="default" namespace="/" extends="struts-default"> 5 6 <!-- 配置拦截器 --> 7 <interceptors> 8 <!-- 定义单个拦截器 --> 9 <interceptor name="myTime" class="com.Elastic.StrutsDemo3.ivy.interceptor.MyTimeInterceptor"></interceptor> 10 <interceptor name="authorization" class="com.Elastic.StrutsDemo3.ivy.interceptor.AuthorizationInterceptor"></interceptor> 11 12 <!-- 自定义拦截器栈 --> 13 <interceptor-stack name="myDefault"> 14 <interceptor-ref name="myTime"></interceptor-ref> 15 <interceptor-ref name="defaultStack"></interceptor-ref> 16 </interceptor-stack> 17 18 <!-- 自定义拦截器栈 --> 19 <interceptor-stack name="myAuthorStack"> 20 <interceptor-ref name="myTime"></interceptor-ref> 21 <interceptor-ref name="authorization"></interceptor-ref> 22 <interceptor-ref name="defaultStack"></interceptor-ref> 23 </interceptor-stack> 24 25 </interceptors> 26 27 <!-- 全局的result --> 28 <global-results> 29 <result name="login" type="redirect">/login.jsp</result> 30 </global-results> 31 32 <action name="login" class="com.Elastic.StrutsDemo3.ivy.action.UserAction" method="login"> 33 <result name="success" type="redirectAction">index</result> 34 <interceptor-ref name="myDefault"></interceptor-ref> 35 </action> 36 37 <action name="index" class="com.Elastic.StrutsDemo3.ivy.action.IndexAction" method="index"> 38 <result name="success" type="redirect">/index.jsp</result> 39 <interceptor-ref name="myAuthorStack"></interceptor-ref> 40 </action> 41 42 <action name="upload" class="com.Elastic.StrutsDemo3.ivy.action.FileAction" method="fileUpload"> 43 <result name="success" type="redirect">/index.jsp</result> 44 </action> 45 46 </package> 47 </struts>
a3.下载文件 -- struts.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" > 3 <struts> 4 <package name="default" namespace="/" extends="struts-default"> 5 6 <!-- 配置拦截器 --> 7 <interceptors> 8 <!-- 定义单个拦截器 --> 9 <interceptor name="myTime" class="com.Elastic.StrutsDemo3.ivy.interceptor.MyTimeInterceptor"></interceptor> 10 <interceptor name="authorization" class="com.Elastic.StrutsDemo3.ivy.interceptor.AuthorizationInterceptor"></interceptor> 11 12 <!-- 自定义拦截器栈 --> 13 <interceptor-stack name="myDefault"> 14 <interceptor-ref name="myTime"></interceptor-ref> 15 <interceptor-ref name="defaultStack"></interceptor-ref> 16 </interceptor-stack> 17 18 <!-- 自定义拦截器栈 --> 19 <interceptor-stack name="myAuthorStack"> 20 <interceptor-ref name="myTime"></interceptor-ref> 21 <interceptor-ref name="authorization"></interceptor-ref> 22 <interceptor-ref name="defaultStack"></interceptor-ref> 23 </interceptor-stack> 24 25 </interceptors> 26 27 <!-- 全局的result --> 28 <global-results> 29 <result name="login" type="redirect">/login.jsp</result> 30 </global-results> 31 32 <action name="login" class="com.Elastic.StrutsDemo3.ivy.action.UserAction" method="login"> 33 <result name="success" type="redirectAction">index</result> 34 <interceptor-ref name="myDefault"></interceptor-ref> 35 36 </action> 37 38 <action name="index" class="com.Elastic.StrutsDemo3.ivy.action.IndexAction" method="index"> 39 <result name="success" type="redirect">/index.jsp</result> 40 <interceptor-ref name="myAuthorStack"></interceptor-ref> 41 </action> 42 43 <action name="upload" class="com.Elastic.StrutsDemo3.ivy.action.FileAction" method="fileUpload"> 44 <param name="savePath">/head</param> 45 <result name="success" type="redirect">/index.jsp</result> 46 </action> 47 48 <action name="downLoad" class="com.Elastic.StrutsDemo3.ivy.action.FileAction"> 49 <result type="stream"> 50 <param name="contentType">application/octet-stream</param> 51 <param name="inputName">inputStream</param>s 52 <param name="contentDisposition"> 53 attachment;fileName=${fileName} 54 </param> 55 </result> 56 </action> 57 58 </package> 59 </struts>