servlet
- 获取请求信息 HttpServletRequest
- 请求转发
- 设置回应信息 HttpServletResponse
- 请求重定向
获取请求信息 HttpServletRequest
每次只要有请求进入 Tomcat 服务器, Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
然后传递到 service 方法( doGet 和 doPost) 中给我们使用。 我们可以通过 HttpServletRequest 对象, 获取到所有请求的信息。
常用方法
法
i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost() 获取客户端的 ip 地址
iv. getHeader() 获取请求头
v. getParameter() 获取请求的参数
vi. getParameterValues() 获取请求的参数(多个值的时候使用)
vii. getMethod() 获取请求的方式 GET 或 POST
viii. setAttribute(key, value); 设置域数据
ix. getAttribute(key); 获取域数据
x. getRequestDispatcher() 获取请求转发对象
例子:
public class HelloServlet3 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("URI =>"+request.getRequestURI());System.out.println("URL =>"+request.getRequestURL());System.out.println("ip地址 =>"+request.getRemoteHost());System.out.println("请求头=>"+request.getHeader("User-Agent"));}
}
获取请求参数
getParameter()
getParameterValues() 返回参数有多个的时候使用
表单:
<body>
<form action&#61;"http://localhost:8080/07_servlet/parameterServlet" method&#61;"get">
用户名&#xff1a; <input type&#61;"text" name&#61;"username"><br/>
密码&#xff1a; <input type&#61;"password" name&#61;"password"><br/>
兴趣爱好&#xff1a; <input type&#61;"checkbox" name&#61;"hobby" value&#61;"cpp">C&#43;&#43;
<input type&#61;"checkbox" name&#61;"hobby" value&#61;"java">Java
<input type&#61;"checkbox" name&#61;"hobby" value&#61;"js">Javascript<br/>
<input type&#61;"submit">
form>
body>
获取表单的参数&#xff1a;
public class ParameterServlet extends HttpServlet {
&#64;Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
String username &#61; req.getParameter("username");
String password &#61; req.getParameter("password");
String[] hobby &#61; req.getParameterValues("hobby");
System.out.println("用户名&#xff1a; " &#43; username);
System.out.println("密码&#xff1a; " &#43; password);
System.out.println("兴趣爱好&#xff1a; " &#43; Arrays.asList(hobby));}
}
post 请求中文乱码
post请求表单填入中文 会出现论吗问题&#xff0c;我们可以通过在doPost()方法 设置请求体的字符集为 UTF-8&#xff0c; 从而解决 post 请求的中文乱码问题
req.setCharacterEncoding("UTF-8") //必须在获取请求参数之前调用&#xff01;
&#64;Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("-------------doPost------------");
String username &#61; req.getParameter("username");
String password &#61; req.getParameter("password");
String[] hobby &#61; req.getParameterValues("hobby");
System.out.println("用户名&#xff1a; " &#43; username);
System.out.println("密码&#xff1a; " &#43; password);
System.out.println("兴趣爱好&#xff1a; " &#43; Arrays.asList(hobby));
}
请求转发
请求转发是指&#xff0c; 服务器收到请求后&#xff0c; 从一次资源跳转到另一个资源的操作叫请求转发。
可以理解为去银行办业务&#xff0c;先要去柜台1办完再去柜台2.
在柜台一做的事&#xff1a;1. 问是否带材料 2. 盖章 3. 问柜台2怎么走 4. 去柜台二
在柜台二做的事&#xff1a;1. 查看材料 2. 检查有没有柜台1的章 3. 办理自己的业务
注意请求转发必须以斜杠打头
RequestDispatcher requestDispatcher &#61; req.getRequestDispatcher("/servlet2");
Servlet1 代码&#xff1a;
public class Servlet1 extends HttpServlet {
&#64;Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
String username &#61; req.getParameter("username");
System.out.println("在 Servlet1&#xff08;柜台 1&#xff09; 中查看参数&#xff08;材料&#xff09; &#xff1a; " &#43; username);
req.setAttribute("key1","柜台 1 的章");
servlet2 代码&#xff1a;
public class Servlet2 extends HttpServlet {
&#64;Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
String username &#61; req.getParameter("username");
System.out.println("在 Servlet2&#xff08;柜台 2&#xff09; 中查看参数&#xff08;材料&#xff09; &#xff1a; " &#43; username);
Object key1 &#61; req.getAttribute("key1");
System.out.println("柜台 1 是否有章&#xff1a; " &#43; key1);
System.out.println("Servlet2 处理自己的业务 ");
}
}
base 标签
base 标签设置页面相对路径工作时参照的地址
具体做法
<html lang&#61;"zh_CN">
<head>
<meta charset&#61;"UTF-8">
<title>Titletitle>
<base href&#61;"http://localhost:8080/07_servlet/a/b/">
head>
<body>
这是 a 下的 b 下的 c.html 页面<br/>
<a href&#61;"../../index.html">跳回首页a><br/>
body>
html>
作用&#xff1a;
以请求转发 跳转页面为例
设置回应信息 HttpServletResponse
HttpServletResponse 类和 HttpServletRequest 类一样。 每次请求进来&#xff0c; Tomcat 服务器都会创建一个 Response 对象传
递给 Servlet 程序去使用。 HttpServletRequest 表示请求过来的信息&#xff0c; HttpServletResponse 表示所有响应的信息&#xff0c;
我们如果需要设置返回给客户端的信息&#xff0c; 都可以通过 HttpServletResponse 对象来进行设置
两个输入流
- 字节流 getOutputStream();
常用于下载&#xff08;传递二进制数据&#xff09; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getOutputStream();}
- 字符流 getWriter();
常用于回传字符串&#xff08;常用&#xff09; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter();}
两个流同时只能使用一个。
使用了字节流&#xff0c; 就不能再使用字符流&#xff0c; 反之亦然&#xff0c; 否则就会报错。
就是不能像这么写&#xff1a;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter();response.getOutputStream();}
往客户端回传数据
要求 &#xff1a; 往客户端回传 字符串 数据。
public class ResponseIOServlet extends HttpServlet {
&#64;Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
PrintWriter writer &#61; resp.getWriter();
writer.write("response&#39;s content!!!");
}
}
解决响应的中文乱码
为了解决响应的中文乱码
首先应该设置一下服务器字符集为UTF-8&#xff0c;然后设置浏览器也是用UTF-8字符集
方法一&#xff1a;
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Content-Type", "text/html; charset&#61;UTF-8");
方法二&#xff1a;
此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset&#61;UTF-8");
请求重定向
请求重定向&#xff0c; 是指客户端给服务器发请求&#xff0c; 然后服务器告诉客户端说。 我给你一些地址。 你去新地址访问。 叫请求
重定向&#xff08;因为之前的地址可能已经被废弃&#xff09; 。
方法一&#xff1a;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setStatus(302);
response.setHeader("Location", "http://localhost:8080");}
方法二(推荐):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.sendRedirect("http://localhost:8080");}