HttpServletRequest类
简介
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息
常用方法
直接代码吧
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取资源路径
System.out.println(request.getRequestURI());
//获取请求的统一资源定位符(绝对路径)
System.out.println(request.getRequestURL());
//获取客户端ip地址
/*
localhost:127.0.0.1访问得到的客户端ip地址是127.0.0.1
使用真是ip地址访问得到的客户端ip地址就是真是的客户端ip地址
*/
System.out.println(request.getRemoteHost());
//获取请求头
System.out.println(request.getHeader("User-Agent"));
//请求的方式
System.out.println(request.getMethod());
}
获取请求参数
get和post乱码解决
表单代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/servlet_war/parameter" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
兴趣爱好:<input type="checkbox" name="hobby" value="c++">C++
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="c">C
<input type="submit">
</form>
</body>
</html>
servlet
package com.example.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 {
System.out.println("GET");
String username=req.getParameter("username");
String password=req.getParameter("password");
//多个值用getParameterValues方法
String[] hobby=req.getParameterValues("hobby");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.asList(hobby));
//get乱码问题
//1 先以 iso8859-1 进行编码
//2再以utf-8进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Post");
//解决post请求乱码问题,必须在获取请求参数之前调用!!!
req.setCharacterEncoding("UTF-8");
String username=req.getParameter("username");
String password=req.getParameter("password");
//多个值用getParameterValues方法
String[] hobby=req.getParameterValues("hobby");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.asList(hobby));
}
}
请求转发
请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
servlet1
package com.example.servlet;
import javax.servlet.RequestDispatcher;
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 servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数(办事的材料)查看
String username=req.getParameter("username");
System.out.println("在servlet1(柜台一)查看参数"+username);
//给材料盖章,传递到servlet2
req.setAttribute("key","柜台1的章");
//问路,到servlet2
/*
请求转发必须以斜杠打头
*/
//RequestDispatcher requestDispatcher=req.getRequestDispatcher("/servlet2");
//到web-inf
RequestDispatcher requestDispatcher=req.getRequestDispatcher("/WEB-INF/form1.html");
//走向servlet2
requestDispatcher.forward(req,resp);
}
}
package com.example.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 servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数(办事材料)
String username=req.getParameter("username");
System.out.println("在servlet1(柜台二)查看参数"+username);
//查看是否有柜台一的章
Object key1=req.getAttribute("key");
System.out.println("柜台1的章:"+key1);
//处理自己的业务
System.out.println("处理业务");
}
}
请求转发特点
1、请求地址栏不发生变化是一次请求 2、共享request域中的数据 3、可以转发到web-inf目录下 4、不可以访问工程外的位置
Base标签
设置相对路径参考哪个路径
web下的index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是web下的index.html<br/>
<a href="a/b/c.html">a/b/c.html</a>
<a href="http://localhost:8080/servlet_war/forward">请求转发</a>
</body>
</html>
web下的a/b/c.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<base href="http://localhost:8080/servlet_war/a/b/">
</head>
<body>
这是a下的b的c.html页面<br/>
<a href="../../index.html">跳回首页</a>
<!--相对路径不添加base标签,最终跳到http://localhost:8080/index.html不存在-->
</body>
</html>
路径
相对路径是:
.表示当前目录
..表示上一级目录
资源名表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
在实际开发中,
路径都使用绝对路径,而不简单的使用相对路径:
1、绝对路径
2、base+相对
/的含义
在web中/斜杠是一种绝对路径。
/斜杠如果被浏览器解析,得到的地址是:http://ip:port/
<ahref="/">斜杠</a>
/斜杠如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、<url-pattern>/servlet1</url-pattern>
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);
特殊情况:response.sendRediect(“/”);把斜杠发送给浏览器解析。得到http://ip:port/
HttpServletResponse
简介
每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置
两个输出流
乱码解决方式在代码中
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// //1.设置服务器字符集
// resp.setCharacterEncoding("UTF-8");
// //2.通过响应头,设置浏览器也是用UTF-8字符集
// resp.setHeader("Content-Type","text/html;charset=UTF-8");
//同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头,必须获取流之前有效
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer=resp.getWriter();//字符流(字符串数据)
writer.write("帅!!!");
// resp.getOutputStream();//字节流(二进制)
}
重定向
特点
浏览器地址变化 两次请求 不能共享request域的数据 不能访问WEB-INF的资源 可以访问当前工程外的资源
代码演示
response1
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("response1");
//设置响应状态码请求重定向
resp.setStatus(302);
//设置响应头,说明新的地址在哪里
resp.setHeader("location","http://localhost:8080/servlet_war/response2");
//方法二
//resp.sendRedirect("http://localhost:8080/servlet_war/response2");
}
response2
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("response2!!");
}