JavaWeb---request
来源:互联网 发布:js下载 编辑:程序博客网 时间:2024/05/21 17:37
更多有关request的资料,可以参考:http://blog.csdn.net/methods2011/article/details/40681413这篇博文也不错。
request请求格式:request封装了客户端所有的请求数据。
请求行
请求头
空行
请求体(GET没请求体)
1,获取常用信息
--》获取客户端IP,案例:封IP。request.getRemoteAddr()
--》获取请求方式,request.getMethod(),返回值可能是GET可能是POST
2,获取HTTP请求头
--》String getHeader(String name),适用于单值头(最重要的方法)
--》int getIntHeader(String name),适用于单值int类型的请求头
--》long getDateHeader(String name),适用于单值毫秒类型的请求头
--》Enumeration<String> getHeaders(String name),适用于多值请求头
案例:
--》通过User-Agent识别用户浏览器类型
--》防盗链:如果请求不是通过本站的连接发出的,发送错误状态码404.
package com.httpstatus.test;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class RequestServletDemo extends HttpServlet {/** * 演示:获取客户端的IP地址、请求方式、获取User-Agent,得到客户端的信息(操作系统、浏览器) * * */public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();/*获取IP地址*/String addr=request.getRemoteAddr();out.print("IP地址:"+addr+"<br />");/*获取端口号*/int port=request.getServerPort();out.print("端口号:"+port+"<br />");/*获取请求方式*/String method=request.getMethod();out.print("请求方式:"+method+"<br />");/*获取User-Agent*/String agent=request.getHeader("User-Agent");out.print("User-Agent:"+agent+"<br />");if (agent.toLowerCase().contains("firefox")) {out.print("您现在用的是火狐浏览器");}else if(agent.toLowerCase().contains("chrome")){out.print("您现在用的是Chrome浏览器");}else if(agent.toLowerCase().contains("mozilla")){out.print("您现在用的是IE浏览器");} /** * 使用Referer请求头,来防盗链 * * */ String referer=request.getHeader("Referer"); System.out.println("referer:"+referer); if (referer==null || !referer.contains("localhost")) { response.sendError(404,"请求不是由本站的超链接发出的。不准你访问"); //response.sendRedirect("http://www.baidu.com"); }else{ out.println("请求是由本站的超链接发出的.<br />"); } out.flush();out.close();}}
3,获取请求URL
package com.httpstatus.test;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 获取请求URLhttp://localhost:8080/firstWeb/servlet/RequestURLServlet?name=zhangsan&sex=male > String getScheme():获取协议,http > String getServerName():获取服务器名,localhost > String getServerPort():获取服务器端口,8080 > *****String getContextPath():获取项目名,/firstWeb ------非常重要的方法。 > String getServletPath():获取Servlet路径,/AServlet > String getQueryString():获取参数部分,即问号后面的部分。username=xxx&password=yyy > String getRequestURI():获取请求URI,等于项目名+Servlet路径。/firstWeb/servlet/RequestURLServlet > String getRequestURL():获取请求URL,等于不包含参数的整个请求路径。http://localhost:8080/firstWeb/servlet/RequestURLServlet * * */public class RequestURLServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();/*获取协议*/String scheme=request.getScheme();out.print("协议:"+scheme+"<br />");/*获取服务器名*/String server=request.getServerName();out.print("服务器:"+server+"<br />");/*获取端口号*/int port=request.getServerPort();out.print("端口号:"+port+"<br />");/*获取项目名*/String projectName=request.getContextPath();out.print("项目名:"+projectName+"<br />");/*获取Servlet路径*/String path=request.getServletPath();out.print("Servlet路径:"+path+"<br />");/*获取参数部分*/String params=request.getQueryString();out.print("查询参数:"+params+"<br />");/*获取请求URI*/String uri=request.getRequestURI();out.print("URI:"+uri+"<br />");/*获取请求URL*/String url=request.getRequestURL().toString();out.print("url:"+url+"<br />");/*完整的请求地址=“URL+‘?’+查询参数”*/out.print("完整的请求地址为:"+url+"?"+params+"<br />");out.println("<a href='/firstWeb/servlet/RequestServletDemo'>跳转到RequestServletDemo</a>");out.flush();out.close();}}
4.获取请求参数:请求参数是由客户端向服务器端发送的。有可能是在请求体中(POST请求),也有可能是在URL之后(GET请求)。
--》String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数;---重要方法
--》String[] getParameterValues():获取指定名称的请求参数值,适用于多值请求参数;
--》Enumeration<String> getParameterNames():获取所有请求参数名称;
--》Map<String key,String[] value> getParameterMap():获取所有请求参数,其中Key为参数名,value为参数值。---重要方法
案例:超链接参数、表单数据
test1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'test1.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--> </head> <body> <a href="<%=path %>/servlet/GetParameterServlet?name=zhangsan&age=30">Get请求</a> <hr /> <form action="<%=path %>/servlet/GetParameterServlet" method="post"> 用户名:<input type="text" name="username" /> 密码:<input type="password" name="password"/> 爱好:<input type="checkbox" name="hobby" value="sleeping" />睡觉 <input type="checkbox" name="hobby" value="coding"/>代码 <input type="checkbox" name="hobby" value="singing"/>唱歌 <input type="submit" value="submit" /> </form> </body></html>GetParameterServlet.java
package com.httpstatus.test;import java.io.IOException;import java.io.PrintWriter;import java.util.Arrays;import java.util.Enumeration;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class GetParameterServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html");PrintWriter out = response.getWriter();String name=request.getParameter("name");int age=Integer.parseInt(request.getParameter("age"));out.println("URL中的name:"+name+"...age:"+age);out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();String username=request.getParameter("username");String password=request.getParameter("password");String[] hobbies=request.getParameterValues("hobby");out.print(request.getMethod()+"请求方式,参数值为:<br />");out.println(username+"..."+password+"..."+Arrays.toString(hobbies)+"<br />");out.print("<hr />");Enumeration e=request.getAttributeNames();while(e.hasMoreElements()){out.println(e.nextElement()+"<br />");}Map<String,String[]> map=request.getParameterMap();for(String key:map.keySet()){String[] values=map.get(key);out.println(key+"..."+Arrays.toString(values)+"<br />");}out.flush();out.close();}}
5.请求转发和请求包含
RequestDispatcher rd=request.getRequestDispatcher("/AServlet");//该方法的参数是转发到的或被包含的Servlet路径。
请求转发:rd.forward(request,response);---------重要方法
请求包含:rd.include(request,response);
有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
> 一个请求跨多个Servlet,需要使用转发和包含。(请求转发和请求包含的相同之处:一个请求,多个Servlet)
> 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体),如果留体的话有两种可能:一是没有输出响应体,二是抛出异常。
AServlet可以通过request.setAttribute("name","zhangsan");来向BServlet传输数据;
BServlet可以通过request.getAttribute("name");来获取从AServlet传来的参数值。
> 请求包含:由两个Servlet共同未完成响应体!(AServlet中响应头和响应体都留),注意BServlet中只能设置响应体。
Aservlet和BServlet不能随便将输出流关闭,要注意另外一个Servlet的响应内容是否输出。
> 无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!都在一个作用域内
/** * 请求转发 * */public class ForwardOneServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); response.setHeader("aaa", "AAA"); request.setAttribute("bbb", "BBB"); RequestDispatcher dispatcher=request.getRequestDispatcher("/servlet/ForwardTwoServlet"); dispatcher.forward(request, response); out.flush(); out.close(); }}public class ForwardTwoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); System.out.println("twoServlet"); String bbb=(String)request.getAttribute("bbb"); PrintWriter out = response.getWriter(); out.println("bbb:"+bbb+"<br />"); out.print("请求转发结果页面<br />"); out.flush(); out.close(); }}
/** * 请求包含 * */public class IncludeOneServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("utf-8");response.setHeader("aaa", "AAA");RequestDispatcher dispatcher=request.getRequestDispatcher("/servlet/IncludeTwoServlet");dispatcher.include(request, response);PrintWriter out = response.getWriter();out.println("IncludeOneServlet<br />");out.flush();out.close();}}public class IncludeTwoServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("utf-8");response.setHeader("bbb", "BBB");PrintWriter out = response.getWriter();out.println("IncludeTwoServlet<br />");}}
6.request域(Attribute)
注意:
(1)从客户端传到服务器端的参数,在服务器端(servlet)使用getParameter(String xxx)、getxxx这样的方法来获取参数值;----请求参数
(2)从一个Servlet向另一个Servlet传递值,可以通过setAttribute(name,value);另一个Servlet获取值可以通过getAttribute(name)获取。---请求域
Servlet中三大域对象:request、session、application,都有如下三个方法:
> void setAttribute(String name, Object value)
> Object getAttribute(String name)
> void removeAttribute(String name);
> 同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。
注意:
如果是重定向,那么第一次请求设置参数后,不能在第二次请求中获取,因为不是一个request,二是两次请求。
请求转发和请求包含地址栏地址不会发生改变
7.请求转发和重定向:
(1)请求转发是一次请求一次响应,发生在服务器端;重定向是两次请求,两次响应。
(2)请求转发地址栏地址不变;重定向地址栏地址会变。
(3)请求转发只能发生在同一个项目中;重定向可以发生在一个项目内或多个项目之间。
(4)请求转发效率高。因为是一次请求。
注意:如果需要地址栏地址改变那么必须使用重定向;
如果在下一个Servlet中获取request域中的参数值,那么需要使用请求转发(同一request域)。
- JavaWeb---request
- javaWeb-13-request乱码
- javaweb-servlet-request方法
- JavaWeb-Request对象
- javaWeb中的request对象
- javaweb中的request对象
- JavaWeb之Request
- JavaWeb-request和response
- Javaweb核心之request
- javaweb request转发
- javaweb开发入门-request对象
- javaweb之request常用方法
- 学习笔记,javaWeb中的Request
- JavaWeb之Request && Response篇
- 重新学javaweb---Response&Request
- javaweb之response、request对象
- JavaWeb:Request和Response总结
- Javaweb基础之response&request
- 计蒜客 判断素数
- 辅助工具
- DataCastle[交通事故成因分析竞赛]冠军——金建栋专访
- C06_C语言-变量作用域
- hdu 3595 GG and MM (Every-SG博弈+二维SG值)
- JavaWeb---request
- Maven快速创建SpringMVC web工程详解
- 时间偏移计算
- Ruby 迭代器
- javascript里的sleep()方法
- UIView的UIViewAutoresizingMark
- Excel文件导入导出实战(4)--上传下载
- 社交网络的好友推荐
- ImportError:cannot import name game