Request對象

###Requst對象簡介 HttpServletRequest對象表明客戶端的請求,當客戶端經過HTTP協議訪問服務器時,HTTP請求頭中的全部信息都封裝在這個對象中,客戶獲取客戶機的這些信息。html

  1. getRequestURL 返回客戶端發出請求時的完整URL
  2. getRequestURI 返回請求中的資源名部分
  3. getQueryString 返回請求中的參數部分
  4. getRemoteAddr 返回請求中客戶機的IP地址
  5. getRemoteHost 返回客戶機的完整主機名
  6. getRemotePort 返回客戶機所使用的網絡端口號
  7. getLocalAddr 返回服務器的IP地址
  8. getLocalName 返回服務器的主機名
  9. getMethod 獲得客戶機請求方式

*. URL: www.sina.com/news/1.html 互聯網資源 *. URI: 標示任意資源 例如: news/1.html c:/1.htmljava

###request獲取參數的方式web

1. request.getParameter("username")
2. Elemeration e = request.getParamterNames();
    while(e.haseMoreElements()){
        String name = (String)e.nextElement();
        value = request.getParameter(name);
        System.out.println(name + ":" + value);
    }
3. String [] values= request.getaramterValues("username");
4. Map map = request.getParameterMap();
  User user = new User();
  BeanUtils.populate(user,map)
  
    BeanUtils依賴commons.logging,BeanUtils.copyProperties(from,dest)此方法也比較經常使用。

###經過表單收集客戶機數據設計模式

<form action="/day06/servlet/RequestDemo3" method="post">
    用戶名:<input type="text" name = "username" />
    密碼:<input type="password" name="password" />
    性別:<input type="radio" name="gender" value="male">男
        <input type="radio" name="gender" value="female">女
    所在地:<select name="city"
            <option value="beijing">北京</option>
            <option value="shanghai">上海</option>
           </select>
    愛好:
        <input type="checkbox" name="likes" value="sing">唱歌
        <input type="checkbox" name="likes" value="dance">跳舞
        <input type="checkbox" name="likes" value="football">足球
    備註: <textarea rows="6" cols="60" name="desc"></textarea>
    照片:<input type="file" name="image">
    <input type="hidden" name = "id" value="123">
    <input type="submit" value="提交"></br>

request的亂碼問題

#####若是以post提交瀏覽器

<meta http-equiv="content-type" content="text/html;charset=UTF-8"
    <form action="/day06/servlet/RequestDemo2" method="post>
        用戶名:<input type="text" name="username" />
        <input type="submit" value="提交" / >
    </form>

後臺servlet服務器

request.setCharacterEncoding("UTF-8");
    request.getParamter("username");

#####若是以get方式提交,須要手工處理網絡

String username = request.getParametr("username");
 username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
超連接中的提交的中文,輸入get請求,也須要手工處理
```

經過更改服務器的server.xml中的
 URLEncoding="UTF-8"也能解決亂碼問題,可是不推薦。

###request實現轉發的mvc設計模式
```
String data= "aaa";
request.setAttributef("data",data);
request.getRequestDispatcher("message.jsp").forward(request,response);
```
前臺:
```
1.    {data}
2.    <% 
        String data= (String) request.getAttribute("data");
        out.write(data);
       %>
```


*. request對象實現請求轉發,請求轉發指一個web資源受到客戶端請求後,通知服務器去調用另一個web資源進行處理。

*. 請求轉發的應用場景:mvc設計模式

*. request對象提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher對象,調
用這個對象的forward方法能夠實現請求轉發。

*. request對象同時也是一個域對象,開發人員經過request對象在實現轉發時,把數據經過request對象帶給其它web資源處理
    1.setAttribute方法
    2.getAttribute方法
    3.remoteAttribute方法
    4.getAttributeNames方法

java.lang.IllegalStateException:cannot forward after response has been commited.


若是有兩個forward,也會有以上異常出現,建議forward以後,return
請求轉發的特色:

    *. 客戶端只發一次請求,而服務器端有多個資源調用。
    *. 客戶端瀏覽器地址欄沒有變化

### web工程中各種地址的寫法
```
1. request.getRequest("/form1.html").forward(request,response);
2. response.sendRedirect("/day06/form1.html");
3. this.getServletContext().getRealPath("form1.html");
4. this.getServletContext.getResourceAsStream("form1.html");
5. <a href="/day06/form1.html">超連接 </a>
6. <form action="/day06/form1.do">....
```
對於客戶端瀏覽器,要加上項目名稱
對於服務器端,不加項目名稱

###利用referer防盜鏈
```
String referer = request.getHeader("referer");
if(referer==null || referer.startwith("http://localhost")){
    response.sendRedirect("/day06/index.jsp");
    return;
}
response.getWriter().write("aaa");
```
相關文章
相關標籤/搜索