所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

JSP中request与response用法详解:常用方法、区别及实战技巧一篇讲透

JSP中request与response用法详解:常用方法、区别及实战技巧一篇讲透 一

文章目录CloseOpen

其实,这两个对象的核心逻辑一点都不复杂:request是“接收请求的信使”,负责把用户提交的数据、URL参数、请求头信息等“搬”进服务器;response是“发送响应的指挥官”,决定给用户返回什么内容、怎么跳转页面、设置什么响应头。这篇文章就把它们的常用方法拆解得清清楚楚——从request的.getParameterValues()(获取多值参数)、setAttribute()(传递数据),到response的.setContentType()(设置响应类型)、addCookie()(添加Cookie),每个方法都讲清“怎么用”和“为什么用”;更把“请求”与“响应”的本质区别点透,帮你彻底摆脱“张冠李戴”的尴尬。

最关键的是,文中结合了开发中最常遇到的实战场景——比如如何用request处理POST请求的乱码、用response实现重定向并传递参数,甚至教你避开“forward后不能再写response内容”的坑。不管你是刚入门想打基础,还是开发中总踩雷想补漏,读完这篇就能把request和response用得明明白白,再也不用对着API文档发愁。

你有没有过这样的经历?写JSP表单提交功能时,明明前端输入了用户名,后端用request.getAttribute("username")却死活拿不到值;或者用户登录成功后,想把用户信息传到主页,用response.sendRedirect()跳转后,主页根本获取不到存在request里的数据?其实这些问题的根源,都是没把request和response这两个“收发快递”的核心对象用对——今天我就把自己踩过的坑、 的技巧全告诉你,帮你彻底搞懂它们的用法。

request:从用户那“收快递”的正确姿势

request就像你在开发里的“快递代收点”——用户通过浏览器发过来的所有数据(表单内容、URL参数、请求头、Cookie),都会先“存”到request里,等着你来取。但很多新手第一次用的时候,总会搞混“取快递”的工具:比如拿表单里的单选框值用getParameter(),拿复选框值得用getParameterValues(),而getAttribute()是给服务器内部“传小纸条”用的,不是给用户数据用的。

我去年帮朋友做一个美食论坛的JSP项目时,他就犯过这个错:前端用复选框让用户选“喜欢的菜系”(比如川菜、粤菜),后端他用request.getParameter("cuisine")去拿,结果只能拿到最后一个选中的值。我告诉他得用getParameterValues(),这个方法会返回一个字符串数组,能装下所有选中的菜系——改完之后,数据立马就对了。

为了让你更清楚,我做了个表格对比这三个最常用的“取数工具”:

方法名 作用 适用场景 返回值
getParameter() 取用户提交的单值参数 表单输入框、单选框、URL参数 String(没值返回null)
getParameterValues() 取用户提交的多值参数 复选框、多选下拉框 String[](没值返回null)
getAttribute() 取服务器内部设置的属性 forward跳转传数据、过滤器传用户信息 Object(需要强转)

除了“取数据”,request还有个很重要的能力——域对象(也就是requestScope)。简单来说,你用request.setAttribute("key", value)存的数据,只能在“同一次请求”里用——比如用户登录成功后,你把用户信息存到request里,然后用request.getRequestDispatcher("/home.jsp").forward(request, response)跳转到主页,主页就能用${requestScope.userInfo}拿到信息;但如果换成response.sendRedirect("/home.jsp"),抱歉,这次请求结束了,新的请求会生成新的request对象,之前存的东西全没了。

我之前帮客户调过一个登录功能的bug:他想把用户昵称传到主页,用了response.sendRedirect()跳转,结果主页拿不到昵称。我告诉他,sendRedirect()是“客户端跳转”——相当于让浏览器重新发了一个请求,原来的request对象早就被销毁了,得换成forward或者用session存数据。改完之后,问题立马解决。

response:给用户“发快递”的精准操作

如果说request是“收快递”,那response就是“发快递”——你要给用户返回什么内容(HTML、JSON、文件)、怎么跳转页面、设置什么响应头,全靠它来控制。我见过很多新手用response时,最常犯的两个错:乱码跳转方式选错

先说说乱码问题。你是不是遇到过这样的情况:后端返回的中文变成了“??? ”?其实解决办法就一句话——先设置响应编码,再获取输出流。正确的顺序是:

  • response.setContentType("text/html;charset=UTF-8")设置响应类型和编码;
  • 再用PrintWriter out = response.getWriter()获取字符输出流。
  • 要是你先拿了输出流再设置编码,抱歉,编码已经固定了,改不了。我之前写一个新闻列表页时,就犯过这错——先拿了out对象,再设置编码,结果新闻标题全是乱码,后来调整顺序才好。

    再说说跳转。response的sendRedirect()和request的forward(),很多人分不清:

  • forward()是“服务器内部跳转”:比如你在login.jsp处理完登录,用forward跳转到home.jsp,浏览器地址栏还是login.jsp,因为跳转是服务器偷偷做的,用户看不到;而且同一次请求里的request数据能传过去。
  • sendRedirect()是“客户端跳转”:比如用户注册成功后,你用response.sendRedirect("/login.jsp"),浏览器会收到一个302状态码,然后自动跳转到login.jsp,地址栏会变成login.jsp;这时候原来的request对象已经没了,数据传不过去。
  • 那什么时候用哪个?如果需要传request数据,用forward;如果不需要传数据,或者想避免重复提交(比如POST请求后跳转),用sendRedirect。比如用户注册是POST请求,注册成功后用sendRedirect跳转到登录页,这样即使用户刷新登录页,也不会重新提交注册数据——这是我做电商项目时 的经验,能有效避免“重复注册”的bug。

    除了跳转,response还有个常用功能——发送文件。比如你要做一个“下载用户订单Excel”的功能,就得用到ServletOutputStream(字节输出流),而不是PrintWriter(字符输出流)。具体步骤是:

  • 设置响应头:response.setContentType("application/vnd.ms-excel")(告诉浏览器这是Excel文件);
  • 设置Content-Disposition头:response.setHeader("Content-Disposition", "attachment; filename=order.xlsx")(告诉浏览器以附件形式下载,文件名是order.xlsx);
  • 获取字节输出流:ServletOutputStream os = response.getOutputStream()
  • 把Excel文件的字节数据写到os里。
  • 我去年帮一个餐饮客户做过这个功能,一开始用了PrintWriter写Excel,结果下载的文件打不开——后来才知道,PrintWriter是处理字符的,会把字节数据转成字符,破坏文件结构,必须用ServletOutputStream才行。

    最后再提个小技巧:如果你想让浏览器缓存页面,可以用response.setHeader("Cache-Control", "max-age=3600")设置缓存时间(3600秒=1小时);要是不想让页面缓存(比如验证码页面),就设置response.setHeader("Cache-Control", "no-cache")——这些都是实际开发中常用的响应头设置,能优化用户体验。

    其实request和response的逻辑一点都不复杂:request负责“收”用户的请求数据,response负责“发”服务器的响应内容。你只要记住“收快递用request,发快递用response”,再结合我给的例子和技巧,基本就能避开90%的坑。

    对了,如果你按这些方法试了,或者还有没搞懂的点,欢迎在评论区告诉我——我帮你再捋捋,毕竟我也是从“拿错参数”的阶段过来的~


    本文常见问题(FAQ)

    request的getParameter()和getAttribute()有什么不一样?

    其实这俩就是“拿用户提交的”和“拿服务器自己存的”区别——getParameter()是专门拿用户从表单、URL里传过来的参数,比如你填的用户名、选的单选框值,都得用它;getAttribute()是拿服务器内部“传小纸条”的数据,比如你用request.setAttribute()存了用户信息,再用forward跳转到主页,主页就能用getAttribute()拿到。举个例子,你填了登录表单点提交,后端用getParameter(“username”)拿你输入的名字;但如果是登录成功后,把用户对象存到request里传给主页,就得用getAttribute(“user”)。

    response.sendRedirect()和request的forward()跳转有什么区别?

    核心区别是“服务器偷偷跳”还是“让浏览器重新发请求”——forward()是服务器内部跳转,比如login.jsp处理完登录,直接转到home.jsp,浏览器地址栏还是login.jsp(用户看不到跳转),而且之前存在request里的数据能跟着传过去;sendRedirect()是让浏览器收到一个“重新访问”的指令(302状态码),比如注册成功后跳转到登录页,浏览器会自动发新请求,地址栏也会变成login.jsp,这时候原来的request对象早没了,数据肯定传不过去。如果要传request里的东西就用forward,不想传或者怕重复提交(比如POST请求后)就用sendRedirect。

    用request处理POST请求时中文乱码怎么解决?

    就一句话:在获取参数之前,给request设UTF-8编码!比如你要拿表单里的中文姓名,得先写request.setCharacterEncoding(“UTF-8”),再用getParameter(“name”)拿值。要是你先拿了参数再设编码,那肯定没用——我之前就犯过这错,先拿了username再设编码,结果名字全是“??? ”,后来调整顺序才好。记住,这个设置只对POST请求有用,GET请求的乱码得改Tomcat的配置(比如server.xml里加URIEncoding=”UTF-8″)。

    表单里的复选框值怎么用request拿到?

    复选框是“多值参数”,得用request.getParameterValues()!比如你做了个“喜欢的菜系”复选框,name叫cuisine,选了川菜和粤菜,后端用String[] cuisines = request.getParameterValues(“cuisine”)就能拿到这两个值,然后遍历数组就能处理了。要是你用getParameter(),只能拿到最后一个选的值(比如只拿到粤菜),肯定不对。举个例子,遍历的时候可以写for(String c cuisines) { System.out.println(c); },就能把选的菜系都打出来。

    为什么用forward跳转后写response内容会报错?

    因为forward是“服务器内部跳转”,跳转的时候已经把response的输出流“提交”给浏览器了——就像你寄快递,快递已经发出去了,你再往里面塞东西肯定不行。比如你用request.getRequestDispatcher(“/home.jsp”).forward(request, response)跳转到主页后,再用PrintWriter out = response.getWriter()写“欢迎回来”,就会报“响应已提交”的错。记住:forward之后别再碰response的输出流,要写内容就放在forward之前。

    原文链接:https://www.mayiym.com/54748.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码