请求转发
问题:
服务器在接受浏览器发来的请求后,仅仅通过一个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>");
}
}
登陆成功结果图:
登录失败效果图: