HTTP—Request & Response(小结)

Servlet体系结构:

GenericServlet(抽象类)——实现——Servlet(接口)

HttpServlet(抽象类)——继承并封装——GenericServlet(抽象类)

HttpServlet:是对HTTP协议的有一种封装,简化操作。

     1.继承HttpServlet。

     2.重写doGet/doPost方法

如图:

HTTP协议

概念:协议是服务器之间进行交互必须遵守共同的规定或规则,超文本传输协议(Hyper Text Transfer Protocol / HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。

原理:输入URL地址后,客户端(浏览器)给Web服务器发送了一个Request请求, Web服务器接到Request后进行处理,生成Response响应,然后发送给客户端(浏览器),客户端(浏览器)解析Response中的HTML;如下图所示

特点:

1. 基于TCP/IP的高级协议
2. 默认端口号:80
3. 基于请求/响应模型的:一次请求对应一次响应
4. 无状态的:每次请求之间相互独立,不能交互数据,协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。

Http协议与服务器端交互的方法:

GET:查;获取/查询资源信息

POST:改;更新资源信息

PUT:增

DELETE:删

实例理解:TCP就像物流车,用TCP来运输数据,可靠且从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等。 HTTP规定,当执行GET请求的时候,要给车上贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢(Request body)里。)

Get和Post方法的区别:

HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。HTTP只是个行为准则,GET和POST实现的基本是TCP。

1.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

2.GET参数通过URL传递,POST放在Request body中。

3.GET产生一个TCP数据包(跑一趟就把货送到了)。POST产生两个TCP数据包(得跑两趟,先和服务器打招呼,再送货)。

4.GET请求在URL中传送的参数是有长度限制的,而POST么有。

Request(请求):

概念:request是获取请求消息的

功能:

1.获取请求行

获取请求方式:GET

 String method = request.getMethod()

获取虚拟目录:/day14

String contextPath = request.getContextPath()

获取Servlet路径:/demo1

String servletPath = request.getServletPath()

获取请求URI:/day14/demo1

String requestURI = request.getRequestURI()

StringBuffer requestURL = request.getRequestURL() 获取请求的完整路径  
       :http://localhost/day14/demo1

2.获取请求头

    String getHeader(String name):通过请求头的名称获取请求头的值

    Enumeration<String> getHeaderNames():获取所有的请求头名称

3.获取请求体(只有POST请求才有请求体)

1.获取流对象步骤:

(1)字符输入流:BufferedReader br = request.getReader();

         字节输入流:ServletInputStream input= request.getInputStreainputm();

(2)再从流对象中拿数据

2.获取请求参数通用方式:get和post都可以使用下列方法来获取请求参数

(1) String getParameter(String name):根据参数名称获取参数值   

//获取用户和密码(jsp文件中的数据)
String username = request.getParameter("username")
String password = request.getParameter("password")

//封装到User实现类中
User user = new User()
user.setUsername("Username")
user.setPassword("password")

 

(2) String[] getParameterValues(String name):根据参数名称获取参数值的数组  
          例: String[] hobbies = request.getParameterValues("hobby")

(3).Enumeration<String> getParameterNames():获取所有请求的参数名称
          例:Enumeration<String> parameterNames = request.getParameterNames()

(4) Map<String,String[]> getParameterMap():获取所有参数的map集合
          例:Map<String, String[]> parameterMap = request.getParameterMap()

3.中文乱码问题:

post方式:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");

4.共享域

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

方法:(1) void setAttribute(String name,Object obj):存储数据

(2) Object getAttitude(String name):通过键获取值

(3)void removeAttribute(String name):通过键删除键值对

5.获取ServletContext(获取上下文)

1.特点:上下文环境对象:对应整个web应用的。一个web应用只能有一个ServletContext对象。

2.获取:

(1) 通过request对象获取:request.getServletContext()

(2) 通过HttpServlet获取:this.getServletContext()

3.功能:

域对象:

(1) setAttribute(String name,Object value)
(2) getAttribute(String name)
(3) removeAttribute(String name)

获取文件的真实(服务器)路径

//获取接收对象
String filename = req.getParameter("filename");

//接收对象,获取真实路径
ServletContext context = req.getServletContext();
String realPath = context.getRealPath("/img/" + filename);
System.out.println(realPath);

请求转发(forward

(1) 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
(2) 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
          如下:

Response(请求):

概念:response是设置响应消息的

功能:

1.设置响应行

(1) 格式:HTTP/1.1 200 ok
(2) 设置状态码:setStatus(int sc) 

2.设置响应头

response.setHeader(String name, String value) 

3.设置响应体

(1)字符输出流:PrintWriter out = response.getWriter();
(2)字节输出流:ServletOutputStream out = response.getOutputStream();

重定向(redirect)

设置状态码(状态码为302)

response.setStatus(302)

设置响应头

String mimeType = context.getMimeType(filename);//获取文件的Mime类型
resp.setHeader("connect-type",mimeType);//文件后缀名
resp.setHeader("connect-disposition","attachment;filename="+filename);//附件文件名

方法

response.sendRedirect("/response/responseDemo1")

重定向和转发的区别

1. 重定向使用的是sendRedirect();转发使用的是getRequestDispatcher()方法
2. 重定向地址栏发生变化;转发地址栏路径不变
3. 重定向可以访问其他站点(服务器)的资源;转发只能访问当前服务器下的资源
4.重定向是两次请求。不能使用request对象来共享数据;转发是一次请求,可以使用request对象来共享数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值