HttpServletRequest
类
每次只要有请求进入 Tomcat
服务器,
Tomcat
服务器就会把请求过来的
HTTP
协议信息解析好封装到
Request
对象中。 然后传递到 service
方法(
doGet
和
doPost
)中给我们使用。我们可以通过
HttpServletRequest
对象,获取到所有请求的信息。
HttpServletRequest
类的常用方法 (req.)
i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost() 获取客户端的 ip
地址
iv. getHeader() 获取请求头
表单提交时或者浏览器输入栏中的参数键值对【http://localhost:8080/07_servlet/servlet1?username=lkj123】,能够获取key对应的value。另外还有表单内元素的值[比如当你在输入框里面输入内容,那么就可以通过以下方法获取到]:
v. getParameter() 获取请求的参数
vi. getParameterValues() 获取请求的参数(多个值的时候使用)
举例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 如何获取请求参数-->
</head>
<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="get">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="js">javascript
提交:<button type="submit"></button>
</form>
</body>
</html>
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getParameter("username"));
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.asList(hobbies));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//在doPost请求中要注意当文本框中的内容为中文时,那么获取文本框中的内容时,要在所有获取请求的参数的方法上面写上
//req.setCharacterEncoding("UTF-8"); 否则会出现乱码问题
req.setCharacterEncoding("UTF-8");
System.out.println(req.getParameter("username"));
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.asList(hobbies));
}
}
vii. getMethod() 获取请求的方式 GET 或 POST
下面这些方法可以应用在请求转发中
viii. setAttribute(key, value); 设置域数据 servletContext类中也有该方法。
ix. getAttribute(key); 获取域数据 servletContext类中也有该方法。
x. getRequestDispatcher() 获取请求转发对象
请求的转发
服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
在实际开发中,可能需要多个servlet程序来完成一个业务。那么我们希望我们在客户端(浏览器),只输入一个地址就可以完成这个业务 * 但是之前我们学的servlet程序都有一个地址来对应访问他(web.xml中的<servlet-mapping>设置)。所以我们需要请求转发。一次请求, * 访问多个servlet程序 * * 那么该怎么进行请求转发呢? * 首先在直接请求的servlet1程序中要做的事: * 1.获取请求参数 * 2.盖章 * 3.去向servlet2,先问路 * 4.走到servlet2 * 在转发请求的servlet2程序中要做的事: * 1.同样是获取请求参数 * 2.检查servlet1中的章 * 3.处理自己的业务
请求转发代码示例:
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求参数
String username = req.getParameter("username");
System.out.println(username);
//2.盖章
req.setAttribute("key","servlet1的章");
//3.问路 / 对应部署后的module下的web目录,src下的内容也放在web目录下的classes文件夹下的,你要访问src写的.java程序就直接/+程序名
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//4.走到servlet2
requestDispatcher.forward(req,resp);
}
}
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求参数
String username = req.getParameter("username");
System.out.println(username);
//2.检查servlet1的章
Object key = req.getAttribute("key");
System.out.println("servlet1是否有章:"+key);
//3.处理自己的业务
System.out.println("servlet2处理自己的业务");
}
}
base 标签的作用[应用在请求转发中]:
Web 中的相对路径和绝对路径:
web
中
/
斜杠的不同意义
HttpServletResponse 类:
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息HttpServletResponse 表示所有响应的信息
* 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
*
*两个输出流的说明:
* 字节流 getOutputStream(); 常用于下载(传递二进制数据)
* 字符流 getWriter(); 常用于回传字符串(常用)
* 两个流同时只能使用一个。 使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
*
* 如何往客户端回传数据:
* PrintWriter writer = resp.getWriter();
* writer.write("response's content!!!");
*
* 响应的乱码解决:
* 方案一(不推荐使用):
* // 设置服务器字符集为 UTF-8
* resp.setCharacterEncoding("UTF-8");
* // 通过响应头,设置浏览器也使用 UTF-8 字符集
* resp.setHeader("Content-Type", "text/html; charset=UTF-8");
*
* 解决响应中文乱码方案二(推荐):
* // 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
* // 此方法一定要在获取流对象之前调用才有效
* resp.setContentType("text/html; charset=UTF-8");
*
* 请求的乱码问题:
* 只在dopost请求中会有中文乱码问题。
* 在所有获取参数的方法前加上该代码req.setCharacterEncoding("UTF-8"); 否则会出现乱码问题
请求重定向:
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求
重定向(因为之前的地址可能已经被废弃)。
* 请求重定向的特点: * 1.浏览器中的地址会发生变化 * 2.因为进行了两次请求 * 3.不共享Request域数据,因为一次是一个对象 * 4.不能访问web-inf下的资源(受保护) * 5.可以访问工程外的资源 * * 请求重定向与请求转发的区别: * 重定向,其实是两次request, 第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。 这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。 请求转发是服务器内部把对一个request/response的处理权,移交给另外一个servlet程序 对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。
public class RedictServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("本网站已废弃,返回新地址,由浏览器自动发起二次请求,前往新地址中");
//设置章,但是由于请求重定向是两次请求,而每一次请求都有一个封装http请求的对象,但是每次请求该对象不一样
//由于请求重定向是两次访问服务器,那么每次请求对象都不一样,所以我在servlet2中就得不到设置的该属性
//但是在请求转发中我们是只经过了一次请求,地址栏的地址没有发生变化,所以只有一份req对象,所以可以拿到那个章
req.setAttribute("key1","value1");
//设置请求重定向
// resp.sendRedirect("http://localhost:8080/07_servlet/servlet2");
//重定向实现访问web工程外的资源,但是web-inf下的文件不能访问
resp.sendRedirect("https://baidu.com");
}
}
public class RedictServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//是拿不到key1的值。因为不是一个req对象
System.out.println(req.getAttribute("key1"));
resp.getWriter().write("response2 result");
}
}