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 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 parameterNames = req.getParameterNames();
        while(parameterNames.hasMoreElements()){
            printWriter.println(parameterNames.nextElement());
        }
        String name2 = req.getParameter("name");

        printWriter.println(requestURL+"
"+ requestURI+"
"+ user+"
"+ remoteAddr+"
"+ remoteHost+"
"+ remotePort+"
"+ localAddr+"
"+ localName+"
"+ name+"
"+ name2+"
"); 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" %>


    表单提交


用户名:
密码:

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+"
"+"password="+password); /* OutputStream out=resp.getOutputStream(); out.write(userName.getBytes("utf-8"));*/ } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }

 

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

HttpServletResquest总结_第2张图片

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+"
"+"password="+password); /* OutputStream out=resp.getOutputStream(); out.write(userName.getBytes("utf-8"));*/ } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }

HttpServletResquest总结_第3张图片

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

三,请求转发与重定向。


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

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

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

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

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

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

你可能感兴趣的:(Jsp/Servlet学习总结)