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

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

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

2019-11-09 14:22:40
字體:
來源:轉載
供稿:網友

探索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
国产成人福利视频| 欧美激情视频一区| 在线观看国产成人av片| 尤物yw午夜国产精品视频明星| 91大神福利视频在线| 日韩中文有码在线视频| 国产一区二区三区18| 国产日韩欧美影视| 亚洲大胆人体在线| 欧美影院在线播放| 91精品国产91久久久久久最新| 97久久精品视频| 欧美激情性做爰免费视频| 国产主播在线一区| 羞羞色国产精品| 亚洲欧美在线x视频| 久久在线精品视频| 色诱女教师一区二区三区| 成人免费在线网址| 热久久99这里有精品| 最新国产精品拍自在线播放| 国产精品成人av在线| 亚洲欧美另类人妖| 九九热精品在线| 亚洲欧美日韩爽爽影院| 亚洲欧美日韩在线高清直播| 久久理论片午夜琪琪电影网| 日韩一区二区在线视频| 国内伊人久久久久久网站视频| 国产综合色香蕉精品| 欧美富婆性猛交| 日韩av在线网站| 欧美激情一级精品国产| 国产精品日韩欧美综合| 中文日韩在线观看| 精品偷拍各种wc美女嘘嘘| 国产亚洲成av人片在线观看桃| 91麻豆国产语对白在线观看| 欧美日韩国产123| 色99之美女主播在线视频| 俺去啦;欧美日韩| 国产精品色悠悠| 久久久噜噜噜久久| 欧美一区二区三区四区在线| 日韩av免费在线观看| 久久久中文字幕| 亚洲精品永久免费| 亚洲人精品午夜在线观看| 黑人巨大精品欧美一区免费视频| 在线观看亚洲视频| 中国日韩欧美久久久久久久久| 色综合天天狠天天透天天伊人| 美日韩精品视频免费看| 欧美精品中文字幕一区| 韩国三级电影久久久久久| 亚洲最新av网址| 日韩在线免费视频观看| 欧美国产乱视频| 亚洲国产婷婷香蕉久久久久久| 久久久视频精品| 尤物九九久久国产精品的特点| 成人精品一区二区三区电影黑人| 色综合老司机第九色激情| 欧美极品少妇xxxxⅹ喷水| 欧美激情高清视频| 97欧美精品一区二区三区| 亚洲性猛交xxxxwww| 日韩av电影免费观看高清| 在线免费观看羞羞视频一区二区| 一本大道久久加勒比香蕉| 国产成人精品久久| 亚洲a在线观看| 狠狠躁夜夜躁人人躁婷婷91| 8x拔播拔播x8国产精品| 久久夜色精品国产欧美乱| 色综合久久悠悠| www.日韩不卡电影av| www.国产一区| 欧美午夜无遮挡| 国产欧美日韩免费| 日韩av电影中文字幕| 久久精品亚洲国产| 国产精品第8页| 91在线视频九色| 色99之美女主播在线视频| 国产精品永久免费| 麻豆一区二区在线观看| 亚洲美女在线观看| 国产大片精品免费永久看nba| 亚洲第一在线视频| 国产一区二区三区在线播放免费观看| 91系列在线播放| 中文字幕亚洲欧美一区二区三区| 精品中文字幕久久久久久| 亚洲国产精久久久久久| 精品无人区乱码1区2区3区在线| 91啪国产在线| 国产一区二区三区在线播放免费观看| 亚洲视频在线免费观看| 国产一区二区香蕉| 国产日产亚洲精品| 5566成人精品视频免费| 久久久久日韩精品久久久男男| 成人黄色中文字幕| 久久久精品一区| 成人黄色av免费在线观看| 92福利视频午夜1000合集在线观看| 亚洲国产三级网| 亚洲一区二区久久久久久久| 一本色道久久综合亚洲精品小说| 欧美日韩中文字幕日韩欧美| 在线观看日韩视频| 国产欧美精品一区二区| 欧美成人免费在线观看| 欧美在线免费观看| 日韩在线观看免费高清完整版| 亚洲成人网在线| 国模视频一区二区| 91亚洲精品久久久| 欧美激情一区二区三区久久久| 国产精品美女在线观看| 97视频国产在线| 国产精品久久久久久久7电影| 中文字幕亚洲精品| 国产午夜精品麻豆| 日韩av在线导航| 91高潮精品免费porn| 亚洲一区亚洲二区| 日韩欧美有码在线| 日韩av高清不卡| 青青草原一区二区| 国产一区二区三区免费视频| 日韩在线中文字幕| 欧美在线日韩在线| 欧美日韩国产二区| 91亚洲一区精品| 久久精品免费电影| 亚洲欧美在线免费观看| 日av在线播放中文不卡| 久久这里只有精品视频首页| 九九久久综合网站| 亚洲精品日韩丝袜精品| 欧美激情高清视频| 91欧美精品成人综合在线观看| 一色桃子一区二区| 国内精品视频一区| 91av在线国产| 亚洲xxxx18| 性色av一区二区三区在线观看| 精品一区二区电影| 欧美国产第一页| 久久精品2019中文字幕| 久久精品亚洲94久久精品| 欧美午夜片欧美片在线观看| 91精品啪在线观看麻豆免费| 97在线精品国自产拍中文| 成人在线激情视频| 久久久久女教师免费一区| 欧美性精品220| 国产精品高潮呻吟久久av黑人| 日韩电影中文 亚洲精品乱码| 午夜免费日韩视频| 日韩免费看的电影电视剧大全| 亚洲成人三级在线|