servlet 请求转发
请求转发:服务器收到请求后,从一次资源跳转到另一个服务器资源的操作。
用法实例
- 简单的综合应用,掌握Servlet将请求转发给另一个Servlet的方法。
【步骤1】创建一个名为input.html的HTML页面,其中包括一个表单,表单中包含两个文本域,分别供用户输入学号和姓名,该页面也包含提交和重置按钮。 【步骤2】 定义一个名为com.demo.Student类,其中包括学号sno和姓名name两个private的成员变量,定义访问和修改sno和name的方法。 【步骤3】编写名为FirstServlet的Servlet,要求当用户在input.html中输入信息后点击“提交”按钮,请求FirstServlet对其处理。在FirstServlet中使用表单提交的请求参数(学号和姓名)创建一个Student对象并将其作为属性存储在请求作用域中,然后通过请求对象的getRequestDispatcher()方法获得RequestDispatcher()对象,将请求转发到SecondServlet。 【步骤4】在SecondServlet中取出请求作用域中存储的Student对象,并显示输出该学生的学号和姓名,5秒钟之后,自动返回input.html页面。 【步骤1】input.html 注:input.html文件要创建于webapp 目录下,若创建在com.demo包下会报错404
<html>
<head>
<title>学生</title>
<meta http-equiv="content-type" content="texts;charset=utf-8">
</head>
<body>
<h3>学生信息</h3>
<form method="post" action="FirstServlet">
学号:<input title="text" name="sno"><br>
姓名:<input type="text" name="name"><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
【步骤2】Student类
package com.demo;
public class Student {
private String name;
private String sno;
public Student(String name, String sno) {
this.name = name;
this.sno = sno;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
}
【步骤3】FirstServlet 注意事项,讲解见代码中注释。。一定一定要开启注解支持用注解配置,或者在web.xml文件中配置。 详细可见博客https://blog.csdn.net/Mj_yong/article/details/123455180?spm=1001.2014.3001.5501.
package com.demo;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "firstServlet", urlPatterns = "/FirstServlet")
public class FirstServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
String sno = req.getParameter("sno");
Student stu = new Student(name, sno);
req.setAttribute("student", stu);
RequestDispatcher rd = req.getRequestDispatcher("/SecondServlet");
rd.forward(req,resp);
}
}
【步骤4】SecondServlet
package com.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "secondServlet", value = "/SecondServlet")
public class SecondServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Student stu = (Student) req.getAttribute("student");
resp.setContentType("text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("<title>学生信息</title>");
out.println("学号:" + stu.getSno() + "<br>");
out.println("名字:" + stu.getName() + "<br>");
resp.setHeader("Refresh", "5;url=input.html");
}
}
主要用到方法:
public void setAttribute(String name, Object o);
RequestDispatcher rd = req.getRequestDispatcher("/SecondServlet");
rd.forward(req,resp);
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=UTF-8");
resp.setContentType("application/vnd.ms-excel ;charset=UTF-8");
public void setHeader(String name, String value);
resp.setHeader("Refresh", "5;url=input.html");
请求转发与重定向区别
请求转发用到的是 forward 重定向用到的是 sendRedirect
servlet中的请求转发主要有三种方式: 1、 forward:是指转发,将当前request和response对象保存,交给指定的url处理。并没有表示页面的跳转,所以地址栏的地址不会发生改变。
RequestDispatcher rd = req.getRequestDispatcher("/SecondServlet");
rd.forward(req,resp);
2、 redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会变发生改变。
response.sendRedirect(request.getContextPath()+"/SecondServlet");
sendRedirect()方法不但可以在位于同一主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。
3、 include:意为包含,即包含url中的内容,进一步理解为,将url中的内容包含进当前的servlet当中来,并用当前servlet的request和respose来执行url中的内容处理业务.所以不会发生页面的跳转,地址栏地址不会发生改变。
RequestDispatcher rd = req.getRequestDispatcher("/SecondServlet");
rd.include(request,response);
区别总结: (1)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而 HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。 如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录 ;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录 。
(2)关于地址栏地址是否会变。联合上图,有以下理解:
- forward :Servlet1 与 Servlet2 属于同一个访问请求和响应过程,共享相同的request对象和response对象。所以地址栏地址不会变
- sendRedirect:Servlet1 与 Servlet2 使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
(3)代码执行 forward、sendRedirect 都是执行完该句之后,程序继续向下执行,因此又必要的时候应该使用return终止,其次,这之后对request的操作,对原来的request都是无效的。sendRedirect会发送一个全新的request,将不再使用原先的request。
|