文章目录
前言
Request:获取请求数据
Response:设置响应数据
1 Request的继承体系
service(request,response)是由谁创建的?
- Tomcat。Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。
- 使用request对象,只需查阅Java EE API文档的HttpServletRequest接口。
2 Request获取请求数据
2.1 请求路径的划分
2.1.1请求行
2.1.2 请求头
2.1.3 请求体
Post请求方式,会将相应的参数放到请求体里面。
2.2 常见的请求方式
2.2.1 获取请求行的数据
方法名方法类型方法作用getMethodString获取请求路径的请求方式:如Get、Post****getContextPathString获取虚拟目录(资源的访问路径)getRequestURLStringBuffer获取URL(统一资源定位符)getRequestURIString获取URI(统一资源标识符)getQueryStringString获取请求参数(Get方式)
实战
访问一个这样的路径http://localhost:8080/JavaWeb_Demo_05_war/webServlet04?name=zhangsan,我们来打印一下这些方法的效果。
- http://localhost:8080:端口号
- JavaWeb_Demo_05_war:项目名
- webServlet04:Servlet名
- name=zhangsan:携带的参数、参数的值
分别对应上述五个方法
2.2.2 获取请求头的数据
方法名方法类型方法作用getHeader(String name)String根据请求头的名称,获取值
2.2.3 获取请求体的数据
方法名方法类型方法作用getInputStreamServletInputStream获取字节输入流getReaderBufferedReader获取字符输入流
字节流和字符流的区别
Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。二进制数据如图像、多媒体文件和可执行软件代码。
Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。
相应的如果传送的是图像、文件资源,需要用到字节输入流,如果是字符串只需要用到字符输入流。
使用方法注意
使用流读取数据时,分两步:
- 获取数据
- 读取数据
代码如下:
/*1、获取数据*/BufferedReader reader = request.getReader();/*2、读取数据*/String s = reader.readLine();System.out.println("获取请求体的数据:"+s);
效果
获取数据之后,直接输入,则会出现以下的效果
2.3 通用的请求方式
所谓通用的请求方式,即doGet或者doPost都用一种获取参数的方法,另外一个直接调用另一个即可。
2.3.1通用的请求方法
方法名方法类型方法作用getParameterMapMap<String, String[]>获取所有参数Map集合getParameterValues(String name)String[]根据名称获取参数值(数组)getParameterString根据名称获取参数值(单个值)
2.3.2实战演练
2.3.2.1 首先创建一个html
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><formaction="/JavaWeb_Demo_05_war/demo05"method="post"><inputtype="text"name="username"><br/><inputtype="password"name="password"><br/><inputtype="checkbox"name="hobby"value="1">抽烟
<inputtype="checkbox"name="hobby"value="2">喝酒
<inputtype="checkbox"name="hobby"value="3">烫头
<br/><inputtype="submit"></form></body></html>
2.3.2.2 创建一个Servlet相应
packagecom.you.web;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.util.Map;@WebServlet(urlPatterns ="/demo05")publicclass webServlet05 extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{/* 1、第一种方法:获取所有的参数Map集合*/Map<String,String[]> parameterMap = req.getParameterMap();for(String key : parameterMap.keySet()){System.out.print(key+":");String[] value = parameterMap.get(key);for(String s : value){System.out.print(s+" ");}System.out.println();}System.out.println("-----------------------------");/* 2、第二种:根据名称获取参数值 */String[] hobbies = req.getParameterValues("hobby");for(String hobby : hobbies){System.out.print(hobby+" ");}System.out.println();System.out.println("-----------------------------");/* 3、第三种:根据名称获取参数值*/String username = req.getParameter("username");System.out.println(username);}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{this.doGet(req,resp);}}
2.3.2.3 提交
2.3.2.4 效果
3 解决中文乱码的问题
3.1 Post的解决方式
在使用req获取数据之前,加上这一句
req.setCharacterEncoding("UTF-8");
3.2 Get的解决方式
3.2.1 Get产生中文乱码的原因
编解码采用的格式不同:
- 浏览器发送的数据采用的是UTF-8格式
- Tomcat内部解码采用的是ISO-8859-1的格式
URL编码规则
- 将字符串按照编码方式转为二进制
- 每个字节转为2个16进制数并在前面加上%
中文字符占3个字节,而且Tomcat8以后已解决了Get请求乱码的问题
4 Request请求转发
4.1 请求转发:一种服务器内部的资源跳转方式
方法名方法类型方法作用getRequestDispatcher(“要转发的资源路径”).forward(req,resp);RequestDispatcher转发的作用:从一个Servlet转到另一个ServletsetAttribute(String name, Object o)void存储到Request域中getAttribute(String name)Object根据key,获取值removeAttribute(String name)void根据key,删除该键值对
getRequestDispatcher()中,要转发的路径直接写Servlet配置的访问路径就好,不需要写’/’
4.2 请求转发的特点
- 浏览器地址栏路径不发生变化
- 只能转发当前服务器的内部资源
- 一次请求,可以在转发的资源间使用request共享数据
4.3 实战举例
demo6设置参数,并转发到demo7,demo7获取参数并输出
packagecom.you.web;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet("/demo6")publicclass webServlet06 extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{System.out.println("get.....");
req.setAttribute("hobby","girl");
req.getRequestDispatcher("demo7").forward(req,resp);}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{this.doGet(req,resp);}}
packagecom.you.web;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet("/demo7")publicclass webServlet07 extendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{Object hobby = req.getAttribute("hobby");System.out.println("获取的数据是:"+hobby);System.out.println("get7....");}@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{System.out.println("post7...");this.doGet(req,resp);}}
版权归原作者 游坦之 所有, 如有侵权,请联系我们删除。