Web開發之request

request經常使用方法

//經常使用方法
//獲得的是:協議+服務器地址+端口號+工程名稱+資源地址+參數
String url = request.getRequestURL();
//獲得的是:工程名稱+資源地址
String uri = request.getRequestURI();
//獲得的是:工程名稱
String contextpath = request.getContextPath();
//獲得的是:服務器的IP地址
String encoding = request.getCharacterEncoding();
//獲得的是:服務器的端口號
int localport = request.getLocalPort();
//獲得的是:客戶端的ip
String remoteIp = request.getRemoteAddr();
//獲得的是:客戶端的端口號(隨機的)
String remotePort = request.getRemotePort();
//請求參數
String query = request.getQueryString();
//請求方式
String method = request.getMethod();

得到請求頭信息

//獲取單個請求頭信息
String s = request.getHeader("Accept-Encoding");

//獲取同名的請求頭的多個值
Enumeration<String> enu = request.getHeaders("Accept-Encoding");
while(enu.hasMoreElements()){
    System.out.println(enu.nextElement());
}

//拿到全部的請求頭和值
Enumeration<String> enu = request.getHeaderName();
while(enu.hasMoreElements()){
    String key = enu.nextElement();
    System.out.println(key + ":" + request.getHeader(key));
}

獲取HTML中的控件信息

  • HTML頁面:javascript

    <form action="ServletRequest/servlet/TestRequest" method="post">
        姓名:<input type = "text" name = "username"><br>
        密碼:<input type = "text" name = "password"><br>
        確認密碼:<input type = "text" name = "password"><br>
        <input type = "submit" value = "提交">
    </form>
  • servlet: html

    //1.獲取單個控件的值
    public void test1(HttpServletRequest request){
        //當表單裏沒有填寫內容時,獲取到的是空字符串
        //當所填名字沒有對應控件時,獲取到的是null
        String name = request.getParameter("username");//參數是控件的名字
        System.out.println("姓名:" + name);
    }

    //2.獲取同名控件的值
    public void test2(HttpServletRequest request){
        String[] pass = request.getParameterValues("password");
        for(String string:pass){
            System.out.println(string);
        }
    }

    //3.獲取全部控件的名字和值
    public void test3(HttpServletRequest request){
        Enumeration<String> enu = request.getParameterNames();
        While(enu.hasMoreElements()){
            String name = enu.nextElement();
            //因爲名字可能會重複
            String[] values = request.getParameterValues(name);
            for(String value:values){
                System.out.println(name + ":" + request);
            }
        }
    }

    //4.將表單中的全部值封裝到javabean中:
    //  採用PropertyDescriptor
    • javaBeanjava

      //實現序列化接口:表示其能夠被序列化,讓對象通過網絡傳輸不會出錯
      public class User implements Serializable{
          private String username;
          private String[] password;
      
          set,get...
          ...
          toString...
      }
    • servlet:web

      public void test4(HttpServletRequest request){
          //將頁面傳遞的內容封裝到user對象中
          User user = new User();
          //獲取全部控件的名字
          Enumeration<String> enu = request.getParameterNames();
          While(enu.hasMoreElements()){
              String name = enu.nextElement();
              //因爲名字可能會重複
              String[] values = request.getParameterValues(name);
      
              //拿到屬性name的屬性描述器
              PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
              //將值注入到屬性中
              //拿到寫描述器
              Method method = pd.getWriterMethod();
              //爲了兼容jdk1.4,sun開發的invoke方法在執行的時候將參數拆開進行傳遞,因此致使異常
              if(values.length == 1)
                  method.invoke(user,values);
              else{
                  //解決辦法一:(底層的values已經不是一個數組了)
                  method.invoke(user, (Object}values);
                  //解決辦法二:
                  method.invoke(user, new Object[]{values});
              }
          }
          System.out.println("封裝後:" + user);
      }

    //5.將表單中的全部值封裝到javabean中:(其它代碼同4,只改while中代碼)
    //  採用第三方的jar進行封裝:BeanUtils類(Spring框架裏提供)
    While(enu.hasMoreElements()){
        String name = enu.nextElement();
        //因爲名字可能會重複
        String[] values = request.getParameterValues(name);
    
        //採用BeauUtils類封裝
        BeanUtils.setProperty(user,name,values);
    }

    //6.將表單中的全部值封裝到javabean中:
    //  採用第三方的jar進行封裝:BeanUtils類(Spring框架裏提供)
    public void test6(HttpServletRequest request){
        //將頁面傳遞的內容封裝到user對象中
        User user = new User();
        //拿到控件的名字和值的鍵值對
        Map<String,String[]> map = request.getParameterMap();
        for(Map.Entry<String, String[]> entry:map.entrySet()){
            //拿到控件的名字
            String name = entry.getKey();
            //拿到控件的值
            String values = entry.getValue();
    
            //採用BeauUtils類封裝
            BeanUtils.setProperty(user,name,values);
        }
    }

    //7.將表單中的全部值封裝到javabean中:
    //  (推薦使用)
    public void test7(HttpServletRequest request){
        //將頁面傳遞的內容封裝到user對象中
        User user = new User();
    
        BeanUtils.populate(user, request.getParameterMap());
    
        System.out.println("封裝後" + user);
    }

request中文亂碼問題

//1.當提交方式爲post時:
//  request.setCharacterEnconding("UTF-8");
request.setCharacterEnconding("UTF-8");
String name = request.getParameter("username");

get方式爲何會亂碼:填寫好傳遞數據以前,瀏覽器先用URLEncoder進行編碼
在傳輸過程當中,又用了ISO8859-1進行了一次編碼數組

//2.當提交方式爲get時:
//  重建字符串(適用於內容較少時)
request.setCharacterEnconding("UTF-8");
String name = request.getParameter("username");
name = new String(name.getBytes("ISO-8859-1"),"utf-8");

//當寫中文較多的時候,採用更改服務器編碼方法
//在server.xml中<Connector />中加一個
//URIENcoding = "UTF-8"

//當直接從地址欄中輸入中文亂碼時
String name = request.getParameter("username");
name = new String(name.getBytes("ISO-8859-1"));

request也是一個域對象(四大域對象之一)

域對象:底層必定有一個Map來存放鍵值對 瀏覽器

  • ServletRequest1中服務器

    request.setAttribute("name", "高圓圓");
    //請求轉發器
    RequestDispatcher rd = request.getRequestDispatcher("/servlet/ServletRequest2");
    //轉發到ServletRequest2中
    rd.forward(request, response);  //請求轉發
    
    rd.include(request, response);  //把ServletRequest2包含進來
    
    //拿取ServletRequest2中存取的數據
    int age = (Integer)request.getAttribute("age");
  • ServletRequest2中網絡

    String name = request.getAttribute("name");
    request.setAttribute("age",100);

request對象的請求轉發和ServletContext對象的請求轉發的區別

request對象的請求路勁支持相對路徑
ServletContext對象的請求轉發不支持相對路徑
由於ServletContext是一個全局對象,它表明的是一個工程框架


封裝表單中的數據(各類控件)

  • HTML頁面svg

    <form action="/day09_01_httpServletRequest/servlet/ServletRequest6" method="post">
          姓名: <input type = "text" name = "username" ><br>
          密碼:<input type = "text" name = "password" ><br>
          確認密碼:<input type = "text" name = "password" ><br>
          性別: <input type = "radio" name = "gander" value = "男" >男<input type = "radio" name = "gander"     value = "女">女<br>
          愛好:<input type = "checkbox" name = "loves" value = "打籃球">打籃球
                <input type = "checkbox" name = "loves" value = "踢足球">踢足球
                <input type = "checkbox" name = "loves" value = "聊天">聊天<br>
         國籍: <select name = "country">
              <option value = "中國">中國</option>
              <option value = "美國">美國</option>
              <option value = "日本">日本</option>
         </select><br>
         備註: <textarea rows="5" cols="20" name = "description">大神留下腳印吧!!!</textarea><br>
        <!--  <input type = "submit" value = "提交" >  -->
        <input type = "button" value = "提交" onclick = "fun_submit()">
      </form>
    
    <script type="text/javascript">
        function fun_submit(){
            //數據檢測
    
            //提交數據
            var form = document.forms[0];
            form.method = "post";
            form.submit();  
        }
    </script>
  • javaBean

    public class User implements Serializable{
        private String username;
        private String[] password;
        private String gander;
        private String[] loves;
        private String country;
        private String description;
    
        set,get...
        tostring...
    }
  • servlet中

    User user = new User();
    //將表單數據封裝到user對象中
    BeanUtils.populate(user, request.getParameterMap());
    System.out.println("封裝後:" + user);

請求重定向和請求轉發的區別

//請求重定向到新的資源
//這個執行以後,request就不在這個servlet中了,死亡了,被從新定向到Servlet2了 。
//可是請求轉發後request還存在
response.sendRedirect(request.getContextPath() + "/servlet/Servlet2");

URL地址的寫法

  • 客戶端跳轉:由客戶端瀏覽器發出來的跳轉(加工程名稱)

  • 服務端跳轉:由服務端發出的跳轉(不加工程名稱)

相關文章
相關標籤/搜索