zoukankan      html  css  js  c++  java
  • java:struts框架3(自定义拦截器,token令牌,文件上传和下载(单/多))

    1.自定义拦截器:

      

      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">
    <struts>
        <package name="inteceptor" extends="struts-default">
        
            <interceptors>
                <!-- 配置自定义拦截器 -->
                <interceptor name="myInter" class="cn.zzsxt.interceptor.MyInterceptor"></interceptor>
                <interceptor name="permission" class="cn.zzsxt.interceptor.PermissionInterceptor"></interceptor>
        
                <!-- 自定义拦截器栈 -->        
                <interceptor-stack name="myStack">
                    <!-- 引入自定义拦截器 -->
                    <interceptor-ref name="myInter"></interceptor-ref>
                    <!-- 引入timer拦截器 -->
                    <interceptor-ref name="timer"></interceptor-ref>
                    <!-- 引入默认拦截器栈 -->
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            
                <!-- 自定义访问权限的拦截器栈 -->            
                <interceptor-stack name="permissionStack">
                    <interceptor-ref name="permission"></interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            
            
            <action name="timerAction" class="cn.zzsxt.action.TimerAction">
                <result name="success">/success.jsp</result>
                <interceptor-ref name="myStack"></interceptor-ref>
                <interceptor-ref name="permissionStack"></interceptor-ref>
            </action>
            <action name="userAction" class="cn.zzsxt.action.UserAction">
                <result name="success" type="redirectAction">homeAction</result>
                <result name="login">/login.jsp</result>
                <interceptor-ref name="permissionStack"></interceptor-ref>
            </action>
            <action name="homeAction" class="cn.zzsxt.action.HomeAction">
                <result name="success">/list.jsp</result>
                <result name="login" type="redirect">/login.jsp</result>
                <!-- 引入拦截器栈 -->
                <interceptor-ref name="permissionStack"></interceptor-ref>
            </action>
        </package>
    </struts>

    2.token令牌:

      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">
    <struts>
        
        <!-- 上传文件最大大小,默认为2097152字节(2M) -->
        <constant name="struts.multipart.maxSize" value="209715200"></constant>
        
        <!-- 设置编码集 request.setCharacterEncoding("UTF-8")-->
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        
        
        <package name="tokenDemo" extends="struts-default">
            <action name="user-*" class="cn.zzsxt.action.UserAction" method="{1}">
                <result name="success">/index.jsp</result>
                <!-- token验证失败后跳转的结果视图 -->
                <result name="invalid.token">/error.jsp</result>
                <!-- 引入token拦截器 -->
                <interceptor-ref name="token"></interceptor-ref>
                <!-- 引入默认拦截器栈 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
        </package>
    </struts>

      add.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <%
    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>
      </head>
      
      <body>
          <form action="user-doAdd.action" method="post">
              <!-- token令牌 -->
              <s:token></s:token>
              用户编号:<input type="text" name="user.id"><br>
              用户名称:<input type="text" name="user.userName"><br>
              密码:<input type="text" name="user.password"><br>
              <input type="submit" value="新增"/>
          </form>
      </body>
    </html>

      action:

    package cn.zzsxt.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import cn.zzsxt.entity.User;
    
    public class UserAction extends ActionSupport{
        private User user;
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
        
        public String doAdd() throws Exception {
            System.out.println("执行了用户新增,新增了:"+user);
            return this.SUCCESS;
        }
    }

      

    3.文件上传和下载(单/多):

      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">
    <struts>
        
        <!-- 上传文件最大大小,默认为2097152字节(2M) -->
        <constant name="struts.multipart.maxSize" value="209715200"></constant>
        <!-- 设置编码集 request.setCharacterEncoding("UTF-8")-->
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        
        
        <package name="upload" extends="struts-default">
            <action name="singleUpload" class="cn.zzsxt.action.SingleUploadAction">
                <!-- result中name属性缺省(默认)为success -->
                <result>/success.jsp</result>
            </action>
            <action name="mutilUpload" class="cn.zzsxt.action.MutilUploadAction">
                <!-- result中name属性缺省(默认)为success -->
                <result>/success.jsp</result>
            </action>
            
            <action name="download" class="cn.zzsxt.action.DownloadAction">
                <result type="stream">
                    <!-- inputName="输入流的名称",回掉action中getInputStream()方法获取输入流 -->
                    <param name="inputName">inputStream</param>
                    <!--contentType="文件类型" application/octet-stream代表对下载类型不限制  -->
                    <param name="contentType">application/octet-stream</param>
                    <!-- attachment:以附件方式保存 filename="保存的文件名称" ${fileName}获取action中fileName属性的值 -->
                    <param name="contentDisposition">attachment;filename=${fileName}</param>
                </result>
            </action>
        </package>
    </struts>

      SingleUploadAction:

    package cn.zzsxt.action;
    
    import java.io.File;
    
    import javax.servlet.ServletContext;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class SingleUploadAction extends ActionSupport{
        private File upload;//文件
        private String uploadFileName;//文件名称:属性名+FileName
        private String uploadContentType;//文件类型:属性名+ContentType
        
        public File getUpload() {
            return upload;
        }
    
        public void setUpload(File upload) {
            this.upload = upload;
        }
    
        public String getUploadFileName() {
            return uploadFileName;
        }
    
        public void setUploadFileName(String uploadFileName) {
            this.uploadFileName = uploadFileName;
        }
    
        public String getUploadContentType() {
            return uploadContentType;
        }
    
        public void setUploadContentType(String uploadContentType) {
            this.uploadContentType = uploadContentType;
        }
    
        /**
         * 执行文件上次
         */
        @Override
        public String execute() throws Exception {
            System.out.println("文件名称:"+uploadFileName);
            System.out.println("文件类型:"+uploadContentType);
            ServletContext servletContext = ServletActionContext.getServletContext();
            String realPath = servletContext.getRealPath("/upload");//获取文件上次的真实目录
            File uploadDir = new File(realPath);
            if(!uploadDir.exists()){
                uploadDir.mkdirs();//创建目录
            }
            //上传
            FileUtils.copyFile(upload, new File(uploadDir,uploadFileName));
            return this.SUCCESS;
        }
    }

      SingleUpload.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>单文件上传</title>
      </head>
      
      <body>
           <form action="singleUpload.action" method="post" enctype="multipart/form-data">
               文件:<input type="file" name="upload"></br>
               <input type="submit" value="上传"/>
           </form>
      </body>
    </html>

      MutilUploadAction:

    package cn.zzsxt.action;
    
    import java.io.File;
    
    import javax.servlet.ServletContext;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class MutilUploadAction extends ActionSupport{
        private File[] upload;//文件
        private String[] uploadFileName;//文件名称:属性名+FileName
        private String[] uploadContentType;//文件类型:属性名+ContentType
        public File[] getUpload() {
            return upload;
        }
        public void setUpload(File[] upload) {
            this.upload = upload;
        }
        public String[] getUploadFileName() {
            return uploadFileName;
        }
        public void setUploadFileName(String[] uploadFileName) {
            this.uploadFileName = uploadFileName;
        }
        public String[] getUploadContentType() {
            return uploadContentType;
        }
        public void setUploadContentType(String[] uploadContentType) {
            this.uploadContentType = uploadContentType;
        }
    
    
        /**
         * 执行文件上次
         */
        @Override
        public String execute() throws Exception {
            System.out.println("文件名称:"+uploadFileName);
            System.out.println("文件类型:"+uploadContentType);
            ServletContext servletContext = ServletActionContext.getServletContext();
            String realPath = servletContext.getRealPath("/upload");//获取文件上次的真实目录
            File uploadDir = new File(realPath);
            if(!uploadDir.exists()){
                uploadDir.mkdirs();//创建目录
            }
            //遍历待上传的文件
            for(int i=0;i<upload.length;i++){
                //上传
                FileUtils.copyFile(upload[i], new File(uploadDir,uploadFileName[i]));
            }
            return this.SUCCESS;
        }
    }

      MutilUpload.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>单文件上传</title>
      </head>
      
      <body>
           <form action="mutilUpload.action" method="post" enctype="multipart/form-data">
               文件1:<input type="file" name="upload"></br>
               文件2:<input type="file" name="upload"></br>
               文件3:<input type="file" name="upload"></br>
               <input type="submit" value="上传"/>
           </form>
      </body>
    </html>

      DownloadAction:

    package cn.zzsxt.action;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    import javax.servlet.ServletContext;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class DownloadAction extends ActionSupport{
        private String fileName;//接受要下载的文件名称
        private InputStream inputStream;
        
        public String getFileName() {
            return fileName;
        }
    
        public void setFileName(String fileName) {
            this.fileName = fileName;
        }
        
    
        public InputStream getInputStream() {
            return inputStream;
        }
    
        public void setInputStream(InputStream inputStream) {
            this.inputStream = inputStream;
        }
    
        /**
         * 文件下载
         */
        @Override
        public String execute() throws Exception {
            //获取服务器端保存文件的目录
            ServletContext servletContext = ServletActionContext.getServletContext();
            String realPath = servletContext.getRealPath("/upload");//获取文件上传的真实目录
            File file = new File(realPath,fileName);
            inputStream = new FileInputStream(file); //将文件转为输入流
            //解决下载时中文名称乱码问题
            String str = new String(fileName.getBytes("UTF-8"),"iso-8859-1");
            fileName = str;
            return this.SUCCESS;
        }
    }

      Download.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>文件下载</title>
      </head>
      
      <body>
          <a href="download.action?fileName=1.txt">1.txt</a><br>
          <a href="download.action?fileName=mystruts.png">mystruts.png</a><br>
          <a href="download.action?fileName=Log4J详解.docx">Log4J详解.docx</a><br>
      </body>
    </html>
  • 相关阅读:
    数据仓库
    HiveSQL 数据定义语言(DDL)
    HiveSQL 数据操控、查询语言(DML、DQL)
    【ASP.NET Core】Blazor+MiniAPI完成文件下载
    MySQL的WAL(WriteAhead Logging)机制
    MySQL系列 | 索引数据结构大全
    眼见为实,看看MySQL中的隐藏列
    mysql的默认隔离级别:可重复读(Repeatable Read)
    缓存淘汰算法LRU算法
    Android设计模式系列(12)SDK源码之生成器模式(建造者模式)
  • 原文地址:https://www.cnblogs.com/kuangzhisen/p/7354748.html
Copyright © 2011-2022 走看看