探索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():返回客户端发出请求时的完整URL
  • getRequestURI():返回请求行中的资源名部分
  • 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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {getRequestInfo(request);getRequestHeader(request);}@Overrideprotected 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{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}@Overrideprotected 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;}@Overridepublic 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()取出数据;但是重定向不可以也没有道理这么做。至于为什么,请参考第一点。

后台(12)——Servlet(4)相关推荐

  1. flash在线拍照并上传到后台(servlet)

    一.flash在线拍照并上传到后台(servlet) 第一步:先新建一个ActionScript文件:ShiBieFunction.as 该文件的核心代码如下: =========使用摄像头获取视频流 ...

  2. JAVA后台Controller/servlet如何获取到从前端传来的参数

    JAVA后台Controller/servlet如何获取到从前端传来的参数 前言: 本次内容是对后台如何获取到前端传来的信息的总结: 1.前端传来数据的格式为form表单形式: 1.1 reqeust ...

  3. jsp form提交到后台中文乱码_2019.6.12 servlet 3.0 和 JSP

    一 . servlet 3.0 @webservlet("/***") -- 当前资源的对外访问路径 - 注解对外访问 @webFilter("/*") --- ...

  4. 1027-特色酒店后台管理系统servlet

    项目介绍 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势:对于酒店后台管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了超市,它彻底改变了过去传统的管理 ...

  5. mysql网页后台_jsp+servlet+mysql开发java web旅游网站,有后台管理系统

    项目描述 jsp+servlet开发的景点旅游网站 运行环境 jdk8+tomcat8+mysql+eclipse+maven 项目技术(必填) java servlet+mysql+jquery a ...

  6. Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之12.Servlet基础(2)

    –提交表单的方法 • get • post –Servlet 生命周期 –使用Servlet 输出HTML页面 –获得Servlet初始化参数 –页面导航 • 请求重定向 –response.send ...

  7. 后台(11)——Servlet(3)

    探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架 ...

  8. 12. Servlet 页面点击计数器

    Servlet 页面点击计数器 实现Servlet上某个页面的总点击量,使用 Servlet 来计算这些点击量是非常简单的,因为一个 Servlet 的生命周期是由它运行所在的容器控制的. 以下是实现 ...

  9. 【收藏】JavaWeb项目详解:水果库存后台管理系统(servlet+thymeleaf+mysql)

    目录 实现功能 使用开发工具和技术 开发工具 相关依赖 数据库表格设计 创建数据库 创建表格 插入数据 代码部署 获取代码 打开项目 添加Artifacts文件 设置Tomcat信息 引入依赖 运行项 ...

最新文章

  1. Java线程:线程的调度-合并
  2. bin(x) 将整数x转换为二进制字符串
  3. 为何高并发系统中都要使用消息队列
  4. string (KMP+期望DP)
  5. SVN interrupted与already-locked 解决方法
  6. Cloud一分钟 | 云厂商Zoho域名被禁两小时;京东云公布医疗健康战略
  7. java 跨类 调用 model_Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊。...
  8. Entity Framework 4.1 : 贪婪加载和延迟加载
  9. 【2016年第3期】中国电信大数据应用实践
  10. 零基础入门学习Python,我与python的第一次亲密接触后的感受
  11. Python案例:给出三角形构成方案
  12. 我的miniQuery
  13. 常用算法:问题求解与优化
  14. 超低延时的H5直播,电子游戏互动控制直播,桌面远程控制直播方案
  15. node-sass安装失败 error D:\xxx\xxx\node_modules\node-sass: Command failed.(window + mac M1 pro)
  16. 整数规划学习笔记(一)
  17. 全面解说火星人集成灶:多方面拿下第一,到底是如何做到的?
  18. 软件工程不会教不懂编程的人如何编程
  19. mysql阶梯统计_SQL技巧:利用阶梯式累加进行累计数量的计算 | 学步园
  20. 一堂如何提高代码质量的培训课

热门文章

  1. 10种机器学习算法(附Python代码)
  2. JavaScript实现“打地鼠”游戏开发(3)——锤子的显示及游戏音效的添加(基于H5+CSS3+JS+jQuery实现)
  3. 啥?Flutter也能整3D了吗?我靠,竟然是这样的操作
  4. 吃货联盟订餐系统(删除订单功能实现)
  5. 欧盟六国:启动欧盟数字身份钱包泛欧支付试点
  6. ImageNet 中的 LRN
  7. 局部响应归一化(Local Response Normalization,LRN)和批量归一化(Batch Normalization,BN)的区别
  8. arduino 无人驾驶小车_无人驾驶小车的实现也没那么复杂
  9. app的性能测试小工具monkey使用教程
  10. 企业先知的 9 大特质:绝对诚实,善于学习,公正,反教条精神,勇于展现自己和发现他人最好的一面,具有幽默感,高瞻远瞩又脚踏实地,自律,自我平衡。