Java EE开发第十二章:2.Servlet之Request请求(请求行、头、体、转发,转发和重定向区别,中文乱码)

来源:互联网 发布:淘宝下载手机版 编辑:程序博客网 时间:2024/06/13 11:03

前言:上一篇讲述了Servlet之Response相应的相关方法,今天来看一下Request请求,请求行、请求头、请求体、请求转发、请求转发和重定向的区别,记忆中文乱码的解决

----作用------

简单的理解成获取浏览器发送过来的内容

----组成部分---

1.请求行 

2.请求头 

3.请求体

----操作请求行---

1.格式:请求方式、请求资源、协议/版本

2.常用方法:HttpServletRequest

3.掌握
String getMethod():获取请求方式
String getRemoteAddr():获取ip地址
String getContextPath() :在java中获取项目名称  (/day10) 

4.了解:
getRequestURI():获取的是 从项目名到参数之前的内容  /day10/regist
getRequestURL():获取的带协议的完整路径   http://localhost/day10/regist
String getQueryString():get请求的所有参数   username=tom&password=123
String getProtocol():获取协议和版本

5.Demo

浏览器网页:

<a href="/Day10/row?username=tom&password=123">请求行</a>
java代码(配置文件省略)
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 请求行操作 */public class RowServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取请求方式String m = request.getMethod();System.out.println("方式:" + m);// 获取请求资源String uri = request.getRequestURI();StringBuffer url = request.getRequestURL();System.out.println("uri" + uri);System.out.println("url" + url);// 获取请求参数的字符串String s = request.getQueryString();System.out.println("get请求的参数" + s);// 获取协议版本String protocol = request.getProtocol();System.out.println("协议:" + protocol);System.out.println("///////重要的////////");// 获取请求的ipString ip = request.getRemoteAddr();System.out.println("ip:" + ip);// 获取项目名字String path = request.getContextPath();System.out.println("项目路径:" + path);}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}}
-----操作请求头----

1.格式:key/value(value可以是多个值)
2.常用方法:String getHeader(String key):通过key获取指定的value (一个)
3.了解:
Enumeration getHeaders(String name) :通过key获取指定的value(多个)
Enumeration getHeaderNames() :获取所有的请求头的名称
int getIntHeader(String key):获取整型的请求头
long getDateHeader(String key):获取时间的请求头
4.重要的请求头:
user-agent:浏览器内核 msie firefox chrome
referer:页面从那里来 防盗链

5.Demo:

java代码:

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sun.org.apache.xml.internal.serializer.ElemDesc;/** * 操作请求头 */public class HeaderServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取浏览器内核String agent = request.getHeader("user-agent");System.out.println("浏览器内核:" + agent);// 获取refererString referer = request.getHeader("referer");if (referer == null) {System.out.println("直接在地址栏上输入的");} else if (referer.contains("localhost")) {System.out.println("我自己点的");} else if (referer.contains("192.168.")) {System.out.println("其他人点的");} }protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
----操作请求参数------

1.常用方法:
String getParameter(String key):获取一个值
String[] getParameterValues(String key):通过一个key获取多个值
Map<String,String[]> getParameterMap():获取所有的参数名称和值

2.demo:浏览器数据:

<a href="/Day10/param?username=tom&password=123&hobby=drink&hobby=sleep">请求参数</a>
java代码:
import java.io.IOException;import java.util.Arrays;import java.util.Map;import javax.print.DocFlavor.STRING;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 获取请求参数 */public class ParamServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取usernameString username = request.getParameter("username");System.out.println("username:" + username);String password = request.getParameter("password");System.out.println("password:" + password);// 获取爱好多个值String[] hobby = request.getParameterValues("hobby");System.out.println("hobby:" + Arrays.toString(hobby));// 获取所有System.out.println("--------------");Map<String, String[]> map = request.getParameterMap();for (String key : map.keySet()) {System.out.println(key + "::" + Arrays.toString(map.get(key)));}}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}}
------请求转发----

Demo:

Hello1.java

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class Hello1 */public class Hello2 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println(request.getParameter("username"));String pwd = (String) request.getAttribute("pwd");System.out.println(pwd);response.getWriter().print(pwd);}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
Hello2.java
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class Hello1 */public class Hello2 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println(request.getParameter("username"));String pwd = (String) request.getAttribute("pwd");System.out.println(pwd);response.getWriter().print(pwd);}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
配置文件省略。

Html:

<!DOCTYPE html><html><head><meta charset="utf-8" /><title>测试</title></head><body><form action="http://localhost:8080/Day1012/hello1" method="post"><input type="text" id="username" placeholder="请输入用户名" name="username"><input type="submit" width="100" value="提交" name="submit"> <br></form><hr></body></html>
-----请求转发和重定向区别-------

1.重定向发送两次请求,请求转发一次请求

2.重定向地址栏发生该表,请求转发不变

3.重定向是从浏览器发送,请求转发是服务器内部

4.重定向不存在request域对象,请求转发可以使用request域对象

5.重定向是response的方法,请求转发是request的方法

6.重定向可以请求站外资源,请求转发不可以

-----请求的中文乱码---

1.对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码

2.对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码

3.通用的方法:new String(参数.getBytes("iso-8859-1"),"utf-8");

4.针对于post请求来说:只需要将请求流的编码设置成utf-8即可:request.setCharacterEncoding("utf-8");

-------完-------

原创粉丝点击