项目整体目录结构
1、搭建Struts2框架
(1)导入Struts2相关jar包
(2)配置web.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 8 <filter> 9 <filter-name>struts2</filter-name> 10 <filter-class> 11 org.apache.struts2.dispatcher.FilterDispatcher 12 </filter-class> 13 </filter> 14 15 <filter-mapping> 16 <filter-name>struts2</filter-name> 17 <url-pattern>/*</url-pattern> 18 </filter-mapping> 19 <welcome-file-list> 20 <welcome-file>index.jsp</welcome-file> 21 </welcome-file-list> 22 </web-app>
(3)配置struts.xml文件
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 8 <constant name="struts.custom.i18n.resources" value="message" /> 9 10 <constant name="struts.i18n.encoding" value="gbk"></constant> 11 12 <!-- 上传过程中临时文件存放目录 --> 13 <constant name="struts.multipart.saveDir" value="c:\"></constant> 14 15 <package name="struts2" extends="struts-default"> 16 17 <action name="upload" 18 class="com.broadengate.struts.UploadAction"> 19 <result name="success">/uploadResult.jsp</result> 20 <result name="input">/index.jsp</result> 21 <!-- 定义文件上传拦截器 --> 22 <interceptor-ref name="fileUpload"> 23 <!-- 设置文件上传大小 --> 24 <param name="maximumSize">409600</param> 25 <!-- 设置文件上传类型 26 <param name="allowedTypes"> 27 application/vnd.ms-powerpoint 28 </param> 29 --> 30 </interceptor-ref> 31 <!-- 自定义了拦截器后必手动定义默认的拦截器,否则默认的拦截器不会被执行 --> 32 <interceptor-ref name="defaultStack"></interceptor-ref> 33 </action> 34 35 </package> 36 37 </struts>
2、index.jsp上传功能页面代码
要注意第6行,引入了struts2的tags的uri,否则tomcat不认识<s:...>标签
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 <%@ taglib prefix="s" uri="/struts-tags"%> 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'index.jsp' starting page</title> 13 <meta http-equiv="pragma" content="no-cache"> 14 <meta http-equiv="cache-control" content="no-cache"> 15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 17 <meta http-equiv="description" content="This is my page"> 18 <!-- 19 <link rel="stylesheet" type="text/css" href="styles.css"> 20 --> 21 </head> 22 23 <body> 24 25 <s:form action="upload" theme="simple" enctype="multipart/form-data"> 26 <table align="center" width="50%" border="1"> 27 <tr> 28 <td>username</td> 29 <td><s:textfield name="username"></s:textfield></td> 30 </tr> 31 <tr> 32 <td>password</td> 33 <td><s:password name="password"></s:password></td> 34 </tr> 35 <tr> 36 <td>file</td> 37 <td id="more"> 38 <s:file name="file"></s:file> 39 <input type="button" value="Add More.." οnclick="addMore()"> 40 </td> 41 </tr> 42 <tr> 43 <td><s:submit value=" submit "></s:submit></td> 44 <td><s:reset value=" reset "></s:reset></td> 45 </tr> 46 </table> 47 </s:form> 48 </body> 49 <script type="text/javascript"> 50 function addMore() 51 { 52 var td = document.getElementById("more"); 53 54 var br = document.createElement("br"); 55 var input = document.createElement("input"); 56 var button = document.createElement("input"); 57 58 input.type = "file"; 59 input.name = "file"; 60 61 button.type = "button"; 62 button.value = "Remove"; 63 64 button.onclick = function() 65 { 66 td.removeChild(br); 67 td.removeChild(input); 68 td.removeChild(button); 69 } 70 td.appendChild(br); 71 td.appendChild(input); 72 td.appendChild(button); 73 } 74 </script> 75 </html>
3、UploadAction.java,在struts.xml中配置的用于响应index.jsp页面中form的action属性的对应类
1 package com.broadengate.struts; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.util.ArrayList; 9 import java.util.List; 10 11 import org.apache.struts2.ServletActionContext; 12 13 import com.opensymphony.xwork2.ActionSupport; 14 15 public class UploadAction extends ActionSupport { 16 private String username; 17 18 private String password; 19 20 private List<File> file; 21 22 private List<String> fileFileName; 23 24 private List<String> fileContentType; 25 26 private List<String> dataUrl; 27 28 29 @Override 30 public String execute() throws Exception { 31 dataUrl = new ArrayList<String>(); 32 // �ļ����·�� 33 String imgpath = "upload/"; 34 for (int i = 0; i < file.size(); ++i) { 35 InputStream is = new FileInputStream(file.get(i)); 36 37 String path = ServletActionContext.getServletContext().getRealPath("/"); 38 System.out.println(path); 39 // String root = "D:\\"; 40 41 dataUrl.add(imgpath+this.getFileFileName().get(i)); 42 File destFile = new File(path+imgpath, this.getFileFileName().get(i)); 43 44 OutputStream os = new FileOutputStream(destFile); 45 46 byte[] buffer = new byte[400]; 47 48 int length = 0; 49 50 while ((length = is.read(buffer)) > 0) { 51 os.write(buffer, 0, length); 52 } 53 54 is.close(); 55 56 os.close(); 57 } 58 return SUCCESS; 59 } 60 61 62 63 64 public String getUsername() { 65 return username; 66 } 67 68 public void setUsername(String username) { 69 this.username = username; 70 } 71 72 public String getPassword() { 73 return password; 74 } 75 76 public List<String> getDataUrl() { 77 return dataUrl; 78 } 79 80 81 82 83 public void setDataUrl(List<String> dataUrl) { 84 this.dataUrl = dataUrl; 85 } 86 87 88 89 90 public void setPassword(String password) { 91 this.password = password; 92 } 93 94 public List<File> getFile() { 95 return file; 96 } 97 98 public void setFile(List<File> file) { 99 this.file = file; 100 } 101 102 public List<String> getFileFileName() { 103 return fileFileName; 104 } 105 106 public void setFileFileName(List<String> fileFileName) { 107 this.fileFileName = fileFileName; 108 } 109 110 public List<String> getFileContentType() { 111 return fileContentType; 112 } 113 114 public void setFileContentType(List<String> fileContentType) { 115 this.fileContentType = fileContentType; 116 } 117 }
4、显示上传结果页面uploadResult.jsp
1 <%@ page language="java" contentType="text/html; charset=GB18030" 2 pageEncoding="GB18030"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 <%@ taglib prefix="s" uri="/struts-tags" %> 8 9 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 10 <html> 11 <head> 12 <base href="<%=basePath%>"> 13 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 14 <title>Insert title here</title> 15 </head> 16 <body> 17 <%=basePath %> 18 username: <s:property value="username"/><br> 19 20 password: <s:property value="password"/><br> 21 22 file: <s:property value="fileFileName"/> 23 24 25 <s:iterator id="imgUrl" value="dataUrl"> 26 <br /><img src="${imgUrl}"/> 27 </s:iterator> 28 </body> 29 </html>
5、我的Tomcat安装在D盘,要在“D:\Tomcat6.0\webapps\MyUpload”文件夹下新建一个upload文件夹,否则运行会报错,提示找不到路径,这个功能也可以在代码中添加。下边是运行效果:
(1)上传页面
(2)结果显示
ps:第一行的路径是写程序时做测试用的,没有实际意义。