JAVA基础之HttpServletRequest请求

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

  怎么选择是重定向仍是转发呢?一般状况下转发更快,并且能保持request内的对象,因此他是第一选择。可是因为在转发以后,浏览器中URL仍然指向开始页面,此时若是重载当前页面,开始页面将会被从新调用。若是你不想看到这样的状况,则选择转发。详见https://www.cnblogs.com/wenanbang/p/4142415.htmljava

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

1、HttpServletRequest:浏览器

  概述和运行流程详见HttpServletResponse!服务器

2、获取HTTP请求:post

 3、获取请求行:性能

一、得到客户端的请求方式:网站

getMethod()     得到String类型;ui

二、得到请求的资源:编码

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

4、获取请求头:

 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>

5、得到请求体:

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

二、解决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);
            }
        }        

 

6、request的其余功能:

一、request 也是个域对象,也是具备如下功能:

  setAttribute(String name, Object o)

  getAttribute(String name)

  removeAttribute(String name)

二、request完成请求转发:

  得到请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)

  经过转发器对象转发

requestDispathcher.forward(ServletRequest request, ServletResponse response)

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

一、ServletContext

       建立:服务器启动

       销毁:服务器关闭

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

二、request

      建立:访问时建立request

      销毁:响应结束request销毁

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

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

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

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

三、从新定向能够访问外部网站 转发只能访问内部资源

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

(须要带数据的时候用请求转发,由第一个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);
    }
相关文章
相关标签/搜索