Servlet学习之转发与重定向
请求转发
问题:
服务器在接受浏览器发来的请求后,仅仅通过一个Servlet处理,会造成不同的Servlet逻辑代码冗余,Servlet功能不明确
解决:
使用请求转发(使用req.getRequestDispatcher("LoginView").forward(req, resp);)
特点:
一次请求
浏览器地址栏不改变
Request 对象作用域
问题:
使用请求转发后如何实现不同的Servlet之间进行数据共享问题?或者数据如何从一个Servlet到另一个Servlet?
解决:
使用request作用域
使用:
request.setAttribute(objectname,Objectvalue); request.getAttribute(Objectobj)
作用:
解决了一次请求内的不同 Servlet 的数据(请求数据+其他数
据)共享问题。
作用域:
基于请求转发,一次请求中,所有Servlet中数据共享
注意:
使用Request对象实现数据流转,数据只在一次请求中有效
特点:
服务器创建
每次请求都会创建
生命周期一次请求
重定向
问题:
如果当前的请求,Servlet 无法进行处理怎么办?
如果使用请求转发,造成表单数据重复提交怎么办?
解决:
使用重定向
使用:
response.sendRedirect(“路径”).
本地路径为:uri
网络路径为:定向资源的 URL 信息
特点:
两次请求
浏览器地址栏信息改变
避免表单重复提交
登录页面例子:
LoginServlet
package cn.csuft.poorguy; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/login") public class LoginServlet extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset = utf-8"); String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); LoginService ls = new LoginServiceImpl(); User u = ls.checkLogin(name, pwd); if(u==null) { req.setAttribute("str", "账号或密码错误"); req.getRequestDispatcher("LoginView").forward(req, resp); return; }else { req.setAttribute("name", name); System.out.println(name); //resp.sendRedirect("successful"); req.getRequestDispatcher("successful").forward(req, resp); return; } } }
LoginView
package cn.csuft.poorguy; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class LoginView */ @WebServlet("/LoginView") public class LoginView extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String str = (String)req.getAttribute("str"); req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset = utf-8"); resp.getWriter().write("<html>"); resp.getWriter().write("<head>"); resp.getWriter().write("</head>"); resp.getWriter().write("<body>"); resp.getWriter().write("<h1>"+str+"</h1>"); resp.getWriter().write("<form method = 'get' action = 'login'>"); resp.getWriter().write("用户名:<input type = 'text' name = 'name' value = ''/>"); resp.getWriter().write("<br/>"); resp.getWriter().write("密码:<input type = 'text' name = 'pwd' value = ''/>"); resp.getWriter().write("<br/>"); resp.getWriter().write("<input type = 'submit' value = 'login'/>"); resp.getWriter().write("</form>"); resp.getWriter().write("</body>"); resp.getWriter().write("</html>"); } }
SuccessfulServlet
package cn.csuft.poorguy; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/successful") public class SuccessfulView extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset = utf-8"); String name = (String) req.getAttribute("name"); resp.getWriter().write("<html>"); resp.getWriter().write("<head>"); resp.getWriter().write("</head>"); resp.getWriter().write("<body>"); resp.getWriter().write("<h1>欢迎 "+name+" 登录中南林业科技大学教务处</h1>"); resp.getWriter().write("<hr/>"); resp.getWriter().write("<body>"); resp.getWriter().write("</body>"); resp.getWriter().write("</html>"); } }
登陆成功结果图:
登录失败效果图: