TML:完成頁面的內(nèi)容展示
CSS:完成頁面樣式的控制,美化頁面,完成頁面的布局。
表單:用于采集用戶輸入的數(shù)據(jù)。用于和服務器進行交互。
form:用于定義表單的。可以定義一個范圍(代表用戶采集數(shù)據(jù)的范圍)
屬性:action:指定提交數(shù)據(jù)的url(指的就是把數(shù)據(jù)提交到哪里)
method:指定提交方式
分類:一共有7種,2種比較常用。
get:1.請求參數(shù)會在地址欄顯示
2.請求參數(shù)的長度是有限制的。
3.請求不安全
post:1.請求參數(shù)不會在地址欄顯示,會封裝在請求體中。
2.請求參數(shù)的長度沒有限制
3.較為安全
表單里面的數(shù)據(jù)要想被提交,必須指定它的name屬性
我們在Web表單提交,常常需要選擇提交方法,這時我們會用到GET和POST方法。但關于它們之間的區(qū)別你又知道多少。今天我們就來了解它們
兩方法其實是HTTP協(xié)議中的請求方法(關于HTTP協(xié)議可以閱讀之前我寫的《解密Web通信協(xié)議——超文本傳輸協(xié)議》)我們先通過一個例子來看看它們之間的區(qū)別。
通過下面源代碼來查看:
源代碼
效果
我們來看一下地址欄無輸入時為:
file:///E:/~/~/Demo.html
我們測試時用戶名和密碼都為123456789
當我們用GET方法提交地址欄變?yōu)椋?/p>
file:///E:/~/~/Demo.html?textfield=123456789&password=123456789&submit=提交#Url
再來看看post方法提交后為file:///E:/~/~/Demo.html#Url
我們不難看出當我們在輸入密碼時Get方法提交會把所有信息顯示到地址欄,這樣可以看出這樣提交信息不安全。
它們沒有很大區(qū)別都是TCP連接,但在HTTP規(guī)范不同和C/S限制導致它們有了區(qū)別如下:
私密性的信息請求使用post。
查詢信息和可以想要通過url分享的信息使用get。
如果有任何錯誤和紕漏,請私信我更正。
如果你有任何意見一定要私信告訴我,讓我快速成長起來喲。
import java.io.File;
import java.nio.charset.Charset;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
try {
CloseableHttpClient client = HttpClients.createDefault();
List<NameValuePair> paras = new ArrayList<NameValuePair>();
paras.add(new BasicNameValuePair("testIn1", "表單1"));
paras.add(new BasicNameValuePair("testIn2", "true"));
paras.add(new BasicNameValuePair("testIn3", "3"));
paras.add(new BasicNameValuePair("testIn4", "20210929010101"));
paras.add(new BasicNameValuePair("testIn5", "5.1"));
HttpUriRequest post = RequestBuilder.post("http://localhost:9092/test.jsp")//
.setEntity(new UrlEncodedFormEntity(paras, "GBK"))//
.build();
HttpResponse res = client.execute(post);
System.out.println(res.getEntity().getContentType().toString());
System.out.println(EntityUtils.toString(res.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
try {
CloseableHttpClient client = HttpClients.createDefault();
JSONObject json = new JSONObject();
json.put("str", "字符串");
json.put("num", 123);
json.put("bool", true);
json.put("date", Calendar.getInstance().getTime());//日期類型的一般會約定會特定格式的字符串,這里僅是示例
json.put("ja", new JSONArray());
HttpUriRequest post = RequestBuilder.post("http://localhost:8181/auri")//
.setEntity(new StringEntity(json.toString(), ContentType.APPLICATION_JSON))//json的content-type已經(jīng)包含utf-8的編碼了
.build();
System.out.println(post.toString());
HttpResponse res = client.execute(post);
System.out.println("statusLine:" + res.getStatusLine().getStatusCode());
System.out.println(res.getEntity().getContentType().toString());
System.out.println(EntityUtils.toString(res.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
try {
CloseableHttpClient client = HttpClients.createDefault();
MultipartEntityBuilder meb = MultipartEntityBuilder.create();
meb.setMode(HttpMultipartMode.RFC6532);//must
meb.addBinaryBody("file1", new File("D:/abc.jpg"));
meb.addBinaryBody("file2", new File("D:/你好.jpg"));
meb.addTextBody("testIn1", "上傳表單1", ContentType.DEFAULT_TEXT.withCharset("GBK"));//GBK or UTF-8, either is ok
meb.addTextBody("testIn2", "true");
meb.addTextBody("aid", "3");
meb.setCharset(Charset.forName("UTF-8"));//must
HttpUriRequest multiPost = RequestBuilder.post("http://localhost:9092/web/test")//
.setEntity(meb.build())//
.build();
HttpResponse res = client.execute(multiPost);
System.out.println("statusLine:" + res.getStatusLine().getStatusCode());
System.out.println(EntityUtils.toString(res.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
1.創(chuàng)建一個請求客戶端:HttpClients.createDefault(),用來實際發(fā)起調(diào)用post請求,可以類比成瀏覽器。
2.組裝表單請求數(shù)據(jù):因需要傳遞文件,所以通過MultipartEntityBuilder構造器組裝表單實體請求數(shù)據(jù)。
2.1 設置mode為HttpMultipartMode.RFC6532(必須);
2.2 設置字符集為UTF-8(必須);
2.3 通過addBinaryBody追加文件;
2.4 通過addTextBody追加文本參數(shù),若文本為中文則必須指定字符集為GBK或者UTF-8。
3.創(chuàng)建一個post請求:通過請求構造器RequestBuilder的post方法構造一個post請求,通過setEntity方法向post請求里放置請求參數(shù),通過addHeader方法向post請求里追加請求頭信息,請求頭信息比如雙方約定的token,通過build方法返回請求對象。
4.發(fā)起post請求并獲得響應:通過請求客戶端的execute方法執(zhí)行請求并獲得返回值請求響應。
5.獲取響應結果:獲取響應對象的實體HttpEntity,通過EntityUtils的toString方法將實體轉(zhuǎn)成字符串,這里一般還要指定字符集,尤其是當實體里沒有指定字符集時。
注意:MultipartEntityBuilder必須指定mode為HttpMultipartMode.RFC6532,且必須設置字符集為UTF-8,否則若傳遞的文件名包含中文,則文件名亂碼;對于普通的文本參數(shù),中文指定UTF-8或者GBK接收方均未發(fā)現(xiàn)亂碼情況;接收方需要將請求轉(zhuǎn)為MultipartHttpServetRequest方可獲取到文件,示例代碼如下:
public ModelAndView enterTest(HttpServletRequest req, HttpServletResponse res, DataObject para) throws Exception {
System.out.println(req.getContentType());
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) req;
MultipartFile mf = mr.getFile("file2");
System.out.println("getOriginalFilename:" + mf.getOriginalFilename());
System.out.println("getName:" + mf.getName());
......
}
若感覺對您有用,可以轉(zhuǎn)發(fā)并關注,您的關注是對我莫大的支持!
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。