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域)。




0 0