<action name="register" class="com.test.action.RegisterAction" method="test">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>
<!-- 增加攔截器或用棧也行 -->
<interceptor-ref name="auth"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
文件上傳和下載:
頁面: enctype默認是字符串提交
<form action="result.jsp" method="post" enctype="multipart/form-data">
Information: <input type="text" name="info"><br>
File: <input type="file" name="file"><br>
<input type="submit" name="submit" value=" submit ">
</form>
result.jsp:
<body>
<%
InputStream is = request.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String buffer = null;
while((buffer = br.readLine()) != null)
{
out.print(buffer + "<br>");
}
%>
</body>
文件上傳會遇到攔截器:一種是不用struts的包.註釋web.xml
<!--
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
</web-app>
URL解碼:
public class DecoderTest
{
public static void main(String[] args)throws Exception
{
String str = "C%3A%5CDocuments+and+Settings%5Czhanglong%5C%D7%C0%C3%E6%5CNOTICE.txt";
String result = URLDecoder.decode(str,"gbk");
System.out.println(result);
}
}
Struts文件上傳(apche 方式)
加入包:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
頁面:
<form action="/struts2/UploadServlet" method="post" enctype="multipart/form-data">
username: <input type="text" name="username"><br>
password: <input type="password" name="password"><br>
file1: <input type="file" name="file1"><br>
file2: <input type="file" name="file2"><br>
<input type="submit" value="submit">
</form>
建立servelet
package com.test.servlet;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet
{
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//創建工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
String path = request.getRealPath("/upload");
//設置臨時存儲目錄
factory.setRepository(new File(path));
//設置超出大小,小於超出大小就放到內存,否則建立臨時文件存放
factory.setSizeThreshold(1024 * 1024);//1M
//處理上傳
ServletFileUpload upload = new ServletFileUpload(factory);
try
{
//接受傳送信息
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list)
{
//判斷是否是文件類型
if (item.isFormField())
{
String name = item.getFieldName();
String value = item.getString("gbk");
System.out.println(name);
request.setAttribute(name, value);
}
else//文件類型的操作
{
String name = item.getFieldName();
//File表單的路徑
String value = item.getName();
int start = value.lastIndexOf("//");
String fileName = value.substring(start + 1);
//處理名稱
request.setAttribute(name, fileName);
//處理流
item.write(new File(path,fileName));
// OutputStream os = new FileOutputStream(new File(path,
// fileName));
//
// InputStream is = item.getInputStream();
//
// byte[] buffer = new byte[400];
//
// int length = 0;
//
// while ((length = is.read(buffer)) > 0)
// {
// os.write(buffer, 0, length);
// }
//
// os.close();
//
// is.close();
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
request.getRequestDispatcher("upload/result2.jsp").forward(request,
response);
}
}
接收流:
<body>
<form action="/struts2/UploadServlet" method="post" enctype="multipart/form-data">
username: <input type="text" name="username"><br>
password: <input type="password" name="password"><br>
file1: <input type="file" name="file1"><br>
file2: <input type="file" name="file2"><br>
<input type="submit" value="submit">
</form>
Struts文件上傳(struts2 方式)
提交頁面:
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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=GB18030">
<title>Insert title here</title>
<script type="text/javascript">
function addMore()
{
var td = document.getElementById("more");
var br = document.createElement("br");
var input = document.createElement("input");
var button = document.createElement("input");
input.type = "file";
input.name = "file";
button.type = "button";
button.value = "Remove";
button.onclick = function()
{
td.removeChild(br);
td.removeChild(input);
td.removeChild(button);
}
td.appendChild(br);
td.appendChild(input);
td.appendChild(button);
}
</script>
</head>
<body>
<table align="center" width="50%">
<tr>
<td>
<s:fielderror cssStyle="color:red" />
</td>
</tr>
</table>
<s:form action="upload" theme="simple" enctype="multipart/form-data">
<table align="center" width="50%" border="1">
<tr>
<td>
username
</td>
<td>
<s:textfield name="username"></s:textfield>
</td>
</tr>
<tr>
<td>
password
</td>
<td>
<s:password name="password"></s:password>
</td>
</tr>
<tr>
<td>
file
</td>
<!—多文件文件name要是一樣的-->
<td id="more">
<s:file name="file"></s:file><input type="button" value="Add More.." onclick="addMore()">
</td>
</tr>
<tr>
<td>
<s:submit value=" submit "></s:submit>
</td>
<td>
<s:reset value=" reset "></s:reset>
</td>
</tr>
</table>
</s:form>
</body>
</html>
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!—全局屬性的設置都在struts核心包裏的default.properties;結果類型和攔截器都在struts-default.xml中 -->
<!-- 國際化資源文件 -->
<constant name="struts.custom.i18n.resources" value="message"></constant>
<!-- 解決亂碼問題 -->
<constant name="struts.i18n.encoding" value="gbk"></constant>
<!-- 設置臨時目錄 -->
<constant name="struts.multipart.saveDir" value="c:/"></constant>
<package name="struts2" extends="struts-default">
<global-results>
<result name="login" type="redirect">/login2.jsp</result>
</global-results>
<action name="upload" class="com.test.action.UploadAction">
<result name="success">/uploadResult.jsp</result>
<result name="input">/upload.jsp</result>
<!-- 應用內置攔截器,攔截非法文件,最大大小,和文件類型 -->
<interceptor-ref name="fileUpload">
<param name="maximumSize">409600</param>
<param name="allowedTypes">application/vnd.ms-powerpoint</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
上傳AcTION
package com.test.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport
{
private String username;
private String password;
//要是單文件使用private File file;也可以使用數組的形式File[] file
private List<File> file;
//name在struts2裏面的匹配格式文件名稱+FileName,類型也一樣,然後被自動注入進來
private List<String> fileFileName;
private List<String> fileContentType;
生成get和set方法
@Override
public String execute() throws Exception
{
//要是單文件使用去掉for循環
for (int i = 0; i < file.size(); ++i)
{
//要是單文件使用InputStream is = new FileInputStream(file);
InputStream is = new FileInputStream(file.get(i));
String root = ServletActionContext.getRequest().getRealPath(
"/upload");
//要是單文件使用his.getFileFileName()
File destFile = new File(root, this.getFileFileName().get(i));
OutputStream os = new FileOutputStream(destFile);
byte[] buffer = new byte[400];
int length = 0;
while ((length = is.read(buffer)) > 0)
{
os.write(buffer, 0, length);
}
is.close();
os.close();
}
return SUCCESS;
接收頁面uploadResult.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
username: <s:property value="username"/><br>
password: <s:property value="password"/><br>
file: <s:property value="fileFileName"/>
</body>