目录
1.HttpServletRequest类有什么作用
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把我们请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。
2.HttpServletRequest类的常用方法
getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的统一资源定位符(绝对路径)
getRemoteHost() 获取客户端的ip地址
getHeader() 获取请求头
getParameter() 获取请求的参数
getParameterValues() 获取请求参数(多个值的时候使用)
getMethod() 获取请求的方式GET或POST
setAttribute(key,value) 设置域数据
getAttribute(key) 获取域数据
getRequestDispatcher() 获取请求转发的对象
package com.atguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getRequestURI() 获取请求的资源路径
System.out.println("URI:"+req.getRequestURI());
// getRequestURL() 获取请求的统一资源定位符(绝对路径)
System.out.println("URL:"+req.getRequestURL());
// 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());
// getHeader() 获取请求头
System.out.println("请求头:"+req.getHeader("user-Agent"));
// getParameter() 获取请求的参数
// getParameterValues() 获取请求参数(多个值的时候使用)
// getMethod() 获取请求的方式GET或POST
System.out.println("请求方式:"+req.getMethod());
}
}
3.如何获取请求参数
获取参数前设置
setCharacterEncoding("UTF-8");防止中文乱码问题
package com.atguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
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.getParameter("hobby");
String[] hobbies = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("兴趣爱好:"+hobby);
System.out.println("爱好:"+ Arrays.toString(hobbies));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
//也要在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String hobby = req.getParameter("hobby");
String[] hobbies = req.getParameterValues("hobby");
System.out.println("post请求*******************");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("兴趣爱好:"+hobby);
System.out.println("爱好:"+ Arrays.toString(hobbies));
}
}
html页面form表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
兴趣爱好:
<input type="checkbox" name="hobby" value="cpp">c++
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="js">js<br/>
<input type="submit">
</form>
</body>
</html>
4.请求的转发
什么是请求的转发?
请求转发是指,服务器收到请求后,从一个资源跳到另个资源的操作叫做请求转发。
请求转发的特点:
1.浏览器的地址栏没有变化;
2. 他们是一次请求;
3. 他们共享Request域中的数据,数据一样;
4. 可以转发到WEB-INF目录下;
5. 不可以访问工程以外的资源;
5. base标签的作用
html 首页代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
这是web下的index.html <br/>
<a href="a/b/c.html">a/b/c.html</a>
<a href="http://localhost:8080/07_servlet/forwardDC">请求转发的地址</a>
</body>
</html>
跳转html页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- base标签设置页面相对路径工作时参照的地址
href 属性就是参数的地址值-->
<base href="http://localhost:8080/07_servlet/a/b/">
</head>
<body>
这是a下的b下的c.html页面<br/>
<a href="../../index.html">跳回首页</a>
</body>
</html>
请求转发的地址
package com.atguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ForwardDC extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("经过了ForwardDC程序");
req.getRequestDispatcher("/a/b/c.html").forward(req,resp);
}
}
6.Web中的相对路径和绝对路径
在javaWeb中,路径分为相对路径和绝对路径。
相对路径是:
. 表示当前目录
.. 表示上一级目录
资源名 表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资路径
7. web中 / 斜杠的不同意义
在web中 / 斜杠是一种绝对路径。
1. / 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/;
<a href="/"></a>
2. / 斜杠如果被服务器解析,得到的地址是http://ip:port/工程路径
1. <url-pattern>/forwardDC</url-pattern>
2. servletContext.getRealPath(" / " );
3. request.getRequestDispatcher(" / " );
特殊情况:
response.sendRediect(" / "); 把斜杠发送给浏览器解析。得到http://ip:port/;