request作用域
request的作用域为:一次request周期,从请求到响应结束。
set/getAttribute()
如果我们需要在一个request周期内,不同的servlet之间传递一些额外信息(除原本的request对象中的信息),我们就需要使用request对象的set和getAttribute()方法来实现。
例如:在 文章7的基础上,我们想添加这样一个功能:如果登陆失败了,返回到登录页面(PageServlet)并附加“账号或密码错误”句子,要如何做呢?

第一步:我们在处理登陆的servlet中(LoginServlet),在判断为登陆失败的逻辑代码块中,加上req.setAttribute("msg","账号或密码错误");,如下:
//请求转发
req.setAttribute("msg", "账号或密码错误");
req.getRequestDispatcher("page").forward(req, resp);
return;
}
第二步:在PageServlet中,我们加上这样两句句代码:
-
String msg = (String) req.getAttribute("msg")==null?"":(String) req.getAttribute("msg");
resp.getWriter().write("<html>"); - resp.getWriter().write("<font color='red' >"+msg+"</font><br>");
完整的PageServlet代码如:
package com.xiaohei.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class PageServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//处理请求
//响应处理结果
String msg = (String) req.getAttribute("msg")==null?"":(String) req.getAttribute("msg");
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("<font color='red' >"+msg+"</font><br>");
resp.getWriter().write("用户名:<input type='text' name='uname' value=''><br>");
resp.getWriter().write("密码:<input type='text' name='pwd' value=''><br>");
resp.getWriter().write("<input type='submit' value='登录'><br>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}