目录
1.HttpServletRequest类的作用
2.HttpServletRequest类的常用方法
3.获取请求参数
4.doGet 请求的中文乱码解决
5.doPost 请求的中文乱码解决
6.请求的转发
7.base 标签的作用
8.Web 中的相对路径和绝对路径
9.web 中 / 斜杠的不同意义
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
getRequestURI()
|
获取请求的资源路径
|
getRequestURL()
|
获取请求的统一资源定位符(绝对路径)
|
getRemoteHost()
|
获取客户端的
ip
地址
|
getHeader()
|
获取请求头
|
getParameter()
|
获取请求的参数
|
getParameterValues()
|
获取请求的参数(多个值的时候使用)
|
getMethod()
|
获取请求的方式
GET
或
POST
|
setAttribute()
|
设置域数据
|
getAttribute()
|
获取域数据
|
getRequestDispatcher()
|
获取请求转发对象
|
代码示例:
web.xml:
RequestAPIServlet
com.study.servlet.RequestAPIServlet
RequestAPIServlet
/API
测试代码:
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// i.getRequestURI() 获取请求的资源路径
System.out.println("URI => " + req.getRequestURI());
// ii.getRequestURL() 获取请求的统一资源定位符(绝对路径)
System.out.println("URL => " + req.getRequestURL());
// iii.getRemoteHost() 获取客户端的ip地址
/**
* 在IDEA中,使用localhost访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1
* 在IDEA中,使用127.0.0.1访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1
* 在IDEA中,使用 真实ip 访问时,得到的客户端 ip 地址是 ===>>> 真实的客户端 ip 地址
*/
System.out.println("客户端 ip地址 => " + req.getRemoteHost());
// iv.getHeader() 获取请求头
System.out.println("请求头User-Agent ==>> " + req.getHeader("User-Agent"));
// vii.getMethod() 获取请求的方式GET或POST
System.out.println("请求的方式 ==>> " + req.getMethod());
}
}
结果截图:
getParameter()
|
获取请求的参数
|
getParameterValues()
|
获取请求的参数(多个值的时候使用)
|
代码示例
form.html
form
web.xml
ParameterServlet
com.study.servlet.ParameterServlet
ParameterServlet
/parameterServlet
ParameterServlet.java
public class ParameterServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户名
String username = req.getParameter("username");
//获取密码
String password = req.getParameter("password");
//兴趣爱好
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("兴趣爱好:"+ Arrays.asList(hobby));
}
}
结果展示:
String username = req.getParameter("username");
//1 先以 iso8859-1 进行编码
// 2 再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
setCharacterEncoding() :设置请求体的字符集
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求体的字符集为 UTF-8
//要在获取请求参数之前调用才有用
req.setCharacterEncoding("UTF-8");
System.out.println("----------doPost-----------");
//获取用户名
String username = req.getParameter("username");
//获取密码
String password = req.getParameter("password");
//兴趣爱好
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("兴趣爱好:"+ Arrays.asList(hobby));
}
}
请求的转发:
请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
代码示例:
web.xml
Servlet1
com.study.servlet.Servlet1
Servlet1
/servlet1
Servlet2
com.study.servlet.Servlet2
Servlet2
/servlet2
Servlet1.java
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数
String username = req.getParameter("username");
System.out.println("在 Servlet1(柜台1) 中查看请求参数(材料):"+username);
//给 材料 盖一个章,并传递到 Servlet2(柜台2)
req.setAttribute("key","Servlet1");
//请求转发(问路:Servlet2怎么走)
/**
* 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//走向Servlet2(柜台2)
requestDispatcher.forward(req,resp);
}
}
Servlet2.java
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的参数(办事的材料)查看
String username = req.getParameter("username");
System.out.println("在Servlet2(柜台2)中查看参数(材料):" + username);
// 查看 柜台1 是否有盖章
Object key1 = req.getAttribute("key");
String stamp = "Servlet1";
System.out.println("柜台1是否有章:" + stamp.equals(key1));
// 处理自己的业务
System.out.println("Servlet2 处理自己的业务 ");
}
}
结果截图:
代码示例:
Title
这是 a 下的 b 下的 c.html 页面
跳回首页
在 javaWeb 中,路径分为相对路径和绝对路径两种:
相对路径是:
. 表示当前目录
.. 表示上一级目录
资源名 表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。
1、绝对路径
2、base+相对
在 web 中 / 斜杠 是一种绝对路径。
/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/">斜杠a>
/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、<url-pattern>/servlet1url-pattern>
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);
特殊情况: response.sendRediect(“/”);
把斜杠发送给浏览器解析。得到 http://ip:port/