Struts2-----文件上传与拦截器原理

文件上传

三种上传方案:

1、上传到tomcat服务器

2、上传到指定文件目录,添加服务器与真实目录的映射关系,从而解耦上传文件与tomcat的关系

3、在数据库表中建立二进制字段,将图片存储到数据库

(前面两种是常用方法,第三种不常用  我这里要讲的是第二种)

web层代码:

    private File file;
    private String fileContentType;
    private String fileFileName;
    //变量名与jsp页面input的名字保持一致
/** * 直接上传图片 * @return */ public String upload() { try { String targetDir ="D:/上课内容/img";//实际存储的位置 String serverPath="/upload";//存储在数据库中的地址 FileUtils.copyFile(file, new File(targetDir+"/"+fileFileName)); //数据库存放的是网络请求地址 而不是本地存放地址 clz.setPic(serverPath+"/"+fileFileName); this.clzDao.edit(clz); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "toList"; } /** * 跳转文件上传页面 * @return */ public String preUpload() { Clazz c = this.clzDao.list(clz, null).get(0); request.setAttribute("clz", c); return "toUpload"; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileContentType() { return fileContentType; } public void setFileContentType(String fileContentType) { this.fileContentType = fileContentType; } public String getFileFileName() { return fileFileName; } public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName; }

 

jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="${pageContext.request.contextPath }/sy/clz_upload.action " method="post" enctype="multipart/form-data">
        编号:<input type="hidden" name="cid" value="${clz.cid }"> <br>
        班级名:<input type="hidden" name="cname" value="${clz.cname }"> <br>
        教员:<input type="hidden" name="cteacher" value="${clz.cteacher }"> <br>
        <input type="file" name="file">
        <input type="submit">
    </form>

</body>
</html>

 

struts-sy.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <package name="sy" extends="base" namespace="/sy">
        <action name="/demo_*" class="com.psy.web.HelloAction" method="{1}">
            <result name="rs">/rs.jsp</result>
        </action>
        
        <action name="/clz_*" class="com.psy.crud.web.ClazzAction" method="{1}">
            <result name="list">/clzList.jsp</result>
            <result name="preSave">/clzEdit.jsp</result>
            <result name="toList" type="redirectAction">/clz_list</result> 
            <result name="toUpload">/upload.jsp</result>
            
        </action>
        
    </package>
</struts>

 

 

          拦截器

一、Struts2拦截器原理:

Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。

比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源;否则,系统直接转入登陆页面。对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用。因为大部分Action里的权限检查代码都大同小异,故将这些权限检查的逻辑放在拦截器中进行将会更加优雅。

二、Struts2拦截器的实现:

实现拦截器有两种方法

一种是 implements Interceptor
第二种是 extends AbstractInterceptor

 

public class OneInterceptor implements Interceptor{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void init() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("========OneInterceptor========1");
        String invoke = arg0.invoke();
        System.out.println("========OneInterceptor========2");
        return invoke;
    }

}

所有拦截器都使用接口Interceptor ,Action去实现这个接口;

Init()方法:在服务器起动的时候加载一次,并且只加载一次;

Destroy()方法:当拦截器销毁时执行的方法;

Interceptor()方法:其中里边有一个参数invocation;

 

posted on 2019-07-12 18:54  Renduo  阅读(264)  评论(0编辑  收藏  举报