Servlet中的request和response
Servlet接口中有两个对象,一个是request(请求),一个是response(响应)。request可以对浏览器发来的请求进行操作,获取请求的一些参数,response是可以对服务器发给浏览器的响应进行操作,设置响应参数。
下面先说request对象,request是由tomcat创建的,主要用于获取请求数据,request提供了获取请求数据的方法,如获取参数请求方式:getMethod(),获取请求参数getQueryString()
下面说一下获取请求参数的方法,有三个 方法,获取所有参数map集合:getParameterMap(),根据名称获取参数值(数组):getParameterValues(String name),
根据名称获取参数值(单个值):getParameter(String name)。
然后有一个问题就是中文乱码问题,就是当浏览器输入请求参数为中文时,request对象得到的参数可能是乱码。因为当在浏览器输入中文时使用的是url编码,把数据的每个字节用两个十六进制的数表示,再在每两个十六进制数也就是一个字节之间加一个%,当请求参数给到tomcat服务器时,tomcat用的ISO-8859-1解码,不是用的utf-8解码,所以会出现乱码。
解决方案和请求方式有关,当请求方式为post时,只需要设置字符输入的编码:request.setCharacterEncoding("UTF-8");
当请求方式为get时,需要先将ISO-8859-1编码(也就是之前说的乱码)编码成字节数组,再把字节数组按照utf-8的编码转场字符串,就可以还原中文了:
byte[] bytes = username.getBytes("ISO-8859-1"); username = new String(bytes,"utf-8");这个username就是中文了。
接下来就是转发问题,转发就是当浏览器发给服务器的请求时,请求给到资源A时,资源A调用forward()方法把请求转发给服务器里的资源B。其中有个request资源共享域,可以在A资源中把一些数据(以键值对形式)存入request资源域中,B资源可以调用这个共享资源域中的数据。
实例:
然后就是response对象,它也是由tomcat服务器创造,是对服务器对浏览器做出响应是参与设置参数的对象。
response中有一个重定向功能,就是当浏览器发送请求发给服务器资源A时,资源A响应给浏览器另一个资源地址,让浏览器去找它。
然后这个response主要用到 两个输出流一个是字符输出流,一个是字节输出流。
字符输出流,主要用于文本信息的响应,先设置响应数据的格式,流的编码,防止出现中文乱码:response.setContentType("text/html;charset=utf-8");
然后获得字符输出流:PrintWriter writer = response.getWriter();之后就可以用write调用write()方法,输出字符:
字节输出流:当输出,图片,视频等非文本信息时,需要用到直接输出流。字节输出流先要得到要输出的文件的字节输入流,再把这个文件输入流的字节数据复制给输出流,输出流再调用write方法输出:
byte [] buff = new byte[1024];int len =0; while((len=fis.read(buff)) !=-1){ os.write(buff,0,len);}
当然有更加简单io框架提供了流的复制功能,只不过需要把这个 框架的jar包添加到项目中,而在maven中只需要在prom.xml文件中添加这个包的依赖就行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!