🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Servlet传递数据方式 ### 基本概述     Servlet传递数据的方式有很多,这里提供五种方式: 1、静态变量 2、HttpServletResponse的sendRedirect()方法 3、HttpServletRequest的getRequestDispatch()方法 4、HttpServletRequest的getSession()方法 5、HttpServletRequest的setAttribute()方法   ### 静态变量     通过建立一个数据类来进行传递。 案例: public class MyData{     public static String data; //通过使用该类来实现数据传递 }   ### HttpServletResponse的sendRedirect()方法     sendRedirect()方法是让浏览器重定向到另一个链接。其内部原理是设置状态码为303,并设置相应的Location响应头。 基本语法: response.sendRedirect("/Web应用名/资源名?uname="+username+"&pwd="+password); response.sendRedirect(“servlet的地址?参数名=参数值&参数名=参数值...”); 参照值是String , 参数名应当使用 字母组合 在接受数据的Servlet中: String 参数=request.getParameter(“参数名”);   #### 基本原理图 ![](https://box.kancloud.cn/2016-02-23_56cbf5ffafca2.jpg) PS:使用重定向不能使用PrintWrite,ServletOutputStream这样的流。因为重定向已经将消息返回给浏览器,其数据流也就没必要使用了。   ### HttpServletRequest的getRequestDispatch()方法     getRequestDispatch()方法是使WEB服务器从当前Servlet转发到当前应用下的另一个Servlet。 基本语法: request.getRequestDispatcher(资源地址).forward(request,response); 资源地址:不需要项目名。因为它只能在WEB服务器内部转发。   #### 基本原理图 ![](https://box.kancloud.cn/2016-02-23_56cbf5ffcd019.jpg) PS:getRequestDispatcher()请求转发可以一直转发下去,只要最终会处理并给服务器相应内容就行了。而且请求转发不会改变浏览器的URL,sendRedirect()会改变URL。 注意事项: 1、使用forward不能转发到该WEB应用外的URL 2、因为forward发生在文本服务器内,所以Servlet1、Servlet2等等,只要一直转发,使用的都是相同的request和response ### HttpServletRequest的getSession()方法     getSession()方法会获取一个会话,这个内容会在另一篇博客会话技术中详细说明。 基本语法: 1、放入session:request.getSession.setAttribute("loginUser",username);  2、取出session:request.getSession.getAttribute("loginUser"); PS:该方法可以传递对象 案例: 放入: User user= new User(); user.setName(“zs”); user.setPassWord(“123”); request.getSession.setAttribute("userObj",userObj);  取出: User user=(User)request.getSession.getAttribute(“userObj”);   ### HttpServletRequest的setAttribute()方法     setAttribute()方法可以设置一个键值对,该键值对在该request的有效期内都可以使用。相应的还有removeAttribute()注销键值对的方法。该方法经常和getRequestDispatch()一起使用。 基本语法: setAttribute(name, value);   PS:request的Attribute在一次请求中有效。一次请求:没有将响应消息返回给浏览器就视为一次请求。 ### 比较sendRedirect()和forward(request,response) 1、sendRedirect()重定向,forward()转发 2、实际发生的位置不一样     sendRedirect 发生在浏览器     forward 发生在web服务器 3、使用用法不一样 request.getRequestDispatcher(“/资源URI”).forward(request,response) response.sendRedirect(“/web应用/资源URI”); 4、能够去URL范围不一样 sendRedirect可以去任意URL forward 只能去当前的WEB应用的资源     ----------参考《韩顺平.细说Servlet》