HttpServletRequest應用

HttpServletResquest知識:html

Request的主要方法:
request.getRequestURL().toString();//獲取URL地址:URL:協議,主機,資源地址
request.getRequestURI();//獲取資源地址
request.getQueryString();//獲取地址後所跟的參數
request.getRemoteAddr();//獲取來訪者的ip地址
request.getRemotePort();//獲取來訪者端口
request.getMethod();//獲取來訪者的請求方式
request.getProtocol();//客戶端的請求方式瀏覽器

獲取請求消息頭的內容:服務器

獲取請求消息頭的全部名稱:app

Enumeration<String> e=request.getHeaderNames();
while(e.hasMoreElements()){
 String str=e.nextElement();
 System.out.println(str+":"+request.getHeader(str));
}
請求消息頭:
accept:text/html, application/xhtml+xml, */*
accept-language:zh-CN
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
accept-encoding:gzip, deflate
host:localhost:8080
dnt:1
connection:Keep-Aliveide

獲取客戶端提交的參數(正文):
獲取參數:
String str=request.getParameter("username");post

當有兩個相同name的參數時,用:
String []str=request.getParameterValues("password");
獲取便可。this

獲取全部參數名稱:
Enumeration e=request.getParameterNames();spa

用beanutils封裝獲取到的參數:code

User us=new User();
BeanUtils.populate(us, request.getParameterMap());
System.out.println(us);orm

User爲一個描述類,描述要封裝的數據,
public class User {
 private String username;         //命名要與表單中的name中的命名相同
 private int psw;
 private String code;
 public String getUesername() {
  return username;
 }
 public void setUesername(String uesername) {
  this.username = uesername;
 }
 public int getPsw() {
  return psw;
 }
 public void setPsw(int psw) {
  this.psw = psw;
 }
 public String getCode() {
  return code;
 }
 public void setCode(String code) {
  this.code = code;
 }
 @Override
 public String toString() {
  return "User [uesername=" + username + ", psw=" + psw + ", code="
    + code + "]";
 }
}


表單輸入域的特色:
用beanutils封裝表單中的資源時,有一點要注意:
封裝前,描述類中的屬性值都爲null,
封裝後,若是沒有上傳字段的屬性,顯示的是什麼都沒有,而不是null,
若是沒有該字段,則顯示的爲null;
表單中的單選框和多選框若是沒有選擇,則根本不會向服務器傳值,也顯示的爲null。


請求參數是中文:
知識點:瀏覽器當前是什麼碼錶,就以什麼碼錶向服務器傳輸
服務器以iso-8859-1 來解碼

處理:post請求:response.setCharacterEncoding("UTF-8");
 get請求:new String(name.getBytes("iso-8859-1"),"UTF-8");//name爲:resquest.getparameter("name");
 get請求方式沒法用beanutils來封裝,只能單個封裝,因此推薦post請求。


請求重對象和請求轉發:

請求重對象:二次請求,瀏覽器的行爲,地址欄會發生變化。
請求轉發:一次請求,服務器行爲,地址欄不會發生變化

請求重對象:
方式一:
public class TextRequest2 extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   //告知瀏覽器沒法處理請求
  response.setStatus(302);
  response.setHeader("location", "/TextRequest/servlet/TextRequest3");
 }

方式二:(推薦)
response.sendRedirect("/TextRequest/servlet/TextRequest3");

TextRequest2爲請求重對象:源;TestRequest3爲請求重對象目標

請求轉發:
請求源:request.setAttribute("p", "ppp");
  //請求轉發方式一:用servletcontext轉發
  ServletContext sc=getServletContext();
  RequestDispatcher rd=sc.getRequestDispatcher("/servlet/TextRequest3");
  rd.forward(request, response);
  用這種方式轉發,路徑必須以「/」開頭,表明絕對路徑,當前應用

請求目標:String str=(String)request.getAttribute("p");
  //請求轉發方式二:
  RequestDispatcher rd=request.getRequestDispatcher("TextRequest3");
  rd.forward(request, response);
  這種方式轉發,能夠以「/」開頭,表示絕對路徑,也能夠不以「/」開頭,表明相對路徑,


當不須要在目標對象中取得源中的對象時,使用請求重對象,不然使用請求轉發。

包含:
源對象代碼:
response.setCharacterEncoding("UTF-8");
response.getWriter().write("哈哈");
RequestDispatcher rd=request.getRequestDispatcher("/servlet/TextRequest");
rd.include(request, response);


目標對象代碼:
response.setCharacterEncoding("UTF-8");
response.getWriter().write("哈哈");

URL的書寫方式:相對路徑(不推薦)絕對路徑:重對象:response.sendRedirect("/TextRequest/servlet/TextRequest3")轉發:request.getRequestDispatcher("/servlet/TextRequest");超連接:<a href="/TextRequest/servlet/TextRequest3"/>表單:<form action="/TextRequest/servlet/TextRequest3"></form>總結:當鏈接是給客戶端使用的,須要寫當前應用,給服務器使用的,不須要寫,「/」就表明當前應用

相關文章
相關標籤/搜索