一、表單元素的enctype屬性
通常情況下無須設置表單元素的enctype屬性,表單的enctype屬性指定的是表單數據的編碼方式,該屬性有如下3個值:
◆ application/x-www-form-urlencoded:這是默認的編碼方式,它只處理表單域里的value屬性值,采用這種編碼方式的表單會將表單域的值處理成URL編碼方式
◆ multipart/form-data:這種編碼方式會以二進制的方式來處理表單數據,這種編碼方式會把文件域指定文件的內容也封裝到請求參數里
◆ text/plain:這種編碼方式當表單的action屬性為mailto:URL的形式時比較方便,這種方式主要適用于直接通過表單發送郵件的方式
下面來看看enctype屬性為application/x-www-form-urlencoded和multipart/form-data時的差別
UpdateArticle
注意:application/x-www-form-urlencoded是enctype屬性的默認值
提交到的pro.jsp代碼如下:
以上代碼通過二進制流來處理HTTP請求——這是一種更底層的處理方式,當通過HttpServletRequest的getParameter方法來獲取請求參數時,實際上是Web服務器替我們處理了這種底層的二進制流,并將二進制流轉換成對應的請求參數值。
請求數據中的文字轉碼
一般情況下,程序中直接通過HttpServletRequest的getParameter方法即可獲得正確的請求參數,而那些底層的二進制流處理,以及使用URLDecoder處理請求參數,都由Web服務器來替我們完成了。
但是做文件上串操作的話,僅僅只能獲得文件選擇器中數值,而不能獲得文件的內容,為了實現文件上傳,必須設置enctype屬性值為:multipart/form-data
通常情況下無須設置表單元素的enctype屬性,表單的enctype屬性指定的是表單數據的編碼方式,該屬性有如下3個值:
◆ application/x-www-form-urlencoded:這是默認的編碼方式,它只處理表單域里的value屬性值,采用這種編碼方式的表單會將表單域的值處理成URL編碼方式
◆ multipart/form-data:這種編碼方式會以二進制的方式來處理表單數據,這種編碼方式會把文件域指定文件的內容也封裝到請求參數里
◆ text/plain:這種編碼方式當表單的action屬性為mailto:URL的形式時比較方便,這種方式主要適用于直接通過表單發送郵件的方式
下面來看看enctype屬性為application/x-www-form-urlencoded和multipart/form-data時的差別
<html> <head> <title>enctype屬性測試</title> </head> <body> <form action="pro.jsp" method="post" enctype="application/x-www-form-urlencoded"> 上傳文件: <input type="file" name="file" /><br /> 請求參數: <input type="text" name="info" /><br /> <input type="submit" value="提交" /> </form> </body> </html> |
UpdateArticle
注意:application/x-www-form-urlencoded是enctype屬性的默認值
提交到的pro.jsp代碼如下:
<%@ page contentType="text/html; charset=GBK"%> <%@ page import="java.io.*"%> <% //獲取HTTP請求的輸入流 InputStream is=request.getInputStream(); //創建緩沖讀入流 BufferedReader br=new BufferedReader(new InputStreamReader(is)); //讀取HTTP請求內容 String buffer=br.readLine(); while(buffer!=null){ out.println(buffer); buffer=br.readLine(); } %> |
以上代碼通過二進制流來處理HTTP請求——這是一種更底層的處理方式,當通過HttpServletRequest的getParameter方法來獲取請求參數時,實際上是Web服務器替我們處理了這種底層的二進制流,并將二進制流轉換成對應的請求參數值。
請求數據中的文字轉碼
public class TestURLEncoder { public static void main(String[] args)throws Exception { String encodeStr="%D0%EC%D6%DD"; System.out.println(URLDecoder.decode(encodeStr,"GBK")); String rawStr="北大青鳥"; System.out.println(URLEncoder.encode(rawStr,"GBK")); } } |
一般情況下,程序中直接通過HttpServletRequest的getParameter方法即可獲得正確的請求參數,而那些底層的二進制流處理,以及使用URLDecoder處理請求參數,都由Web服務器來替我們完成了。
但是做文件上串操作的話,僅僅只能獲得文件選擇器中數值,而不能獲得文件的內容,為了實現文件上傳,必須設置enctype屬性值為:multipart/form-data