欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA基础之HttpServletRequest请求

程序员文章站 2022-05-18 15:36:46
HttpServletRequest请求是获取请求行、请求头和请求体;可以通过这个方法设置防盗链,获取地址。牢记解决乱码的方式。 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页 ......

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

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

一、httpservletrequest:

  概述和运行流程详见httpservletresponse!

二、获取http请求:

JAVA基础之HttpServletRequest请求

 三、获取请求行:

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)

  通过转发器对象转发

requestdispathcer.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);
    }