HttpServletRequest类:
每次有请求进入服务器时,服务器就会把请求过来的Http协议信息解析好封装到Request对象中,然后传递到service方法中。我们可以通过HttpServletRequest对象,去获取相关信息
常用方法:
1,getRequestURI() :获取请求的资源路径
2,getRequestURL() :获取请求的统一资源定位符(绝对路径)
3,getRemoteHost() :获取客户端的ip地址
4,getHeader() :获取请求头
5,getParameter() :获取请求参数
6,getParameterValues() :获取请求参数(多个值时使用)
7,getMethod() :获取请求方式(Get,Post)
8,setAttribute() :设置域数据
9,getAttribute() :获取域数据
10,getRequestDispatcher() :获取请求转发对象
例子:
public class FourClass extends HttpServlet {
//在请求体内有中文字符时,有可能会出现乱码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求体的字符集为UTF-8,解决Post请求的中文乱码问题
request .setCharacterEncoding("UTF-8");
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1,getRequestURI() :获取请求的资源路径
System.out.println("getRequestURI:"+request.getRequestURI());
//2,getRequestURL() :获取请求的统一资源定位符(绝对路径)
System.out.println("getRequestURI:"+request.getRequestURL());
//3,getRemoteHost() :获取客户端的ip地址
System.out.println("getRemoteHost:"+request.getRemoteHost());
//4,getHeader() :获取请求头
System.out.println("getHeader:"+request.getHeader("User-Agent"));
//5,getParameter() :获取请求参数
System.out.println("getParameter Name:"+request.getParameter("name"));
//6,getParameterValues() :获取请求参数(多个值时使用)
String[] hobbies = request.getParameterValues("hobby");
System.out.println("getParameterValues:"+ Arrays.asList(hobbies));
//7,getMethod() :获取请求方式(Get,Post)
System.out.println(request.getMethod());
// request.setAttribute();
// System.out.println(request.getAttribute());
// System.out.println(request.getRequestDispatcher());
}
}
访问页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/WebDemo_war/four" method="post">
Name:<input type="text" name="name"><br/>
age:<input type="text" name="age"><br/>
hobby:<input type="checkbox" name="hobby" value="java">Java
<input type="checkbox" name="hobby" value="python">Python
<input type="checkbox" name="hobby" value="kotlin">Kotlin<br/>
<input type="submit">
</form>
</body>
</html>
请求转发
概念:服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发
请求转发特点:
- 1,浏览器地址没有变化
- 2,他们是一次请求
- 3,他们共享Request域中的数据
- 4,可以转发WEB-INF目录下
例子:
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name","Tom");
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
requestDispatcher.forward(request,response);
}
}
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getAttribute("name"));
}
}
直接访问Servlet1,然后转发访问Servlet2,如果直接访问Servlet2,name的值为null
HttpServletResponse类
每次进来Servlet,服务器都会创建一个Response对象传递给Servlet程序使用。HttpServletResponse表示所有响应的信息,如果需要设置返回给客户端的信息,都可以通过Response对象进行设置
如何响应给客户端?
通过流的方式:
字节流:
getOutputStream():常用于下载,传递二进制数据
字符流:
getWrite():常用于回传字符串
字节流和字符流只能同时使用一个(也就是说Response对象用了getWrite方法后就不能用getOutputStream方法)
例子:
public class FiveClass extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到响应字符集
System.out.println(response.getCharacterEncoding());
//设置响应头,设置服务器使用UTF-8字符集
response.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器使用UTF-8字符集
response.setHeader("Content-type","text/html;charset=UTF-8");
//它会同时设置服务器和客户端都是用UTF-8字符集,还设置响应头
// response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.println("Hello 世界");
// writer.write("Hello World");
}
}
(推荐使用)
//它会同时设置服务器和客户端都是用UTF-8字符集,还设置响应头
response.setContentType("text/html;charset=UTF-8");
相当于:
//设置响应头,设置服务器使用UTF-8字符集
response.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器使用UTF-8字符集
response.setHeader("Content-type","text/html;charset=UTF-8");
浏览器默认使用ISO-8859-1字符集,响应中文时会乱码
请求重定向
概念:指客户端给服务器发请求,然后服务器告诉客户端 一个地址,让客户端访问该地址
请求重定向特点:
- 1,浏览器地址栏会发生变化
- 2,两次请求
- 3,不共享Request域中数据
- 4,不能访问WEB-INF下的资源
- 5,可以访问工程外的资源
例子:
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("经过Servlet1");
//设置响应码302,表示重定向
response.setStatus(302);
//设置响应头,新的地址在哪里
response.setHeader("Location","http://localhost:8080/WebDemo_war/servlet2");
//response.sendRedirect("http://www.baidu.com");
}
}
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("重定向到Servlet2");
}
}
//设置响应码302,表示重定向
response.setStatus(302);
//设置响应头,新的地址在哪里
response.setHeader("Location","http://localhost:8080/WebDemo_war/servlet2");
相当于:
(推荐使用)
response.sendRedirect("http://www.baidu.com");