2018-11-26 11:32:25 349浏览
今天扣丁学堂Java培训老师给大家介绍一下关于RequestDispatcher代表请求的派发者。它有2个动作:forward和include。客户端对于任何一个请求,可以根据业务逻辑需要,选择不同的处理办法:public interface RequestDispatcher
{
public void forward(ServletRequest request, ServletResponse response)
throws ServletException, IOException;
public void include(ServletRequest request, ServletResponse response)
throws ServletException, IOException;
}
RequestDispatcher.forward(request,response)public class User{
private String name;
private int age;
public String getName(){
return name ;
}
public void setName( String name ){
this .name = name ;
}
public int getAge() {
return age ;
}
public void setAge( int age ){
this .age = age ;
}
}
public class UsersServlet extends HttpServlet {
private static final long serialVersionUID = 1L ;
protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException , IOException {
/*****************一般实际开发这些用户数据都是从数据库查出来的*********/
List <User > users = new ArrayList <> ();
User u1 = new User () ;
u1 .setAge ( 20) ;
u1 .setName ( "Bob") ;
User u2 = new User () ;
u2 .setAge ( 21) ;
u2 .setName ( "Tony") ;
users .add ( u1) ;
users .add ( u2) ;
/*********************************************/
request .setAttribute ( "users", users) ; //对request 进制预处理准备工作
request .getRequestDispatcher ( "users.jsp").forward( request , response );//转发到users.jsp,让他去具体响应
}
}
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding ="UTF-8" trimDirectiveWhitespaces= "true"
session ="true" %>
<%@ taglib prefix= "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
< html>
<head>
<meta http-equiv = "Content-Type" content ="text/html; charset=UTF-8">
<title> 用户列表</title>
</head>
<body>
<p> -----------------转发到的资源users.jsp产生的响应数据------------------ </p>
< c:forEach var ="user" items= " ${users}" >
用户姓名:${user.name} 用户年龄:${user.age} <br />
</ c:forEach>
</body>
</html>
虽然request对象没有setParameter方法来设置参数,但是我们可以在转发的URL后通过QueryString的方式添加。JSP中的<jsp:foward>标签下的<jsp:param>标签就是使用的这个原理。
public class AimServlet extends HttpServlet {
private static final long serialVersionUID = 1L ;
protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {
request .getRequestDispatcher ( "foo.jsp?num=1") . forward( request , response );
}
}
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding ="UTF-8" trimDirectiveWhitespaces= "true"
session ="true" %>
<%@ taglib prefix= "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<! DOCTYPE html>
<html>
<head>
<meta http-equiv = "Content-Type" content ="text/html; charset=UTF-8">
<title> 标题</title>
</head>
<body>
通过forward传递过来的参num=${param.num}
</body>
</html>
这个过程实质是用一个相同的Request再请求一次被包含的资源,将被包含的资源的响应数据包含到原本的资源中去,构成它的响应数据的一部分。
public class TargetServlet extends HttpServlet {
private static final long serialVersionUID = 1L ;
protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {
response .setContentType ( "text/html;charset=utf-8" );
PrintWriter out = response .getWriter () ;
out .println ( "----------来自TargetServlet的告白----------------<br />" ) ;
out .print ( "我偷懒了,下面的响应数据并不是我自己产生的,而是包含的其它资源产生的<br/>" ) ;
request .getRequestDispatcher ( "test.jsp") . include( request , response );
out .flush () ;
out .close () ;
}
}
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding = "UTF-8" trimDirectiveWhitespaces = "true"
session = "false"
%>
<p> ------------------------来自test.jsp的告白-------------------------- </p>
<p> 我输出的响应数据将被其它的资源包含 </p>
请的URL是 <%= request.getRequestURL().toString() %> ,可以看出客户端真正请求的不是我,我只是幕后工作者。
<p> 但我很开心,因为响应给客户端的数据一部分来自于我 </p>
public class TargetServlet extends HttpServlet {
private static final long serialVersionUID = 1L ;
protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {
response .setContentType ( "text/html;charset=utf-8" );
PrintWriter out = response .getWriter () ;
out .println ( "----------来自TargetServlet的告白----------------<br />" ) ;
out .print ( "我偷懒了,下面的响应数据并不是我自己产生的,而是包含的其它资源产生的<br/>" ) ;
request .setAttribute ( "sharedatt", "I`m shared attribute") ;
request .getRequestDispatcher ( "test.jsp?sharedparam=Im-shared-parameter" ). include (request , response ) ;
out .flush () ;
out .close () ;
}
}
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding = "UTF-8" trimDirectiveWhitespaces = "true"
session = "false"
%>
<p> ------------------------来自test.jsp的告白-------------------------- </p>
<p> 我输出的响应数据将被其它的资源包含 </p>
<p> 从request中提取共享的属性Attribute : <%= request.getAttribute("s haredatt") %>
<p> 从request中提取共享的参数Parameter : <%= request.getParameter("sharedparam" ) %>
以上就是关于扣丁学堂Java培训之Servlet关于RequestDispatcher的原理详解,希望对大家的学习有所帮助,请关注扣丁学堂Java培训官网、微信等平台,扣丁学堂IT职业在线学习教育平台为您提供权威的Java视频教程供大家学习,Java培训后的前景无限,行业薪资和未来的发展会越来越好的。扣丁学堂Java技术交流群:670348138。
【关注微信公众号获取更多学习资料】