树懒_移动开学笔记_day07_request_response
来源:互联网 发布:python基础教程 微盘 编辑:程序博客网 时间:2024/05/01 23:41
树懒笔记
day_07_request_response
1 Request入门 1.1 户端向服务器发送请求时,服务器会将所有的请求封装在HttpServletRequest 对象中,我们可以通过这个对象可以获取客户端一些有用的数据。 1.2 项目中我们通常用HttpServletRequest,不会用其父接口 ServetRequest,因为Web中常用的协议是HTTP2 Request对象常用API 对于POST请求,表单项不填内容,那么request.getParameter()返回""空白字符中 HTTP Status 405 -HTTP method GET is not supported bu this URL 上述错误表示:客户端以GET方式提交,但是服务器并没有对应的doGET()方式来处理 对于GET方式,请求参数是位于请求行中 对于POST方式,请求参数是位于请求体中 如果表单不写method的话,默认GET方式 如果doPost和doGet业务逻辑是一样的,就可以相互调用
getRequestURL方法返回客户端发出请求时的完整URL getRequestURI方法返回请求行中的资源名部分 getQueryString 方法返回请求行中的参数部分 getRemoteAddr方法返回发出请求的客户机的IP地址 getLocalAddr方法返回WEB服务器的IP地址 getMethod方法返回客户机请求方式 getServletPath()方法返回Servlet映射路径 request.getContextPath()方法返回当前web应用根目录
3 Request对象的应用 获取客户端请求头 getHeader(name)方法 --- String getHeaderNames方法 --- Enumeration<String> 用户注册
getParameter(name) --- String 通过name获得值 getParameterValues --- String[ ] 通过name获得多值 getParameterNames --- Enumeration<String> 获得所有name
4 表单乱码的原因和解决方案 哈-->%AB%CD%EF-->??-->doPost() 解决方案如下: 1.修改Web服务器的解码方式为UTF-8 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> 缺点:在中大型企业中,服务器工作人员和程序员是不同的职位,有着明确的分工 通常不建议修改服务器的配置,对于程序员来将,还是通过代码来解决 2. request.setCharacterEndoding("UFT-8")只能针对POST请求, 因为POST请求的数据是位于请求体中的,而GET方式的请求数据是位于请求行中的,这时只能用传统方式,代码如下: byte[] buf = username.getBytes("ISO8859-1"); username = new String(buf,"UTF-8"); 传统方式对于POST和GET都可行 BeanUtils工具类作用是封装到JavaBean对象的属性中 需要导入二个jar包:commons-beanutils-1.8.0.jar和commons-logging.jar 将String类型自己转成基本类型和对应的包装类型,即String->int或Integer没有问题5 Request域对象 Request有两层含义: 5.1 它是一个请求对象 5.2 域对象,理解为容器对象,即域对象中可以放在OBject类型的数据 域对象常用的API: setAttribute(String,Object); getAtttibute():Object removeAttribute(String):void 位于WEB-INF这个私有目录下的资源,如何访问呢? 我们只能用转发6 转发的细节 6.1.要转发必须得用RequestDispatecher.forward()方法 1.forward方法用于将请求转发到RequestDispatcher对象封装的资源。 2.如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端, forward方法将抛出IllegalStateException异常 3.如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容, 只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到 HttpServletResponse对象中的响应头字段信息保持有效。 6.2.如果向response对象中输出内容,但该内容没有真正的输出到浏览器,即还在缓存中,这时你又要 转发,这时原缓存区的内容会被清空,不会输出到浏览器,最终结果是转发到的目标资源 6.3.当真正将内容输出到浏览器后,response对象的生命已经结束, 这是你又要转发,那么response是不会恢复的,所以控制台会有错误提示 转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不变化 项目中,如果你为了节约HTTP请求数,可以考虑用转发7 Response入门 Response对象用于服务器将数据发送到客户端, HttpServletResponse对象8 Response对象常用的API response.setContentType("text/html;charset=UFT-8"); 有两层含义: 1.服务器按照UTF-8的方式编码 2.浏览器按照UTF-8的方式解码 以上只针对非英文和数字 当你想输出中文字符串时,可以采用字符或字节方式: 1.字符
response.setContextType("text/html;charset=UTF-8");//这句话有两层作用
response.getWriter().write("haha"); 2.字节 response.getOutputStream().write("哈哈".getBytes());//服务器按GB2312编码,浏览器按GB2312解码 response.getOutputStream().write("哈哈".getBytes("UTF-8"));//服务器按UTF-8编码,浏览器按GB2312解码 response.setContextType("text/html;charset=UTF-8"); //浏览器按UTF-8解码 response.getOutputStream().write("哈哈".getBytes("UTF-8"))//服务器安UTF-8编码 项目中,如果输出多媒体数据用字节,例如:图片 如果输出文字的话,用字符 如果输出字符串的话,原样输出; 如果输出数字的话,要转换成字符串,才能输出。 如果你就想输出数字的话,将数字转成字符串就可以了 attachemnt表示以下载框的方式打开文件 inline表示在浏览器中直接显示文件 9 Response对象的应用 阻止一些非法用户通过非法手段进入后台的方式之一 现在被广泛使用 在重定向情况下,第二次的request是找不到第一次request域对象中的内容 在重定向情况下,request域对象不能用了,我们servletContext域对象替代。 ServletContext域对象有如下几个特点: 1.ServletContext域对象是部署web应用时,启动服务器就创建了,即第一次访问前ServletContext就创建完了 2.tomcat中的每一个web应用,都有自己独立的ServletContext域对象 3.一个web应用的所有web资源,都共享自己所在web应用的ServletContext域对象,即Demo09A和Demo09B能共享ServletContext域对象 4.由Servlet引擎负责创建ServletContext域对象 5.当Web服务器停止或部署发布Web应用时,原ServletContext域就销毁了,注意浏览器关闭ServletContext不会销毁10 Response向浏览器输出中文乱码的原因和解决方案11 重定向的细节 一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。 response.sendRedirect(“/javaweb-day03/ok.html”) 11.1 getOutputStream和getWriter方法分别用于得到输出 二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。 11.2 getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后, 就不能再调用另一方法。 11.3 Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将 被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应体的正文,然后再与响应行和各种响应头组合后输出到客户端。 11.4 Serlvet的service/doXxx方法结束后,Servlet引擎将检查getWriter或 getOutputStream方法返回的输出流对象是否已经调用过close方法。如果没有,Servlet引擎将调用close方法关闭该输出流对象。 12 RequestDispatcher对象常用的API RequestDispatcher对象表示需要转发的路径, 但要真正转发,得用forward(),常用API:
request.getRequestDispatcher("/表示当前web应用根目录名字").forward(request,response); <form action="/表示webapps目录"> <a href="/表示webapps目录">
0 0
- 树懒_移动开学笔记_day07_request_response
- 树懒_移动开学笔记_day01_web_html
- 树懒_移动开学笔记_day03_web_JavaScript高级
- 树懒_移动开学笔记_day06_http_servlet
- 树懒_移动开学笔记_day08_cookie_session
- 树懒_移动开学笔记_day09_jsp
- 树懒_移动开学笔记_day10_jsp_el_jstl
- 树懒_移动开学笔记_day12_mysql语法
- 树懒_移动开学笔记_day13_jdbc_sql注入
- 树懒_移动开学笔记_day25_服务
- 树懒_移动开学笔记_day28_Fragment_ActionBar
- 树懒_移动开学笔记_day28_Fragment_ActionBar思路
- 树懒_移动开学笔记_day31_编程规范_安全卫士
- 树懒_移动开学笔记_day41_安全卫士_进程管理
- 树懒_移动开学笔记_day04.2_XML笔记
- 树懒_移动开学笔记__day02.1_web_css
- 树懒_移动开学笔记_day02.2_web_Javascript基础
- 树懒_移动开学笔记_day04.1_JavaScript_DOM
- Github 访问时出现Permission denied (public key)
- mse函数(均方误差函数)
- OpenGL教程翻译 第六课 平移变换
- assign、copy、retain、weak、strong的区别与联系
- 易经八卦在程序世界中的体现
- 树懒_移动开学笔记_day07_request_response
- Android 四大组件学习之Service六
- 库函数(无线视频)(7.22)
- 基于Ubuntu14.04的RK3288_PopMetal Android开发环境搭建过程小记
- Codeforces Round #312 (Div. 2) B. Amr and The Large Array
- 初创公司需不需要产品经理?
- 设计模式—生产者消费者模式
- fragment + viewpager 实现tabhost功能
- 内存实验相关分析(7.23)