HttpServletrequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有的信息都封装在这个对象中,通过对象提供的方法,可以获得客户端请求的所有信息。
二、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 {
}
}
但是我们发现出现了编码问题,原因是我们服务端从客户端哪边获取的信息,与我们设置浏览器的解析形式不对,所以我们,需要设置浏览器获取信息的编码格式.
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 {
}
}
这里我的post和get方式提交,我的编码都是一样的,打印到控制台也是一样的,不知道为什么,之后来解决,并没有之前的使用iso8859-1来重新解析。
请求转发:
1、通过ServletContext的getRequestDispatcher()的方法来获取到RequestDispatcher对象
2、再使用RequestDispatcher()对象的forword("/index.jsp");来完成请求转发
重定向:
1、Response.sendRedirect("index.jsp");
请求转发:一个web资源收到信息之后,通知服务器去调用其它资源。一次
重定向:一个web资源收到信息之后,通知浏览器去访问其它的资源。两次
请求转发与重定向的区别:
举个例子:请求转发,你向你的同学小明借东西,但是他没有,然后你的同学小明向他的同学小亮借了你需要的东西,然后给你,在这样的过程中,你只请求了一次。
重定向:小明没有你要的东西,他说小亮有这样的东西,他让你去向小亮借东,这样你就请求了两次,这样就是重定向。
tips:我们一般借助重定向来防止表单的重复提交。