request&response 柔光的暖阳◎ 2023-10-04 19:37 53阅读 0赞 ## 一、request ## Request对象: 请求对象, 父接口: ServletRequest Servlet继承HttpServlet, 得到请求对象: 子类对象: HttpServletRequest对象 HttpServletRequest 是ServletRequest 子接口 #### request的方法 #### > 1. 请求头 > 2. 请求参数 重点 > 3. 域对象功能 重点 > 4. 请求转发 重点 > 5. 其他方法, 获取客户端信息, url相关的信息... #### 域对象功能 request域 #### > 在同一次请求内有效 #### 获取请求头的方法 #### request与请求头相关的方法有: * String getHeader(String name):获取指定名称的请求头; * Enumeration getHeaderNames():获取所有请求头名称; * int getIntHeader(String name):获取值为int类型的请求头。 #### 其他方法 #### * int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1; * String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码; * String getMethod():返回请求方法,例如:GET * Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用; * String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码; * `void setCharacterEncoding(String code)`:设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效! **重点** * `String getContextPath()`:返回上下文路径,例如:/hello * `String getQueryString()`:返回请求URL中的参数,例如:name=zhangSan * String getRequestURI():返回请求URI路径,例如:/hello/oneServlet * StringBuffer getRequestURL():返回请求URL路径,例如:[http://localhost/hello/oneServlet][http_localhost_hello_oneServlet],即返回除了参数以外的路径信息; * String getServletPath():返回Servlet路径,例如:/oneServlet * String getRemoteAddr():返回当前客户端的IP地址; * String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址; * String getScheme():返回请求协议,例如:http; * String getServerName():返回主机名,例如:localhost * int getServerPort():返回服务器端口号,例如:8080 #### 请求转发 #### 动态资源(Servlet) 跳转到其他资源(Servlet, html, jsp...) * 请求转发 * ![5505ff3462b5429798b5ecfd54ddf150.png][] > 代码: > > request对象的方法: > > 1. RequestDispatcher getRequestDispatcher(String path) 得到转发器对象 > 2. 调用RequestDispatcher的forward(request,response) > > RequestDispatcher.forward(request,response); > > 1与2合并: > > request.getRequestDispatcher(String path).forward(request,response); > 特点: > > 1. 一次请求 > 2. 客户端的url不会变 > 3. 服务器端的转发, 只能转发到服务器内部资源 > > > request域 请求转发中使用 * 重定向![cf955eb0c94849969274a59061e155e0.png][] ## 二、response ## ### 获取请求参数 ### * String getParamter(String name) 获取一个请求参数名对应一个值 > 第一种情况: 前端传递请求参数名, 并且传递值 > > 结果: 传递值 > > 第二种情况: 前端传递请求参数名,没有传递值 username=&email=111 > > 结果: "" > > 第三种情况: 前端没有传递请求参数名 > > 结果: null String\[\] getParameterValues(String name) 一个请求参数名对应多个值 Map<String,String\[\]> getParameterMap() 获取所有的请求参数, 得到一个map集合 一般结合第三方jar, 把map转换为java对象 浏览器缓存问题: 修改页面, 访问的时候,页面没有改, 浏览器缓存问题 chrome: ctrl + F5 底层刷新 idea 修改html/jsp, 不想重启服务器, 让服务器热更新 ### 页面的路径使用绝对路径 ### <!--路径: 1. 相对路径 从当前url的开始 不推荐 http://localhost:8080/user/AServlet 转发到 demo.html <link href="./bootsrap/css/bootstrap.css"/> 找: http://localhost:8080/user/bootsrap/css/bootstrap.css 404 2.绝对路径 项目的根目录开始 从/发布的项目名开始 推荐 /bootstrap/css/bootstrap.css 现在url: http://localhost:8080/user/AServlet http://localhost:8080/bootstrap/css/bootstrap.css --> ### Response对象 响应对象 ### > 1. 设置响应头 > 2. 发送状态码 > 3. 设置响应正文: 得到响应输出流,输出 重要 > 4. 重定向 重要 #### 设置响应头 #### * void setIntHeader(String name, int value) 设置响应头, 响应头的值int类型 * void addIntHeader(String name, int value) * void addHeader(String name,String value) 设置响应头, 响应头的值String * void setHeader(String name,String value) * void setContentType(String )设置content-type的响应头 > 重要的响应头: > > content-type: "text/html;charset=UTF-8": > > > 告诉浏览器, 服务器响应的内容类型 ,浏览器根据内容类型进行解析 > > > > charset: 对文本文件有效 > > > > text/html: 响应html文本 > > > > 图片: 二进制文件 > > > > * image/gif:gif图片格式 > > * image/jped:jpg图片格式 > > * image/png:png图片格式 > > > > css: > > > > text/css > > > > js: > > > > text/javascript > > > > json: > > > > application/json > > > > setHearder() > > cookie: cookie技术 #### 发送状态码 了解 #### * response.setStatus(200):设置状态码; * response.sendError(404, “您要查找的资源不存在”):当发送错误状态码时,Tomcat会跳转到固定的错误页面去,但可以显示错误信息。 > 200: 成功 > > 304: 转发 > > 404: 资源不存在 > > 405: 不支持请求方式 > > 400: 失败请求 > > 500: 服务器内部错误, 后台出现异常 #### 响应正文 #### > 通过响应输出流 > > 字符响应输出流: response.getWriter() 文本 json数据 > > 字节响应输出流: response.getOutputStream() 万能流, 文本,文件 > > **注意:** > > 这个两个流不能共存, 同时使用, 抛异常java.lang.IllegalStateException #### 重定向 #### > response.sendRedirect(重定向的路径) > > 特点: > > 1. 两次请求, request域无效 > 2. 客户端地址栏发生变化 > 3. 跳转发生在客户端 > 4. 跳转资源:可以是服务器内部资源(无法跳转到WEB-INF目录的资源), 也可以是服务器外部资源 重定向与转发资源路径问题: //访问的项目名: /web //重定向到demo1.html // 重定向的url写绝对路径: 直接写/ 忽略项目名 // 如果设置访问的项目名: 必须加 /项目名/资源路径 // /项目名 通过request.getContextPath() // 重定向的url: 统一的写: req.getContextPath()+"/资源路径" resp.sendRedirect(req.getContextPath()+"/demo1.html"); //转发 // 转发的url, 有项目名,没有项目名, 都不需要加/项目名 // 统一写法: /资源路径 // req.getRequestDispatcher("/demo1.html").forward(req,resp); ### 乱码处理 ### > 码表: 文字/字母/字符 对应 数字(码表) > > 中: 16343 ak编码 ---> 使用bk编码 : 尜 乱码 > > 中 10231 bk编码 > > 尜 16343 > > 对ASCII码表的扩展 0~127 定了 英文字母: > > UTF-8 GBK GB2312 Big5 ISO-8859-1(西欧语言) **项目的编码统一: UTF-8** JavaWeb使用Request,Response 默认编码: ISO-8859-1 (不包含中文) #### 请求编码 #### * get请求, 通过url 处理方式: 1. Tomcat 从8开始, 默认处理Get请求编码, 默认使用的编码: UTF-8 2. Tomcat7或者之前的, 没有处理Get请求编码 > 1. 在server.xml 指定get请求编码: UTF-8 > > <Connector URIEncoding= "UTF-8" connectionTimeout= "20000" port= "8888" protocol= "HTTP/1.1" redirectPort= "8443" /> > > 1. 对所有的web服务器都有效, 通过代码处理 > > //1.打散 > byte[] bytes = name.getBytes("UTF-8"); > //2.组装成字符串 > name = new String(bytes,"UTF-8"); * post请求, 通过请求体 [http_localhost_hello_oneServlet]: http://localhost/hello/oneServlet [5505ff3462b5429798b5ecfd54ddf150.png]: https://img-blog.csdnimg.cn/5505ff3462b5429798b5ecfd54ddf150.png [cf955eb0c94849969274a59061e155e0.png]: https://img-blog.csdnimg.cn/cf955eb0c94849969274a59061e155e0.png
还没有评论,来说两句吧...