请求转发
作用
实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。(servlet由服务器进行创建,由服务器进行调用)
使用
req.getRequestDispatcher(“要转发的地址”).forward(req, resp);
地址:相对路径,直接书写servlet的别名即可
特点
一次请求,浏览器地址栏信息不改变
注:
请求转发后直接return结束即可
代码实现
package com.youdian.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.youdian.pojo.User;
import com.youdian.service.LoginService;
import com.youdian.service.impl.LoginServiceImpl;
public class LoginServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式:
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname=req.getParameter("uname");
//uname=new String(uname.getBytes("iso8859-1"),"utf-8");
//使用String进行数据重新编码
String pwd=req.getParameter("pwd");
System.out.println(uname+":"+pwd);
//处理请求信息
//获取业务层对象
LoginService ls=new LoginServiceImpl();
User u=ls.checkLoginService(uname, pwd);
//检验 用户名密码是否在数据库存在
System.out.println(u);
//响应处理结果
if(u!=null){
resp.getWriter().write("登陆成功");
}else{
// resp.getWriter().write("<html>");
// resp.getWriter().write("<head>");
// resp.getWriter().write("</head>");
// resp.getWriter().write("<body>");
//
// resp.getWriter().write("<form action='login' method='get'>");
// resp.getWriter().write("用户名:<input type='text' name='uname' value='' /><br/>");
// resp.getWriter().write("密码:<input type='password' name='pwd' value='' /><br/>");
// resp.getWriter().write("<input type='submit' value='登陆' /><br/>");
//
// resp.getWriter().write("</form>");
// resp.getWriter().write("</body>");
// resp.getWriter().write("</html>");
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return ;
}
}
}
Request 对象作用域
request 的作用域
一次请求内的servlet共享;
使用请求转发后,不同的 Servlet 之间通过res对象进行数据的共享,数据从一个 servlet 流转给另外一个 Servlet
使用
request.setAttribute(objectname,Objectvalue);
request.getAttribute(Objectobj)
作用:解决了一次请求内的不同 Servlet 的数据(请求数据+其他数据)共享问题
//使用request对象实现不同servlet数据流转
req.setAttribute("str", "用户名或密码错误");
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return ;
第二次数据流转到:
//获取request作用域数据
String str=(String) req.getAttribute("str")==null?"":(String) req.getAttribute("str");
resp.getWriter().write("<font color='red' size='20px'>"+str+"</font>");
特点
- 服务器创建
- 每次请求都会创建
- 生命周期一次请求
注:
使用 Request 对象进行数据流转,数据只在一次请求内有效