HttpServletRequest请求

自我理解:

  HttpServletRequest请求是获取请求行、请求头和请求体;可以通过这个方法设置防盗链,获取地址。牢记解决乱码的方式。

  怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。详见https://www.cnblogs.com/wenanbang/p/4142415.html

其实也可以单纯的认为是若是带数据的话就请求转发了,若改地址的话就重定向了。

一、获取请求行:

1、获得客户端的请求方式:

getMethod()     获得String类型;

2、获得请求的资源:

getContextPath() 获得String类型的 web应用的名称(项目名)

getQueryString() 获得 get提交url 地址后的参数字符串;

 getRequestURI() 获取URI地址String类型

 getRequestURL() 获取URL地址StringBuffer类型

request.getRemoteAddr() 获得访问的客户端IP地址

package com.oracle.demo01;

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 LineServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取请求方式
		String method=request.getMethod();
		System.out.println("请求方式"+method);
		//获取请求地址
		StringBuffer url=request.getRequestURL();
		System.out.println("url"+url);
		String uri=request.getRequestURI();
		System.out.println("uri"+uri);
		//请求web应用(项目)名称
		String name=request.getContextPath();
		System.out.println("项目名"+name);
		//获取get请求参数字符串
		String query=request.getQueryString();
		System.out.println("get请求参数"+query);
		//获取客户端IP地址
		String ip=request.getLocalAddr();
		System.out.println("IP"+ip);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  

二、获取请求头:

 getHeader(String name) 

referer 头的作用:获取该访问的来源,做防盗链

package com.oracle.demo01;

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 HeaderServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取User-Agent
		String agent=request.getHeader("User-Agent");
		System.out.println(agent);
		//获取referer头
		String ref=request.getHeader("Referer");
		System.out.println(ref);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
//防盗链
package com.oracle.demo01;

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 RefererServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取referer头
		String referer=request.getHeader("Referer");
		System.out.println(referer);
		//解决响应乱码问题
		response.setContentType("text/html;charset=utf-8");
		if (referer!=null&&referer.startsWith("http://localhost")) {
			response.getWriter().write("34555");
		}else {
			response.getWriter().write("4444");
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  

三、获得请求体:

1、解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

2、解决get提交的方式的乱码:

            parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

 

package com.oracle.demo01;

import java.io.IOException;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RegisterServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决post请求乱码问题
		//request.setCharacterEncoding("utf-8");
		
		
		//获取请求体的内容
		//根据一个key 获取一个值
		String username=request.getParameter("username");
		//解决get请求乱码问题
		username=new String(username.getBytes("ISO8859-1"),"UTF-8");
		System.out.println("用户名:"+username);
		//根据一个key 获取一个数组
		String hobbys[]=request.getParameterValues("hobby");
		for (String hobby : hobbys) {
			System.out.print("爱好:"+hobby+"  ");
		}
		System.out.println();
		//获取请求参数的map集合
		Map<String, String[]> map= request.getParameterMap();
		Set<String> set=map.keySet();
		for (String s : set) {
			String values[]=map.get(s);
			System.out.print(s+":");
			for (String v: values) {
				System.out.print(v+" ");
			}
			System.out.println();
		}
		
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
 <form action="/WEB05/RegisterServlet" method="get">
  用户名:<input type="text" name="username"><br>
  密码:<input type="password" name="pwd"><br>
  性别:男<input type="radio" name="sex" value="man">
  女<input type="radio" name="sex" value="woman"><br>
  爱好:足球<input type="checkbox" name="hobby" value="zq">
   篮球<input type="checkbox" name="hobby" value="lq">
   排球<input type="checkbox" name="hobby" value="pq">
   <br>
  <input type="submit" value="注册">
 </form>
</body>
</html>

 

 

 

四、request的其他功能:

1、request 也是个域对象,也是具有以下功能:

  setAttribute(String name, Object o)

  getAttribute(String name)

  removeAttribute(String name)

2、request完成请求转发:

  获得请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)

  通过转发器对象转发

requestDispathcher.forward(ServletRequest request, ServletResponse response)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
	<form action="/WEB05/RegisterServlet" method="get">
		用户名:<input type="text" name="username"><br>
		密码:<input type="password" name="pwd"><br>
		性别:男<input type="radio" name="sex" value="man">
		女<input type="radio" name="sex" value="woman"><br>
		爱好:足球<input type="checkbox" name="hobby" value="zq">
			篮球<input type="checkbox" name="hobby" value="lq">
			排球<input type="checkbox" name="hobby" value="pq">
			<br>
		<input type="submit" value="注册">
	</form>
</body>
</html>
package com.oracle.demo01;

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 Servlet02 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//从request雨中取值
		String name=(String) request.getAttribute("name");
		//解决响应乱码
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("hello"+name);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  

五、ServletContext域与Request域的生命周期比较

1、ServletContext

       创建:服务器启动

       销毁:服务器关闭

       域的作用范围:整个web应用

2、request

      创建:访问时创建request

      销毁:响应结束request销毁

      域的作用范围:一次请求中

八、转发和重定向的区别:

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

2、重定向地址栏的地址变化,转发地址不变

3、重新定向可以访问外部网站 转发只能访问内部资源

4、转发的性能要优于重定向

需要带数据的时候用请求转发,由第一个Servlet01带数据到Servlet02需要地址转变的用重定向)

 

 

 

 

 

 

 

posted @ 2020-02-26 13:32  xiren88  阅读(216)  评论(0编辑  收藏  举报