servlet2.3规范之五——响应

本文介绍如何通过ServletResponse对象管理HTTP响应,包括缓冲区操作、设置HTTP头部信息、使用便捷方法重定向和返回错误信息、国际化设置及Response对象的生命周期。

5 响应

response对象封装所有从服务器要返回给客户端的所有信息。在HTTP协议中,这些信息从服务器传输给客户端,可以是HTTP header,也可以请求消息体。

5.1 缓冲

允许但不要求servlet容器出于效率考虑对发送给客户端的输出进行缓冲。通常进行缓冲的服务器会默认,但是允许servlet指定缓冲参数。

ServletResponse接口的下列方法允许servlet访问和设置缓冲信息:

getBufferSize

setBufferSize

isCommitted

reset

resetBuffer

flushBuffer

ServletResponse接口提供的这些方法允许执行缓冲操作,无论servlet是使用ServletOutputStream还是Writer

getBufferSize方法返回正在使用的底层缓冲大小。如果没有正在使用的缓冲,该方法必须返回int0

servlet可以使用setBufferSize方法来请求一个希望的缓冲大小。分配的缓冲不要求是servlet请求的大小,但是不能比所请求的小。这使得容器可以使用一组规定大小的缓冲,如果合适的话提供更大的缓冲。该方法必须在使用ServletOutputStreamWriter输出内容之前调用。如果已经有内容输出,该方法将抛出IllegalStateException异常。

isCommitted方法返回一布尔值,指出是否已经有响应字节返回给客户端。flushBuffer方法强制缓冲中的内容输出到客户端。

reset方法在响应未被提交时清空缓冲中的数据,并且在reset调用之前,必须同时清空由servlet设置的header和状态码。resetBuffer方法则只在响应未被提交时清空缓冲内容,而不清空header和状态码。

如果响应已提交,并且调用了resetresetBuffer方法,则必须抛出IllegalStateException异常。响应和相关缓冲不作修改。

当使用缓冲时,一旦缓冲填满,容器必须立即将缓冲内容刷新给客户端。如果这是发送给客户端的第一批数据,响应就被认为已提交。

5.2 Header

servlet可以通过HttpServletResponse接口的下列方法设置HTTP响应的header

setHeader

addHeader

setHeader方法使用指定名称和值来设置header,原header被新header所替换。如果存在该名称的一组header值,那么这些值被清空,并用新值来替换。

addHeader方法使用指定的名称向集合中添加header值。如果还没有该名称的header,则创建一组新的。

header可以包含表示int或者Date对象的数据。HttpServletResponse接口的下列便捷方法允许servlet使用对应数据类型的正确格式来设置header

setIntHeader

setDateHeader

addIntHeader

addDateHeader

要成功地传送回客户端,必须在响应提交之前设置header。在提交之后设置header会被servlet容器忽略。

servlet编程人员负责确保servlet生成内容时,response对象中正确设置了Content-Type headerHTTP 1.1规范不要求在HTTP响应中设置header。如果servlet编程人员没有设置该类型,servlet容器不可以设置默认内容类型。

5.3 便捷方法

HttpServletResponse接口提供下列便捷方法:

sendRedirect

sendError

sendRedirect方法将设置合适的header与内容体,将客户端重定向到另一个URL。使用相对URL路径调用该方法是合法的,不过底层容器必须将相对路径转换成全限定URL,返回给客户端。如果给出的是URL片段,并且因为某种原因不能转换成有效的URL,那么该方法必须抛出IllegalArgumentException异常。

sendError方法将设置合适的header与错误信息内容体,返回给客户端。可以给sendError方法提供一个可选的字符串参数,用于显示错误内容体。

如果响应还没有提交的话,这两个方法将提交响应,并且终止响应。在这些方法调用之后servlet不会再向客户端输出。如果有数据在这些方法调用之后输出到响应,那么将忽略这些数据。

如果数据已经被输出到响应缓冲,但是还没有返回给客户端(也就是响应未提交),那么响应缓冲中的数据必须被清空,用这些方法所设置的数据来替换。如果响应已提交,那么这些方法必须抛出IllegalStateException异常。

5.4 国际化

当客户端以特定语言请求一个文档,或者设置了语言偏好时,servlet将使用ServletResponse接口的setLocale方法设置响应的语言属性。该方法必须正确地设置Content-Language header(和HTTP/1.1规范描述的其他机制一样),以准确地将Locale通知给客户端。

开发人员最好是在调用ServletResponse接口的getWriter方法之前,调用setLocale方法。这将确保返回的PrintWriter已经正确地配置了目标Locale

注意如果使用一个指定内容类型的charset组件调用setContentType,将在调用setLocale之前重写该组值。

如果servlet程序员未指定,响应编码默认为“ISO-8859-1

5.5 Response对象的关闭

当响应关闭后,容器必须立即刷新客户端响应缓冲中保留的所有数据。下列事件表示servlet已经满足请求,并且响应对象将被关闭:

• servletservice方法终止。

• responsesetContentLength方法指定的内容大小已经输出到响应。

调用了sendError方法。

调用了sendRedirect方法。

5.6 Response对象的生命周期

每一个response对象只在servletservice方法作用域,或者filterdoFilter方法作用域内有效。容器通常循环response对象以避免response对象创建所引起的性能开销。开发人员必须认识到在上述的作用域之外对response对象进行引用可能会导致无法预期的后果。

本项目采用C++编程语言结合ROS框架构建了完整的双机械臂控制系统,实现了Gazebo仿真环境下的协同运动模拟,并完成了两台实体UR10工业机器人的联动控制。该毕业设计在答辩环节获得98分的优异成绩,所有程序代码均通过系统性调试验证,保证可直接部署运行。 系统架构包含三个核心模块:基于ROS通信架构的双臂协调控制器、Gazebo物理引擎下的动力学仿真环境、以及真实UR10机器人的硬件接口层。在仿真验证阶段,开发了双臂碰撞检测算法和轨迹规划模块,通过ROS控制包实现了末端执行器的同步轨迹跟踪。硬件集成方面,建立了基于TCP/IP协议的实时通信链路,解决了双机数据同步和运动指令分发等关键技术问题。 本资源适用于自动化、机械电子、人工智能等专业方向的课程实践,可作为高年级课程设计、毕业课题的重要参考案例。系统采用模块化设计理念,控制核心与硬件接口分离架构便于功能扩展,具备工程实践能力的学习者可在现有框架基础上进行二次开发,例如集成视觉感知模块或优化运动规划算法。 项目文档详细记录了环境配置流程、参数调试方法和实验验证数据,特别说明了双机协同作业时的时序同步解决方案。所有功能模块均提供完整的API接口说明,便于使用者快速理解系统架构并进行定制化修改。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值