struts2拦截器和文件上传下载

一、拦截器(Interceptor) 拦截器是动态拦截Action调用的对象,拦截器将Action共用的行为独立出来,在Action执行前后执行。这也就是我们所说的AOP,它是分散关注的编程方法,它将通用需求功能从不相关类之中分离出来;同时,能够共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。写action方法要继承Interceptor,要有三个方法
public class OneInterceptor implements Interceptor{

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Override
public void destroy() {//销毁 关闭服务器是运行
	// TODO Auto-generated method stub		
}
@Override
public void init() {//初始化 开启服务器是运行
	// TODO Auto-generated method stub
	System.out.println("OneInterceptor=======init");
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
	System.out.println("OneInterceptor=======intercept");
	return arg0.invoke();//要是上面的方法通过,则放行
}

}
在Struts.sy.xml配置时,要配置interceptor
<interceptorname="oneInter"class=“com.zking.struts.four.OneInterceptor”>
<interceptorname="twonter"class=“com.zking.struts.four.TwoInterceptor”>

过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。 拦截器(Interceptor)和过滤器(Filter)的区别FilterInterceptorFilter 接口定义在 javax.servlet 包中接口 HandlerInterceptor 定义在org.springframework.web.servlet 包中Filter 定义在 web.xml 中Struts.sy.xml配置Filter 是 Servlet 规范规定的。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。Filter 是被 Server(like Tomcat) 调用Interceptor 是被 Spring 调用拦截器(Interceptor)和过滤器(Filter)的执行顺序过滤前-拦截前-Action处理-拦截后-过滤后 ---先到web.xml中进行过滤,然后在去拦截(先Filter,后Interceptor)二、文件上传1、文件上传的三种方案①将上传的文件存到数据库(适合oa系统 activity工作流框架)②上传文件到tomcat普通的web服务器③上传文件到文件服务器中(磁盘足够大)2、真实路径和虚拟路径的概念 真实路径:能够在自己的电脑上看得到 虚拟路径:在自个电脑上看不到,在别人的电脑上看的到那么下面就真空上代码吧

strut文件上传

public class UploadAction extends BaseAction { private File file ;//指jsp的name属性,要上传的文件 xxx private String fileContentType;//文件的类型 xxxContentType private String fileFileName;//文件名 xxxFileName
private String serverDir = "/upload";//创建一个文件存放图片

public String upload() {//上传
	System.out.println(fileContentType);
	System.out.println(fileFileName);
	String realPath = getRealPath(serverDir +"/" +fileFileName);
	System.out.println(realPath);
	//参数1:本地文件    参数2:在服务器上生成的文件
	try {
		FileUtils.copyFile(file, new File(realPath));
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return SUCCESS;
}
//真实路径指Linux下的上传文件的具体所在位置
private String getRealPath(String path) {
	return application.getRealPath(path);
}
public String openAs() {//展示图片
            //这是我定死的数据
	String type="image/gif";
	String name = "2.gif";
	response.setContentType(type);//设置打开图片是什么格式的
               //响应头
	response.setHeader("Content-Disposition","filename=" + name);//文件名
	/**
	 * 将远程的图片输出到本地
	 * 数据源inputStream :远程 new File(realPath)
	 * 目的:输出到本地的jsp  response.getoutStream
	 */
	String realPath = getRealPath(serverDir +"/" +name);
	try {
		FileUtils.copyFile(new File(realPath),response.getOutputStream());
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return null;
}
public String download() {//下载
	String type="image/gif";
	String name = "2.gif";
	response.setContentType(type);//设置打开图片是什么格式的
	//响应头
	response.setHeader("Content-Disposition","attachment;filename=" + name);//文件名
	/**
	 * 将远程的图片输出到本地
	 * 数据源inputStream :远程 new File(realPath)
	 * 目的:输出到本地的jsp  response.getoutStream
	 */
	String realPath = getRealPath(serverDir +"/" +name);
	try {
		FileUtils.copyFile(new File(realPath),response.getOutputStream());
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return null;
}

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;
}

}
注意的点:1.name属姓的file要在Action找中的file一致,不然会报Struts Problem Reportjava.lang.NullPointerException: Source must not be null ----这样的错误2.enctype=“multipart/form-data” 这是在form表单里的,是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。3.attachment是附件;押扣的意思。在展示时是不用在响应头里面写的,而要在下载图片的时候加上,不然当点击下载时会指出现图片,而不会下载。4、记得要将action方法中的的三个属性写上set/get方法,不然会获取不到值。

猜你喜欢

转载自blog.csdn.net/qq_41282789/article/details/83186399