文件上传
三种上传方案:
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;