HttpServletResquest总结

一、HttpServletRequest介绍

    HttpServletrequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有的信息都封装在这个对象中,通过对象提供的方法,可以获得客户端请求的所有信息。

二、HttpServletRequest的常用方法

二、HttpServletRequest常用的方法:
1、获取客户机的信息;

    request.getrequestURL();返回客户端请求时的完整的URL。
    request.getrequestURI();返回请求行中的资源名部分。
    request.getQueryString();返回请求行中的参数部分。
    request.getPathInfo();

    request.getRemoteAddr();返回的发出请求的客户机的IP地址。
    request.getRemoteHost();返回客户端完整的主机名
    request.getRemotePort();返回客户端完整的端口号
    request.getLocalAddr();返回web服务器的IP地址
    request.getLocalName();返回web服务器的主机名
2、获取客户端的请求头的信息:
  
 request.getHeader(String name);根据请求头的名字获取对应的值
    request.getHeaders(String name);Enumeration;
    request.getHeaderNames();获取所有的请求头名称。
3、获取客户机请求参数(客户端提交的数据)
    
request.getParamter(String name);根据form表单中的name的属性值来获取表单信息,请求头的参数名来获取。
    request.getParamterValues(String name);根据form表单中的name的属性值来获取表单填写的信息
    是用来获取有多个相同的name值,返回的是一个数组。

package com.luther.TestWeb;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.MessageFormat;
import java.util.Enumeration;

@WebServlet("/req")
public class RequestBasics extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter printWriter=resp.getWriter();
        StringBuffer requestURL = req.getRequestURL();
        String requestURI = req.getRequestURI();
        String user = req.getRemoteUser();
        String remoteAddr = req.getRemoteAddr();
        String remoteHost = req.getRemoteHost();
        int remotePort = req.getRemotePort();
        String localAddr = req.getLocalAddr();
        String localName = req.getLocalName();
        String name = req.getHeader("name");
        Enumeration<String> name1 = req.getHeaders("name");
        while (name1.hasMoreElements()){
            String nam=name1.nextElement();
            String vlaue = req.getParameter(nam);
           printWriter.println(MessageFormat.format("{0}={1}",nam,vlaue));
        }
        Enumeration<String> parameterNames = req.getParameterNames();
        while(parameterNames.hasMoreElements()){
            printWriter.println(parameterNames.nextElement());
        }
        String name2 = req.getParameter("name");

        printWriter.println(requestURL+"<br>"+
                requestURI+"<br>"+
                user+"<br>"+
                remoteAddr+"<br>"+
                remoteHost+"<br>"+
                remotePort+"<br>"+
                localAddr+"<br>"+
                localName+"<br>"+
                name+"<br>"+
                name2+"<br>");

        printWriter.close();
    }

}

二、乱码问题:

1、jsp页面

<%--
  Created by IntelliJ IDEA.
  User: bang
  Date: 2018/10/28
  Time: 13:48
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表单提交</title>
</head>
<body>
<form action="/test" method="get">
    <table align="center">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="userName"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <th colspan="2"><input type="submit" value="提交"></th>
        </tr>
    </table>
</form>
</body>
</html>

2、servlet

package com.luther.ServletStudy;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

@WebServlet("/test")
public class Test extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


       resp.setContentType("text/html;charset=utf-8");//这里设置浏览器以什么形式解析

        String userName = req.getParameter("userName");
        String password = req.getParameter("password");
        PrintWriter out=resp.getWriter();
        out.println("username="+userName+"<br>"+"password="+password);
    /*    OutputStream out=resp.getOutputStream();
        out.write(userName.getBytes("utf-8"));*/

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

 

但是我们发现出现了编码问题,原因是我们服务端从客户端哪边获取的信息,与我们设置浏览器的解析形式不对,所以我们,需要设置浏览器获取信息的编码格式.

package com.luther.ServletStudy;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

@WebServlet("/test")
public class Test extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


       resp.setContentType("text/html;charset=utf-8");
       req.setCharacterEncoding("utf-8");//设置从客户端获取信息的编码格式
        String userName = req.getParameter("userName");
        String password = req.getParameter("password");
        PrintWriter out=resp.getWriter();
        out.println("username="+userName+"<br>"+"password="+password);
    /*    OutputStream out=resp.getOutputStream();
        out.write(userName.getBytes("utf-8"));*/

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

这里我的post和get方式提交,我的编码都是一样的,打印到控制台也是一样的,不知道为什么,之后来解决,并没有之前的使用iso8859-1来重新解析。

三,请求转发与重定向。


    请求转发:
    1、通过ServletContext的getRequestDispatcher()的方法来获取到RequestDispatcher对象
    2、再使用RequestDispatcher()对象的forword("/index.jsp");来完成请求转发
    重定向:
    1、Response.sendRedirect("index.jsp");

    请求转发:一个web资源收到信息之后,通知服务器去调用其它资源。一次
    重定向:一个web资源收到信息之后,通知浏览器去访问其它的资源。两次

请求转发与重定向的区别:

举个例子:请求转发,你向你的同学小明借东西,但是他没有,然后你的同学小明向他的同学小亮借了你需要的东西,然后给你,在这样的过程中,你只请求了一次。

重定向:小明没有你要的东西,他说小亮有这样的东西,他让你去向小亮借东,这样你就请求了两次,这样就是重定向。

tips:我们一般借助重定向来防止表单的重复提交。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值