目录
3.2、建立dispitcherservlet和redirectservlet类,分别以请求转发和重定向的方式访问jsp文件
1、简介
这篇文章会简单讲一下req这个参数,因为在ServletContext那篇文章中对req的功能已经差不多都讲过了,所以这篇文章就简单讲一下req实现请求转发,而重点则是为了对比重定向和请求转发的区别。如果对于重定向有点模糊了的话建议看一下上一篇文章——resp.
2、请求转发
这里我们想要实现的功能是:在页面上填写表单,提交后后台接收打印出表单信息,并且通过请求转发将页面跳转到/success。
2.1、重建index.jsp文件
如图,将项目中原有的index.jsp文件删除,重新建一个index.jsp(,并建一个输入用户名、密码、多选框的表单。并且建一个success.jsp文件,作为请求转发的目的路径
index.jsp代码如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<div>
<form action="${pageContext.request.contextPath}/req" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="checkbox" name="hobbies" value="女孩">女孩<br>
<input type="checkbox" name="hobbies" value="代码">代码<br>
<input type="checkbox" name="hobbies" value="游戏">游戏<br>
<input type="checkbox" name="hobbies" value="直播">直播<br>
<input type="submit">
</form>
</div>
</body>
</html>
index.jsp的显示如下:
2.2、实现RequestServlet类
实现RequestServlet类,它接收表单数据并将数据在后台显示出来。并且通过请求转发将页面跳转到success.jsp页面
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = (String) req.getParameter("username");
String password = (String) req.getParameter("password");
String[] hobbies = req.getParameterValues("hobbies");
System.out.println("============================================");
System.out.println("用户名---"+username);
System.out.println("密码---"+password);
System.out.println(Arrays.toString(hobbies));
System.out.println("============================================");
req.getRequestDispatcher("/success.jsp").forward(req, resp);
}
运行结果如下(点击按钮提交后页面跳转):
2.3、小节总结
在请求转发小项目中,success.jsp我们是放在WEB-INF目录下的,请求转发的路径是"/success.jsp"。并且注意,在请求转发的时候,它的地址栏没有发送变化(没有从req变到success)
3、请求转发和重定向对比
请求转发和重定向概念上的差别很简单,比如地址栏是否变化、浏览器是否发出请求等,这些东西我就不在这里赘述。这里想做的是从代码的角度对比两者差别。
3.1、在不同的路径下建测试用的jsp文件
如图,建立inner_test.jsp和outer_test.jsp文件,使他们都在浏览器页面上输出自己所在文件路径
3.2、建立dispitcherservlet和redirectservlet类,分别以请求转发和重定向的方式访问jsp文件
public class DispitcherServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是DispitcherServlet,请求转发到inner.jsp");
req.getRequestDispatcher("/WEB-INF/inner_test.jsp").forward(req, resp);
}
}
public class DispitcherServlet02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是DispitcherServlet02,请求转发到outer.jsp");
req.getRequestDispatcher("/pages/outer_test.jsp").forward(req, resp);
}
}
public class RedirectServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是RedirectServlet01,重定向到inner");
resp.sendRedirect("request_war_exploded/WEB-INF/inner_test.jsp");
}
}
public class RedirectServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是RedirectServlet01,重定向到inner");
resp.sendRedirect("request_war_exploded/WEB-INF/inner_test.jsp");
}
}
(注册类)
3.3、通过浏览器直接访问inner和outer文件
结果如下图所示,Inner无法被直接访问到,outer可以
3.4、通过servlet类去访问inner和outer
请求转发访问inner
请求转发访问outer
重定向访问inner
重定向访问outer
3.5、重定向能做什么
在3.4小节中,我们发现在项目内部,好像请求转发可以访问到的资源,重定向却是不能访问到,这给我们一种感觉,好像有请求转发就够了,反正重定向能做访问的文件请求转发也能做,请求转发能访问到的文件重定向却不能。那,这一小节我们就来看看在有什么是重定向能访问但是请求转发不能访问的。
我们再分别实现一个dispitcher类和redirect类,让它们将网页都跳转到一个程序之外的网页(这里我用笔趣阁网页做测试)
public class RedirectServlet03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这里是RedirectServlet03,将重定向到笔趣阁网站");
resp.sendRedirect("http://www.biquge5200.net/");
}
}
public class DispitcherServlet03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是DispitcherServlet03,将请求转发到笔趣阁页面");
req.getRequestDispatcher("http://www.biquge5200.net/").forward(req, resp);
}
}
注册类及路径后,查看运行结果,如下(重定向访问成功,请求转发访问失败):
![](https://img-blog.csdnimg.cn/20210805175344997.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjY3MTcw,size_16,color_FFFFFF,t_70)
3.6、小结
从上面的测试中可以看出来:1)请求转发可以访问项目中所有可被访问的文件,请求转发不能访问本项目以外的文件。2)重定向不能访问本项目中WEB-INF文件夹下的文件,重定向可以访问本项目以外的文件。3)从浏览器地址栏直接输入访问路径可以访问非web-INF目录下的文件。
这里再说明一下请求转发和重定向路径的问题:1)因为请求转发只能访问当前项目内部文件,所以请求转发的目的路径最开始有一个"\",它就代表当前项目根目立。2)因为重定向它还能访问当前项目以外的文件,所以它只需要直接输入目的路径就好了,目的路径最开始不需要有一个"\"。
最后,附图说明请求转发和重定向的过程:
请求转发
重定向