亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

谷哥的小弟學后臺(12)——Servlet(4)

2019-11-09 13:44:07
字體:
來源:轉載
供稿:網友

探索Android軟鍵盤的疑難雜癥 深入探討Android異步精髓Handler 詳解Android主流框架不可或缺的基石 站在源碼的肩膀上全解Scroller工作機制


Android多分辨率適配框架(1)— 核心基礎 Android多分辨率適配框架(2)— 原理剖析 Android多分辨率適配框架(3)— 使用指南


自定義View系列教程00–推翻自己和過往,重學自定義View 自定義View系列教程01–常用工具介紹 自定義View系列教程02–onMeasure源碼詳盡分析 自定義View系列教程03–onLayout源碼詳盡分析 自定義View系列教程04–Draw源碼分析及其實踐 自定義View系列教程05–示例分析 自定義View系列教程06–詳解View的Touch事件處理 自定義View系列教程07–詳解ViewGroup分發Touch事件 自定義View系列教程08–滑動沖突的產生及其處理


版權聲明

本文原創作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl

在前幾篇博客中我們學習了Tomcat,Http,Servlet,HttpServletResponse在此基礎上我們來深入學習Servlet的請求即HttpServletRequest

HttpServletRequest的簡單使用

HttpServletRequest代表客戶端的請求,當客戶端通過HTTP協議訪問服務器時與請求相關的所有信息都將被封裝在這個對象中,所以我們可通過該對象獲得客戶端的相關信息。

常用的方法如下:

getRequestURL():返回客戶端發出請求時的完整URLgetRequestURI():返回請求行中的資源名部分getContextPath():返回請求的上下文路徑getQueryString():返回請求行中的參數部分getParameter():返回參數中的具體值getRemoteAddr():返回發出請求的客戶端的ip地址getRemoteHost():返回發出請求的客戶端的完整主機名getRemotePort():返回客戶端所使用的網絡端口號getMethod():返回客戶端使用的請求方式getHeaderNames():返回此請求包含的所有頭的名稱getHeader():返回指定的請求頭的值

請看如下示例:

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestServlet extends HttpServlet { @Override PRotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { getRequestInfo(request); getRequestHeader(request); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } //獲取與請求相關的信息 private void getRequestInfo(HttpServletRequest request){ String method=request.getMethod(); StringBuffer requestURL = request.getRequestURL(); String requestURI = request.getRequestURI(); String contextPath = request.getContextPath(); String queryString = request.getQueryString(); String name=request.getParameter("name"); String remoteAddr = request.getRemoteAddr(); String remoteHost = request.getRemoteHost(); int remotePort = request.getRemotePort(); System.out.println("----> method="+method); System.out.println("----> requestURL="+requestURL); System.out.println("----> requestURI="+requestURI); System.out.println("----> contextPath="+contextPath); System.out.println("----> queryString="+queryString); System.out.println("----> remoteAddr="+remoteAddr); System.out.println("----> remoteHost="+remoteHost); System.out.println("----> remotePort="+remotePort); } //獲取請求的Header中的信息 private void getRequestHeader(HttpServletRequest request){ Enumeration<String> headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()){ String headKey=headerNames.nextElement(); String headValue=request.getHeader(headKey); System.out.println(headKey+":"+headValue); } }}

代碼寫好了,我們現在通過瀏覽器發出請求:

http://localhost:8081/TestServlet03/helloServlet?name=lucy

在Console中觀察輸入結果:

—-> method=GET —-> requestURL=http://localhost:8081/TestServlet03/helloServlet —-> requestURI=/TestServlet03/helloServlet —-> contextPath=/TestServlet03 —-> queryString=name=lucy —-> name=lucy —-> remoteAddr=127.0.0.1 —-> remoteHost=127.0.0.1 —-> remotePort=63484 host:localhost:8081 connection:keep-alive cache-control:max-age=0 accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 upgrade-insecure-requests:1 user-agent:Mozilla/5.0 (Windows NT 10.0;Win64; x64)Chrome/47.0.2526.111 accept-encoding:gzip, deflate, sdch accept-language:zh-CN,zh;q=0.8

嗯哼,結合這些輸出結果再回過頭看這些方法就能有更好的體會。在此,再次強調一下:請注意getRequestURL()和getRequestURI()以及getContextPath()、getQueryString()這四個方法的區別

getRequestURL()返回的是請求的路徑,但是不含請求的參數部分getRequestURI()返回請求行中的資源名部分,但是不含有請求的主機和端口以及請求的參數部分getContextPath()返回請求的上下文,即/+項目名稱,比如此處的/TestServlet03

在前幾篇博客中我們學習了Tomcat,Http,Servlet,HttpServletResponse在此基礎上我們來深入學習Servlet的請求即HttpServletRequest

HttpServletRequest處理表單請求

在剛才的示例中,我們利用getParameter()獲取GET請求中請求參數中的具體值,那么在POST請求時又該怎么獲取傳遞給服務端的值呢?請看如下示例

先準備一個表單:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Welcome</title></head><body> <form action="/TestServlet03/form" method="post"> 用 戶:<input type="text" name="username"/> <br/><br/> 密 碼:<input type="passWord" name="password"/> <br/><br/> 性 別:<input type="radio" name="gender" value="男" />男 <input type="radio" name="gender" value="女" checked="checked"/>女 <br/><br/> 愛 好:<input type="checkbox" name="hobby" value="攝影"/>攝影 <input type="checkbox" name="hobby" value="唱歌"/>唱歌 <input type="checkbox" name="hobby" value="拍照"/>拍照 <br/><br/> 城 市: <select name="city"> <option>------請選擇------</option> <option value="dj">東京</option> <option value="db">大阪</option> <option value="xt">仙臺</option> </select> <br/><br/> <input type="submit" value="歡迎注冊VIP會員"/> </form></body></html>

再實現服務端的代碼:

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestForm extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { testForm1(request); } private void testForm1(HttpServletRequest request)throws ServletException,IOException { request.setCharacterEncoding("UTF-8"); Enumeration<String> parameterNames = request.getParameterNames(); while(parameterNames.hasMoreElements()){ String name = parameterNames.nextElement(); String[] values = request.getParameterValues(name); for(int i=0;values!=null&&i<values.length;i++){ System.out.println("name="+name+" "+"value="+values[i]); } } }}

代碼解析如下:

利用setCharacterEncoding()設置編碼方式利用getParameterNames()獲取所有請求參數的名稱,請參見代碼第28行 對于此處的表單POST提交而言傳遞的參數的名稱分別為username,password,gender,hobby,city獲取每個參數對于的值,請參見代碼第29-35行

嗯哼,現在我們通過瀏覽器來發起一個請求:

這里寫圖片描述

在Console觀察打印信息:

name=username value=杉原杏璃 name=password value=123456789 name=gender value=女 name=hobby value=攝影 name=hobby value=拍照 name=city value=dj

在實際開發中,我們可能需要將這些傳遞給服務端的信息封裝成實體,請看如下示例:

先準備一個實體Entity:

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;import java.io.Serializable;import java.util.Arrays;public class User implements Serializable{ private String username; private String password; private String gender; private String[] hobby; private String city; 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; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String[] getHobby() { return hobby; } public void setHobby(String[] hobby) { this.hobby = hobby; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Override public String toString() { return "User [username=" + username + ", password=" + password + ", gender=" + gender + ", hobby=" + Arrays.toString(hobby) + ", city=" + city + "]"; }}

請注意,該實體中字段的名字必須與表單中各個name的值相對應

再來看服務端的代碼:

private void testForm2(HttpServletRequest request)throws ServletException,IOException { try { request.setCharacterEncoding("UTF-8"); User user = new User(); Map<String,String[]> parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> map : parameterMap.entrySet()) { String name = map.getKey(); String[] values = map.getValue(); PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, User.class); Method method = propertyDescriptor.getWriteMethod(); if(values.length==1&&!name.equals("hobby")){ method.invoke(user, values[0]); }else{ method.invoke(user, (Object)values); } } System.out.println("------> "+user); } catch (Exception e) { e.printStackTrace(); } }

代碼解析如下:

利用getParameterMap()得到請求中所有的參數及其對應的值,請參見代碼第5行 注意:有的參數只有一個值,比如該示例中的username;有的參數會有多個值,比如該示例中的hobby獲取每個參數及其對應的值,請參見代碼第7-8行反射出每個參數在實體中的setter()方法,請參見代碼第9-10行設置每個參數對應的值,請參見代碼第11-15行

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

我們知道:

利用response.sendRedirect()實現請求的重定向利用request.getRequestDispatcher().forward()實現請求的轉發

請注意它們的區別:

重定向時瀏覽器中的地址欄會發生變化,但是請求轉發時瀏覽器中地址欄不會發生改變。從本質上來講:重定向是兩次不同的請求,而請求轉發只向服務端的發送了一次請求由服務端的內部實現請求的跳轉。重定向可以跳轉到應用的外部,而重定向的范圍只能是應用的內部請求轉發可利用request.setAttribute()將數據傳遞到下一個Servlet且下一個Servlet可用request.getAttribute()取出數據;但是重定向不可以也沒有道理這么做。至于為什么,請參考第一點。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人深夜直播免费观看| 91久久精品久久国产性色也91| 国产精品久久久av| 国产亚洲aⅴaaaaaa毛片| 91精品国产91久久久久久久久| 久久理论片午夜琪琪电影网| 亚洲欧美日韩精品久久亚洲区| 亚洲成人999| 欧美精品一二区| 隔壁老王国产在线精品| 国产在线视频不卡| 欧美在线观看一区二区三区| 亚洲精品国产品国语在线| 69视频在线免费观看| 91社影院在线观看| 成人久久精品视频| 精品丝袜一区二区三区| 日韩av在线看| 中文字幕日韩欧美在线| 欧美第一淫aaasss性| 国产999视频| 日韩网站在线观看| 日韩精品日韩在线观看| 久久精品视频一| 日韩欧亚中文在线| 国产午夜精品一区理论片飘花| 日韩在线观看免费| 久久国内精品一国内精品| 色综合久久天天综线观看| 人妖精品videosex性欧美| 久久久久国产精品免费| 日韩av在线天堂网| 国产精品久久久久免费a∨大胸| 国产精品成人av性教育| 日韩一级黄色av| 欧美日韩在线视频首页| 国产精品久久久久久婷婷天堂| 欧美午夜视频一区二区| 成人黄色在线观看| 国产精品99久久久久久久久久久久| 日韩美女av在线免费观看| 26uuu另类亚洲欧美日本一| 国产高清在线不卡| 国产精品一区二区在线| 黑人巨大精品欧美一区二区三区| 欧美人交a欧美精品| 国产小视频91| 国产偷国产偷亚洲清高网站| 国产精品视频最多的网站| 91高清免费视频| 96pao国产成视频永久免费| 欧美激情喷水视频| 国产日韩欧美综合| 日韩电视剧在线观看免费网站| 国产成人久久久精品一区| 国产精品永久免费视频| 久久久久久久影院| 欧美精品免费播放| 黑人巨大精品欧美一区二区三区| 亚洲欧美精品中文字幕在线| 中文字幕在线视频日韩| 96精品久久久久中文字幕| 亚洲午夜久久久久久久| 亚洲精品国产精品国自产观看浪潮| 欧美性猛交xxxxx水多| 日韩欧美国产中文字幕| 最新国产成人av网站网址麻豆| 成人日韩av在线| 国产精选久久久久久| 亚洲字幕一区二区| 久久精品91久久香蕉加勒比| 97在线精品国自产拍中文| 日韩美女写真福利在线观看| 久久亚洲影音av资源网| 久久久爽爽爽美女图片| 91av视频在线观看| 91免费综合在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 91久久精品一区| 国产日韩欧美一二三区| 搡老女人一区二区三区视频tv| 日产精品99久久久久久| 色噜噜狠狠狠综合曰曰曰| 日韩欧美一区二区三区| 亚洲精品国产拍免费91在线| 国产精品久久久久久一区二区| 日本精品久久中文字幕佐佐木| 日韩精品黄色网| 综合久久五月天| 欧美性理论片在线观看片免费| 国产精品jvid在线观看蜜臀| 欧美大片免费观看| 亚洲欧美在线磁力| 日韩精品中文字幕久久臀| 中文字幕视频在线免费欧美日韩综合在线看| 精品国产91久久久| 国产精品久久久久久婷婷天堂| 欧美一级淫片aaaaaaa视频| 26uuu另类亚洲欧美日本老年| 欧美成人在线免费视频| 国产精品影片在线观看| 亚洲xxx视频| 国语自产在线不卡| 亚洲欧美成人精品| 亚洲一区第一页| 国产精品久久精品| 欧美又大又粗又长| 精品国产欧美一区二区三区成人| 国产日韩欧美视频在线| 欧美国产第一页| 欧美一级高清免费播放| 91超碰caoporn97人人| 亚洲性av网站| 日本久久精品视频| 91精品视频观看| 欧美天天综合色影久久精品| 日韩在线视频观看| 精品五月天久久| 精品久久久91| 国产精品久久久久久搜索| 日本成熟性欧美| 91精品中国老女人| 日本久久久久亚洲中字幕| 国产成人精品一区二区在线| 91久久嫩草影院一区二区| 日韩精品福利在线| 中文字幕成人在线| 国产亚洲欧美日韩精品| 日韩精品视频观看| 97精品欧美一区二区三区| 亚洲天堂视频在线观看| 亚洲欧美国产精品专区久久| 欧洲成人免费视频| 欧美日韩在线第一页| 色偷偷88888欧美精品久久久| 色99之美女主播在线视频| 国产主播欧美精品| 国产小视频国产精品| 亚洲精品在线看| 在线视频欧美日韩| 亚洲国产精品大全| 91免费福利视频| 欧美成人国产va精品日本一级| 一本色道久久88综合日韩精品| 欧美福利视频网站| 插插插亚洲综合网| 中文字幕日韩欧美精品在线观看| 高清日韩电视剧大全免费播放在线观看| 亚洲精品一区二区在线| 欧美精品日韩www.p站| 青草成人免费视频| 亚洲午夜精品久久久久久性色| 搡老女人一区二区三区视频tv| 国产精品日韩av| 精品成人乱色一区二区| 欧美噜噜久久久xxx| 亚洲国产精品高清久久久| 亚洲国产精品高清久久久| 久久久欧美一区二区| 国产精品福利无圣光在线一区| 亚洲福利视频在线| 亚洲视屏在线播放| 国产精品专区第二| 国产精品美女午夜av|