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