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>");
	}
}

 

登陆成功结果图:

登录失败效果图:

 

 

  

  

posted @ 2019-02-11 14:53  Bug研发工程师  阅读(240)  评论(0编辑  收藏  举报