//經常使用方法 //獲得的是:協議+服務器地址+端口號+工程名稱+資源地址+參數 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頁面: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); }
//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"));
域對象:底層必定有一個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對象的請求轉發不支持相對路徑
由於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");
客戶端跳轉:由客戶端瀏覽器發出來的跳轉(加工程名稱)
服務端跳轉:由服務端發出的跳轉(不加工程名稱)