同一个web应用中各个servlet组件之间如何通讯
- 通过HttpServletRequest(或则是ServletContext)的Dispatcher对象来转发和包含请求
- 通过HttpServletResponse的sendRedirect(String location)来重定向
请求转发
请求转发图解:
请求转发代码:
package com.my.test.web;
import org.springframework.util.StringUtils;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author lf
* @Title: CheckServlet
* @Description: TODO
* @date 2019/4/2 11:42
*/
public class ServletA extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
String name = req.getParameter("name");
if(StringUtils.isEmpty(name)){
out.write("please input your name");
return;
}
out.write("this is CheckServlet before forward to showServlet");
System.out.println("before forward");
//和ServletB共享requset
req.setAttribute("msg","username is "+name);
//请求转发
RequestDispatcher requestDispatcher = getServletContext().getRequestDispatcher("/showServlet");
requestDispatcher.forward(req,resp);
//请求转发后一样会执行,只是写入out中的东西没有了
out.write("this is CheckServlet after forward to showServlet");
System.out.println("before after");
}
}
请求包含
请求包含图解:
请求包含代码:
package com.my.test.web;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author lf
* @Title: MainServlet
* @Description: TODO
* @date 2019/4/2 13:55
*/
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//包含 BodySevlet和header.html 和 footer.html
resp.setContentType("text/html");
ServletContext servletContext = getServletContext();
//获取对应的dispatcher
RequestDispatcher bodyRequestDispatcher = servletContext.getRequestDispatcher("/body");
RequestDispatcher headRequestDispatcher = servletContext.getRequestDispatcher("/html/header.html");
RequestDispatcher footRequestDispatcher = servletContext.getRequestDispatcher("/html/footer.html");
req.setAttribute("name","jack");
PrintWriter out = resp.getWriter();
out.println("<html><head></head><body>");
//请求包含
headRequestDispatcher.include(req,resp);
bodyRequestDispatcher.include(req,resp);
footRequestDispatcher.include(req,resp);
out.println("</body></html>");
}
}
请求重定向
请求重定向图解:
请求重定向代码:
package com.my.test.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author lf
* @Title: RedirectServlet
* @Description: TODO
* @date 2019/4/2 14:05
*/
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println("before redirect ");
System.out.println("before redirect");
String name = "rose";
resp.sendRedirect("/real?msg="+name);
System.out.println("after redirect");
out.println("after redirect ");
}
}