JavaWeb核心之Request和Response
创始人
2024-03-15 16:06:54
0

目录

  • 概述
  • Request
    • request继承体系
    • Request获取请求数据
    • 获取请求参数的通用方式
    • Request请求转发
  • Response对象
    • Response继承体系
    • Response设置响应数据
    • Response重定向
    • Response响应字节数据
  • 最后

概述

request:获取请求数据

  • 浏览器会发送HTTP请求到后台服务器[Tomcat]
  • HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]
  • 后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中
  • 所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数
  • 获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务

response:设置响应数据

  • 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据
  • 把响应数据封装到response对象中
  • 后台服务器[Tomcat]会解析response对象,按照[响应行+响应头+响应体]格式拼接结果
  • 浏览器最终解析结果,把内容展示在浏览器给用户浏览

Request

request继承体系

  • 当我们的Servlet类实现的是Servlet接口的时候,service方法中的参数是ServletRequest和ServletResponse
  • 当我们的Servlet类继承的是HttpServlet类的时候,doGet和doPost方法中的参数就变成HttpServletRequest和HttpServletReponse

ServletRequest Java提供的请求对象根接口

HttpServletRequest Java提供的对Http协议封装的请求对象接口

RequestFacade Tomcat定义的实现类

我们将这个对象打印出来验证一下

@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(request);//org.apache.catalina.connector.RequestFacade@70d82d10//HttpServletRequest是根接口,RequestFacade是实现类}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

Request获取请求数据

HTTP请求数据总共分为三部分内容,分别是请求行、请求头、请求体。

@WebServlet(value = "/req02")
public class ServletDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求 请求数据分为请求行和请求头//请求头分为三部分:请求方式、请求资源路径和http协议//请求头是key-value形式//将请求数据解析为request,所以我们要从request中获取数据//请求方式String method = request.getMethod();System.out.println("method = " + method);//项目名String contextPath = request.getContextPath();System.out.println("contextPath = " + contextPath);//URI(项目名+资源路径)String requestURI = request.getRequestURI();System.out.println("requestURI = " + requestURI);//URL(统一资源标识符)StringBuffer requestURL = request.getRequestURL();System.out.println("requestURL = " + requestURL);//获取请求参数String queryString = request.getQueryString();System.out.println("queryString = " + queryString);//因为是key-value形式的,所以用key获取值String useragent = request.getHeader("user-agent");System.out.println("useragent = " + useragent);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求//doGet(request, response);//因为post请求的请求参数在请求体的最后一行(注意是一行)//我们要先获取流来取得参数//这个流不用自己关BufferedReader reader = request.getReader();String s = reader.readLine();System.out.println("s = " + s);}
}

获取请求参数的通用方式

上面介绍了获取请求数据的方式,但是get和Post他们的请求参数放的位置不一致,(如果是GET请求,请求参数在请求行中; 如果是POST请求,请求参数一般在请求体中)所以分开来获取,但是太过于麻烦,我们可以用通用的方式获取请求参数。

@WebServlet(value = "/req03")
public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//get和post请求只有获取请求参数有不一致的地方,所以要分开,分为doGet和doPost//为了统一doGet和doPost,有了新的获取请求参数的方式,将username=zhangsan这种形式转为key-value,值多个时,用String数组//中文乱码问题//在tomcat8之后,get请求是支持中文,但是post不支持//所以要将post的编码方式改为utf8//因为doGet和doPost要统一,所以在doGet中判断一下请求方式,如果是post则进行修改String method = request.getMethod();if("post".equalsIgnoreCase(method)){request.setCharacterEncoding("utf8");//utf8、utf-8和UTF-8是一样的}//1.获取单个值String username = request.getParameter("username");System.out.println("username = " + username);//2.获取多个值String[] values = request.getParameterValues("hobby");System.out.println(Arrays.toString(values));//3.获取所有的mapMap map = request.getParameterMap();map.forEach((key,value)->{System.out.println(key+"::"+Arrays.toString(value));});}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求System.out.println("post请求");doGet(request, response);}
}

Request请求转发

请求转发(forward):一种在服务器内部的资源跳转方式。

请求转发的特点:

浏览器地址栏路径不发生变化

只能转发服务器内部的资源,不能转发外部资源

一次请求,可以在多个资源使用request共享资源

AServlet

@WebServlet(value = "/a")
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//请求转发,只需要request就可以进行,好比说张三来向我节300块,我没有,我去向李四借,最后把借来的钱借给张三,张三并不知道我的钱是借的//请求转发的特点,浏览器地址栏路径不发生变化//只能转发服务器内部的资源,不能转发外部资源//一次请求,可以在多个资源使用request共享资源//getRequestDispatcher()中填写转发的路径(不用带"/")//forward(request,response) 将request,response这两个参数传递System.out.println("a资源");request.setAttribute("name","zhangsan");request.getRequestDispatcher("b").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}

BServlet

@WebServlet(value = "/b")
public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求System.out.println("b资源");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}

Response对象

Response继承体系

ServletResponse Java提供的请求对象根接口

HttpServletResponse Java提供的对Http协议封装的请求对象接口

ResponseFacade Tomcat定义的实现类

Response设置响应数据

响应数据分为:响应行、响应头和响应体

@WebServlet(value = "/ServletDemo4")
public class
ServletDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//response用来返回数据,结构层次:ServletResponse接口->HttpServletResponse接口->ResponseFacade实现类//设置响应行response.setStatus(404,"haha");//设置响应头//可以随意设置响应头的内容,但是不被认可,没有意义response.setHeader("ppp","666");response.setHeader("content-type","text/html");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}
@WebServlet(value = "/ServletDemo5")
public class ServletDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//设置乱码:两步:1.设置响应类型为text/html,2.设置html文本编码方式为utf8  charset=utf-8 中间用;隔开//注意设置中文一般放在第一步response.setContentType("text/html;charset=utf-8");//请求体PrintWriter writer = response.getWriter();//可以响应数据了writer.write("hellohellohello");//响应中文(出现乱码)writer.write("你好");//响应htmlwriter.write("

你好

");//响应jswriter.write("");//我们不需要关闭PrintWriter流,因为response会为我们关闭,是他调用的,所以他来关闭,谁的事情谁来干}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);} }

Response重定向

特点:

浏览器地址路径会发生变化

可以重定向到任意位置的资源(内部,外部均可)

两次请求,不能共享数据

CServlet

@WebServlet(value = "/c")
public class CServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//重定向 好比说张三微信来问我借300块,我没有,我告诉他说李四有,并给了他李四的地址//浏览器地址路径会发生变化//可以重定向到任意位置的资源(内部,外部均可)//两次请求,不能共享数据System.out.println("c资源");//sendRedirect(); ()里写资源路径,不用写"/"// 因为涉及到相对路径和绝对路径//在浏览器中: /开头是绝对路径,从localhost:端口号开始,会缺少项目访问路径//  没有”/“是相对路径,用当前路径作为参照,只会改变最后的路径名,不会缺少项目访问路径//浏览器使用时不加"/"//服务端使用时://请求转发:加不加都可以//重定向:不加"/"     为了方便,我们浏览器和服务器都不加response.sendRedirect("d");//重定向到外部//response.sendRedirect("http://www.baidu.com");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}

DServlet

@WebServlet(value = "/d")
public class DServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求System.out.println("d资源");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}

Response响应字节数据

@WebServlet(value = "/ServletDemo6")
public class ServletDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get请求//字节输出流ServletOutputStream outputStream = response.getOutputStream();InputStream inputStream = new FileInputStream("src\\main\\webapp\\imgs\\reg_bg_min.jpg");/*这一步太麻烦,我们可以导入commons-io来使用工具类byte[] bytes = new byte[1024 * 8];int len;while ((len=inputStream.read(bytes))!=-1){outputStream.write(bytes,0,len);}*///outputStream是response打开的,我们不管,我们开了inputStream,由我们来关闭//工具类IOUtils.copy(inputStream,outputStream);inputStream.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求doGet(request, response);}
}

最后

如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...