Servlet整個運(yùn)行過程圖:
servlet運(yùn)行
Web應(yīng)用的標(biāo)準(zhǔn)目錄結(jié)構(gòu):Web應(yīng)用的標(biāo)準(zhǔn)目錄結(jié)構(gòu)
(一)Request
1.Request 獲取客戶端和請求頭的常用API
示例:
package cn.itcast.android.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo01 extends HttpServlet {
/**
requset的常用API
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = request.getRequestURL().toString();
String uri = request.getRequestURI();
String Query = request.getQueryString();
//客戶機(jī)的IP地址
String remote = request.getRemoteAddr();
//Web服務(wù)器的IP地址
String local = request.getLocalAddr();
//客戶的請求方式
String method = request.getMethod();
//servlet的映射路徑
String path = request.getServletPath();
//web應(yīng)用根目錄
String contextPath = request.getContextPath();
//向?yàn)g覽器輸出,即response代表每個瀏覽器,從response對象中獲取到的輸出流自然指向每個瀏覽器
PrintWriter pw = response.getWriter();
pw.write(url + "<br/>");
pw.write(uri + "<br/>");
pw.write(Query + "<br/>");
pw.write(remote + "<br/>");
pw.write(local + "<br/>");
pw.write(method+ "<br/>");
pw.write(path + "<br/>");
pw.write(contextPath + "<br/>");
}
}
結(jié)果:
2.Request獲取請求參數(shù)
- 若以GET方式進(jìn)行請求,請求參數(shù)位于請求行中;以POST方式進(jìn)行請求,請求參數(shù)位于請求體中。如果表單中沒有寫method,則默認(rèn)GET方式。
- 對于POST請求,表單不填任何內(nèi)容信息,那么request.getParameter()返回一個" "空白字符串
- 當(dāng)請求頁面,出現(xiàn)HTTP Status 405 錯誤頁面時,表明客戶端以GET方式提交,但是服務(wù)器并沒有相應(yīng)的doGet()方式來處理,不能一 一對應(yīng),就會報錯。
- 如果doPost和doGet,他們的業(yè)務(wù)邏輯是一樣的,則他們兩者之間可以進(jìn)行互相調(diào)用。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//調(diào)用doPost方法
this.doPost(request, response);
}
3.GET和POST出現(xiàn)亂碼的原因和解決方案
-
先上一張圖,讓我們明白整個數(shù)據(jù)值他是怎樣進(jìn)行編碼傳遞的
亂碼來源.png
模擬過程 - 解決方案:
主要是服務(wù)器的解碼方式為“ISO8859-1”,造成了亂碼
1.修改服務(wù)器的解碼方式(在conf文件中的server.xml)
修改服務(wù)器的配置文件
但是添加了被框住的語句,可能會造成一些麻煩。因?yàn)橐话銇碚f,服務(wù)器和程序員的工作是有明確分工的,不建議進(jìn)行交涉,不推薦此方法。
2.將獲取到的被“ISO8859-1”解碼過后的字符串,用getBytes("ISO8859-1")進(jìn)行還原成字節(jié)數(shù)組,再次對其進(jìn)行按照“UTF-8”的形式進(jìn)行解碼,獲得想要的
缺陷:不適合多個參數(shù)
- 關(guān)于解碼問題
1.對于提交方式為POST的:
request.setCharacterEncoding("UTF-8");//放在getParameter前才會有效
本方法只針對于POST請求,因?yàn)镻OST的請求參數(shù)放在請求體中,而GET方式的數(shù)據(jù)放在請求行中
2.對于GET方式:只能采用傳統(tǒng)方式
byte[] buf = xx.getBytes("ISO8859-1");
xx = new String(buf,"UTF-8");
4.封裝User---JavaBean對象
- 簡單介紹JavaBean
程序中往往有重復(fù)使用的段落,JavaBean就是為了能夠重復(fù)使用而設(shè)計的程序段落,而且這些段落并不只服務(wù)于某一個程序,而且每個JavaBean都具有特定功能,當(dāng)需要這個功能的時候就可以調(diào)用相應(yīng)的JavaBean。從這個意義上來講,JavaBean大大簡化了程序的設(shè)計過程,也方便了其他程序的重復(fù)使用。- 滿足這三個條件:
1.執(zhí)行java.io.Serializable 接口
2.提供無參數(shù)的構(gòu)造器
3.提供getter 和 setter方法訪問它的屬性.

例如:有如下的表單,采用POST進(jìn)行提交數(shù)據(jù),現(xiàn)在要對數(shù)據(jù)進(jìn)行封裝到JavaBean對象中去

package cn.itcast.android.request;
public class User {
/**
* 用戶,用于封裝所有的表單參數(shù),即javabean
*/
private String username;
private String password;
private String[] likes;
private Integer salary;
//無參構(gòu)造器
public User(){}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
像這樣就可以封裝成一個User對象,然后,BeanUtils(user,name,values);將獲取到的參數(shù),封裝起來。注意:name要與表單的name相對應(yīng)。
5.request 域?qū)ο?/p>
- Request 有兩層含義:
(1)它是一個請求對象
(2)域?qū)ο?,理解為一個容器可以存放Object類型的數(shù)據(jù) - 域?qū)ο笞饔?/li>
域?qū)ο笞饔?/div>
Request域?qū)ο蟪S玫腁PI:
(1)setAttribute(String, Object);------進(jìn)行存放
(2)getAttribute(String);-----------------返回一個Object類型
(3)removeAttribute(String);-----------無void6.轉(zhuǎn)發(fā)
request.getRequestDispatcher("/ xxxxxxxxx ").forward(request,response);
/表示當(dāng)前應(yīng)用的根目錄,forward實(shí)現(xiàn)真正地轉(zhuǎn)發(fā)
- 位于WEB-INF這個私有目錄下的資源,該如何訪問呢?
只能借助于轉(zhuǎn)發(fā)- 轉(zhuǎn)發(fā)細(xì)節(jié):
(1)forward方法用于將請求轉(zhuǎn)發(fā)到RequestDispatcher對象封裝的路徑去
(2)如果向response對象中輸出內(nèi)容,但是該內(nèi)容沒有真正的輸出到瀏覽器,即停留在response的緩沖區(qū)中。此時,若又要轉(zhuǎn)發(fā),這時,原緩沖區(qū)的內(nèi)容就會被清空,不會被輸出到瀏覽器上面,最終,結(jié)果是轉(zhuǎn)發(fā)到目標(biāo)資源,但是如果已經(jīng)寫入到HttpServletRequest對象中的響應(yīng)頭字段信息保持有效。
(3)當(dāng)真正地將內(nèi)容輸出到了瀏覽器中了,request對象的生命結(jié)束,而此時要進(jìn)行轉(zhuǎn)發(fā)response不會恢復(fù),所以報錯。意思是,不要在轉(zhuǎn)發(fā)之前,提前把數(shù)據(jù)傳給瀏覽器,這樣是無用功。最后編輯于 :?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。相關(guān)閱讀更多精彩內(nèi)容
Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智... 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ... 在這個風(fēng)和日麗的午后,一架由上海浦東轉(zhuǎn)機(jī)再飛往甌江之濱白甌市白甌機(jī)場的波音737客機(jī)平穩(wěn)地緩緩落地。 一位...




