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
!
需要地址转变的用重定向)