麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

谷哥的小弟學(xué)后臺(tái)(12)——Servlet(4)

2019-11-09 14:22:40
字體:
供稿:網(wǎng)友

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


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


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


版權(quán)聲明

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

在前幾篇博客中我們學(xué)習(xí)了Tomcat,Http,Servlet,HttpServletResponse在此基礎(chǔ)上我們來深入學(xué)習(xí)Servlet的請(qǐng)求即HttpServletRequest

HttpServletRequest的簡(jiǎn)單使用

HttpServletRequest代表客戶端的請(qǐng)求,當(dāng)客戶端通過HTTP協(xié)議訪問服務(wù)器時(shí)與請(qǐng)求相關(guān)的所有信息都將被封裝在這個(gè)對(duì)象中,所以我們可通過該對(duì)象獲得客戶端的相關(guān)信息。

常用的方法如下:

getRequestURL():返回客戶端發(fā)出請(qǐng)求時(shí)的完整URLgetRequestURI():返回請(qǐng)求行中的資源名部分getContextPath():返回請(qǐng)求的上下文路徑getQueryString():返回請(qǐng)求行中的參數(shù)部分getParameter():返回參數(shù)中的具體值getRemoteAddr():返回發(fā)出請(qǐng)求的客戶端的ip地址getRemoteHost():返回發(fā)出請(qǐng)求的客戶端的完整主機(jī)名getRemotePort():返回客戶端所使用的網(wǎng)絡(luò)端口號(hào)getMethod():返回客戶端使用的請(qǐng)求方式getHeaderNames():返回此請(qǐng)求包含的所有頭的名稱getHeader():返回指定的請(qǐng)求頭的值

請(qǐng)看如下示例:

/** * 本文作者:谷哥的小弟 * 博客地址: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 { } //獲取與請(qǐng)求相關(guān)的信息 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); } //獲取請(qǐng)求的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); } }}

代碼寫好了,我們現(xiàn)在通過瀏覽器發(fā)出請(qǐng)求:

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

在Console中觀察輸入結(jié)果:

—-> 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

嗯哼,結(jié)合這些輸出結(jié)果再回過頭看這些方法就能有更好的體會(huì)。在此,再次強(qiáng)調(diào)一下:請(qǐng)注意getRequestURL()和getRequestURI()以及getContextPath()、getQueryString()這四個(gè)方法的區(qū)別

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

在前幾篇博客中我們學(xué)習(xí)了Tomcat,Http,Servlet,HttpServletResponse在此基礎(chǔ)上我們來深入學(xué)習(xí)Servlet的請(qǐng)求即HttpServletRequest

HttpServletRequest處理表單請(qǐng)求

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

先準(zhǔn)備一個(gè)表單:

<!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>------請(qǐng)選擇------</option> <option value="dj">東京</option> <option value="db">大阪</option> <option value="xt">仙臺(tái)</option> </select> <br/><br/> <input type="submit" value="歡迎注冊(cè)VIP會(huì)員"/> </form></body></html>

再實(shí)現(xiàn)服務(wù)端的代碼:

/** * 本文作者:谷哥的小弟 * 博客地址: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()設(shè)置編碼方式利用getParameterNames()獲取所有請(qǐng)求參數(shù)的名稱,請(qǐng)參見代碼第28行 對(duì)于此處的表單POST提交而言傳遞的參數(shù)的名稱分別為username,password,gender,hobby,city獲取每個(gè)參數(shù)對(duì)于的值,請(qǐng)參見代碼第29-35行

嗯哼,現(xiàn)在我們通過瀏覽器來發(fā)起一個(gè)請(qǐng)求:

這里寫圖片描述

在Console觀察打印信息:

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

在實(shí)際開發(fā)中,我們可能需要將這些傳遞給服務(wù)端的信息封裝成實(shí)體,請(qǐng)看如下示例:

先準(zhǔn)備一個(gè)實(shí)體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 + "]"; }}

請(qǐng)注意,該實(shí)體中字段的名字必須與表單中各個(gè)name的值相對(duì)應(yīng)

再來看服務(wù)端的代碼:

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()得到請(qǐng)求中所有的參數(shù)及其對(duì)應(yīng)的值,請(qǐng)參見代碼第5行 注意:有的參數(shù)只有一個(gè)值,比如該示例中的username;有的參數(shù)會(huì)有多個(gè)值,比如該示例中的hobby獲取每個(gè)參數(shù)及其對(duì)應(yīng)的值,請(qǐng)參見代碼第7-8行反射出每個(gè)參數(shù)在實(shí)體中的setter()方法,請(qǐng)參見代碼第9-10行設(shè)置每個(gè)參數(shù)對(duì)應(yīng)的值,請(qǐng)參見代碼第11-15行

請(qǐng)求重定向與請(qǐng)求轉(zhuǎn)發(fā)的區(qū)別

我們知道:

利用response.sendRedirect()實(shí)現(xiàn)請(qǐng)求的重定向利用request.getRequestDispatcher().forward()實(shí)現(xiàn)請(qǐng)求的轉(zhuǎn)發(fā)

請(qǐng)注意它們的區(qū)別:

重定向時(shí)瀏覽器中的地址欄會(huì)發(fā)生變化,但是請(qǐng)求轉(zhuǎn)發(fā)時(shí)瀏覽器中地址欄不會(huì)發(fā)生改變。從本質(zhì)上來講:重定向是兩次不同的請(qǐng)求,而請(qǐng)求轉(zhuǎn)發(fā)只向服務(wù)端的發(fā)送了一次請(qǐng)求由服務(wù)端的內(nèi)部實(shí)現(xiàn)請(qǐng)求的跳轉(zhuǎn)。重定向可以跳轉(zhuǎn)到應(yīng)用的外部,而重定向的范圍只能是應(yīng)用的內(nèi)部請(qǐng)求轉(zhuǎn)發(fā)可利用request.setAttribute()將數(shù)據(jù)傳遞到下一個(gè)Servlet且下一個(gè)Servlet可用request.getAttribute()取出數(shù)據(jù);但是重定向不可以也沒有道理這么做。至于為什么,請(qǐng)參考第一點(diǎn)。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美一级毛片特黄黄 | 亚洲生活片 | 亚洲国产高清自拍 | 久久久中精品2020中文 | 在线日韩av电影 | 久久综合综合久久 | 国产成人aⅴ | 欧美激情天堂 | 久久9999久久 | 久久久久久久免费看 | 97久色| 精品国产91久久久久久浪潮蜜月 | 亚洲第一激情 | av免费不卡国产观看 | 欧洲色阁中文字幕 | 精品一区二区三区欧美 | 日本免费中文字幕 | 久久网综合 | 久久成人午夜视频 | 欧美激情视频一区二区免费 | 精品一区二区亚洲 | 伦一区二区三区中文字幕v亚洲 | 一级黄色影院 | www.99热精品| 久久国产28| 国产免费黄网 | 啪啪激情 | 黄色网址在线播放 | 欧美精品亚洲人成在线观看 | 中国美女一级黄色大片 | 国产亚洲精品成人a | 天天干导航 | caoporn国产一区二区 | 精品一区二区久久久久久久网精 | 91精品国产91久久久久久不卞 | 久久爽久久爽久久av东京爽 | 国产精品999在线观看 | 久久av喷吹av高潮av懂色 | 精品999久久久 | 黄网站在线免费 | 欧美精品成人一区二区在线观看 |