zoukankan      html  css  js  c++  java
  • JAVA基础之HttpServletRequest请求

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

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

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

    一、HttpServletRequest:

      概述和运行流程详见HttpServletResponse!

    二、获取HTTP请求:

     三、获取请求行:

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

    getMethod()     获得String类型;

    2、获得请求的资源:

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

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

     getRequestURI() 获取URI地址String类型

     getRequestURL() 获取URL地址StringBuffer类型

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取请求方式
            String method = request.getMethod();
            System.out.println("请求方式为:" + method);
            // 获取请求URI
            String URI = request.getRequestURI();
            System.out.println("URI为" + URI);
            // 获取请求URL
            StringBuffer URL = request.getRequestURL();
            System.out.println("URL为:" + URL);
            // URI为/WEB/LineServlet
            // URL为:http://localhost:8080/WEB/LineServlet
            // 获取WEB项目名称
            String name = request.getContextPath();
            System.out.println("WEB项目名称为:" + name);
            // 获取get请求后url后的字符串
            String query = request.getQueryString();
            System.out.println("get请求的参数为:" + query);
            // 获取客户端的ip地址
            String ip = request.getRemoteAddr();
            System.out.println("ip地址为:" + ip);
        }

    四、获取请求头:

     getHeader(String name) 

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取refere头
            String refere = request.getHeader("Referer");
            String content = null;
            if(refere.startsWith("http://localhost:8080")){
                content="真的离婚了!";        
            }else{
                content="你是小偷!";
            }
            //解决乱码
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write(content);        
        }
    <%@ 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>
        <a href="/WEB/RefereServlet">宋仲基和宋慧乔分手了</a>
    </body>
    </html>

    五、获得请求体:

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

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

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //解决中文乱码问题(post请求)
    //        request.setCharacterEncoding("UTF-8");
            //获取请求参数
            //1.单个值的参数
            String name=request.getParameter("username");
            //get解决乱码:得先将获取到的信息用原来的编码表进行解码,然后再用后来的编码表进行编码
            name=new String(name.getBytes("ISO-8859-1"),"UTF=8");
            String sex=request.getParameter("sex");
            System.out.println(name+" ......"+sex);
            //2.获取多个值的
            String[] hobbys=request.getParameterValues("hobby");
            //遍历
            for(String s:hobbys){
                System.out.println(s);
            }
            //3.获取所有的请求参数MAP
            Map<String,String[]> map=request.getParameterMap();
            //遍历
            Set<String> set=map.keySet();
            for(String str:set){
                String [] value=map.get(str);
                for(String v:value){
                    System.out.println(str+"..."+v);
                }
            }        

    六、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)

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

    1、ServletContext

           创建:服务器启动

           销毁:服务器关闭

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

    2、request

          创建:访问时创建request

          销毁:响应结束request销毁

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

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

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

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

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

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

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

    public class Servlet01 extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //向request域中存值
            request.setAttribute("name", "张三" );
            //请求转发
            request.getRequestDispatcher("/Servlet02").forward(request, response);
        
            
        }
    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);
        }
  • 相关阅读:
    装饰器(十五)
    静态库与动态库
    深浅拷贝(十四)
    迭代器_iter_,生成器yeild,三元运算,列表解析(十三)
    vim
    文件操作(十二)——open,read,close,write,seek,truncate
    在启用属性的情况下启动 Confluence 6
    Confluence 6 属性的一个示例
    Confluence 6 属性的一个活动
    Confluence 6 使用页面请求属性来对慢性能进行问题解决
  • 原文地址:https://www.cnblogs.com/21-forever/p/11131113.html
Copyright © 2011-2022 走看看