javaWeb核心技术第七篇之HTTPTomcatServletRequest和Response
Posted haizai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaWeb核心技术第七篇之HTTPTomcatServletRequest和Response相关的知识,希望对你有一定的参考价值。
- Web服务器 - 概念: - web资源: "英文直译"网"的意思 资源:一切数据文件 web资源:通过网络可以访问到的资源,通常指的是一切放在服务器上的文件" - web资源的分类: - 静态的web资源: " 内容是一成不变的" - 动态的web资源: " 内容有可能在不同的时间或者不同的人访问的时候会发生改变的" - web技术分类 - 静态的web技术 " 例如: html css js ....." - 动态的web技术 " 例如:servlet jsp" - 软件的架构 - c/s架构(Client/Server 客户端/服务器) " 例如:qq 迅雷 lol" - b/s架构(Browser/Server 浏览器/服务器) " 例如:京东 淘宝 " - 区别 - c/s:需要客户下载客户端,页面比较炫,和服务器交互少,可以在客户端处理部分业务逻辑,可降低服务器的压力.需要维护客户端和服务器端 - b/s:只需要客户有一个浏览器,一切页面从服务器加载,和服务器交互频繁,由服务器处理业务逻辑,服务器压力较大.只需要维护服务器端. - 通讯机制 - 基于http协议 - 浏览器发送给服务器的内容:请求(request) - 服务器返回给浏览器的内容:响应(response) - 注意:先有请求,后有响应,一次请求对应一次响应 - web服务器 - 作用:将我们编写好的网页发布出去,别人就可以通过网络访问 - 常见的web服务器 "名称 厂商 特点 Weblogic oracle 大型的收费的支持javaEE所有规范的web服务器(servlet和jsp) websphere ibm 大型的收费的支持javaEE所有规范的web服务器(servlet和jsp) tomcat apache 小型的免费的支持servlet和jsp规范的"web服务器"" - Tomcat服务器★ Tomcat如何优化? 1: 优化连接配置.修改连接数,关闭客户端的dns查询(DNS查询需要占用网络,再获取对方ip的时候会消耗一定的时间) 2: 优化jdk,扩大tomcat使用的内存,默认为128M - 下载 - http://tomcat.apache.org/download-70.cgi - core: - zip:可以在window上运行的(我们今天使用) - tar.gz:运行在linux上的 - 安装 - 解压缩即可 - 目录结构 - bin:存放可执行的文件 - ★conf:存放配置文件 - lib:存放的是tomcat运行时和项目运行时必须的jar包 - logs:存放的是日志文件(catalina.out) - temp:存放临时文件(不用管) - ★★webapps:存放要发布的web项目 - ★work:存放项目运行时产生的java文件和class文件 - 启动 " 双击 tomcat目录下/bin/startup.bat" - 关闭 " 方式1:点 x 方式2:ctrl + c (记住)方式3:双击 tomcat目录下/bin/shutdown.bat" - 配置 - 常见问题 - 一闪而过 "查看JAVA_HOME是否配置正确" - 端口占用: 可以修改Tomcat的端口号 "修改 tomcat目录下/conf/server.xml 大约70行 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 需要将 8080 修改成其他的端口号 端口号:0~65535 0~1024:系统预留的端口号 一般不要使用 但是可以使用80端口 80端口是http协议的默认端口号,访问的时候可以不写端口号" - 访问格式 - tomcat的访问路径(8080是tomcat的默认的端口号) " http://localhost:8080" - 格式:http://ip地址:端口号/项目名/资源?参数名称=值&参数名称=值 - web项目 - 目录结构:★ "myweb(目录名:项目名) | |---资源文件 html img css js |---WEB-INF(目录:特点,通过浏览器直接访问不到) | | | |---lib(目录:项目运行的jar包) | |---classes(目录:存放的class文件) | |---web.xml(核心配置文件,在servlet2.5版本中必须有,serlvet3.0版本不是必须的)" - 项目访问路径: "http://localhost:80/myweb/1.html 协议://ip地址:端口/项目名称/资源" - Tomcat和Eclipse整合 - Http协议: - 协议:规定内容的传输的格式 - http协议: "用来制定互联网上数据的传输格式" - 包含: - 浏览器发送给服务器的内容 请求 "规定请求数据的格式" - 服务器返回给浏览器的内容 响应 "规定响应数据的格式" - 请求的格式: "请求行 请求头 请求体" - 请求行:请求的第一行 - 格式:请求方式 请求资源 协议/版本 "例如: GET /33/1.html HTTP/1.1" - 请求方式: "常见的两种 get和post get请求:请求参数会在地址栏上显示,参数大小有限制,不安全 http://ip地址:端口号/项目名/资源?参数名称=值&参数名称=值 post请求:请求参数不在地址栏上显示,参数大小不受限制.较为安全 格式: 参数名称=值&参数名称=值" - 请求头 - 格式: key/value的格式 (value可以为多个值的) - 常见的请求头 - Accept: text/html,image/* --支持数据类型 - Accept-Charset: ISO-8859-1 --字符集 - Accept-Encoding: gzip --支持压缩 - Accept-Language:zh-cn --语言环境 - Host: www.baidu.cn:80 --访问主机 - If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --缓存文件的最后修改时间 - Referer: http://www.baidu.com/index.jsp --来自哪个页面、防盗链 - User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) "扩展知识: Trident内核代表产品Internet Explorer,又称其为IE内核 Gecko内核代表作品Mozilla FirefoxGecko,火狐 Chrome内核代表作品Chrome,谷歌" - Cookie - Connection: close/Keep-Alive --链接状态 - 重要的头: - Referer User-Agent Cookie If-Modified-Since - 请求体 "和请求头之间有一个空行 post请求的参数:只有表单提交的时候明确了method="post"这时候是post请求,其他的都是get请求 参数名称=值&参数名称=值 username=jack&password=1234" - 响应的格式: "响应行 响应头 响应体" - 响应行:响应信息的第一行 - 格式: - 协议/版本 响应的状态码 状态码说明 - 例如: - HTTP/1.1 200 OK - 状态码: - 1xx :请求已发送 - 2xx :响应已完成 - 200:响应成功(请求成功) - 3xx :需要浏览器进一步操作才可以完成 - 302:重定向(配合location头使用) - 304:读缓存(Not Modified表示没有改变) - 4xx :用户访问错误(Not Found 表示:路径写错了,你访问的路径不存在) - 404:用户访问的资源不存在 - 5xx :服务器内部错误(其实就是代码有问题,改代码) - 500:服务器内部异常 - 响应头 - 格式: key/value的格式 (value可以为多个值的) - 常见的响应头 - Location: http://www.it315.org/index.jsp --跳转方向 - Server:apache tomcat --服务器型号 - Content-Encoding: gzip --数据压缩 - Content-Length: 80 --数据长度 - Content-Language: zh-cn --语言环境 - Content-Type: text/html; charset=GB2312 --数据类型(MIME类型) 大类型/小类型 text/css text/javascript image/jpeg image/bmp - Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改时间 - Refresh: 1;url=http://www.it315.org --定时刷新 - Content-Disposition: attachment; filename=aaa.zip --下载 - Set-Cookie:SS=Q0=5Lb_nQ; path=/search - Expires: -1 --缓存 - Cache-Control: no-cache --缓存 - Pragma: no-cache --缓存 - Connection:Keep-Alive --连接 - 重点的头: - Set-Cookie Location Content-Type Refresh Content-Disposition Last-Modified - 响应体 "和响应头之间有一个空行, 浏览器解析的内容" - servlet入门: "本质上就是一个运行在服务器上的类" - 作用:1.接受请求 2.调用Service 处理业务逻辑 3.生成响应结果 - 入门步骤: - 1.编写一个类 - 必须实现Servlet接口 - 重写里面的方法 - 2.编写配置文件(项目下 web-inf/web.xml) "注册servlet 绑定路径 <!-- 注册servlet servlet-name:给servlet起个名称 名称自定义,保证唯一 servlet-class:serlvet的全限定名(包名+类名) --> <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>cn.baidu.demo.HelloServlet</servlet-class> </servlet> <!-- 绑定路径 servlet-name:在servlet标签中给servlet起好的名称 url-pattern:路径 暂时都以"/"开头 --> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>" - 3.测试 " localhost/项目名/绑定的路径 localhost/33/hello" 在服务器中,为什么需要项目部署? 为了让网络通过服务器访问到项目 回顾: tomcat服务器和Http协议: web服务器: 概念: web资源: web资源分类: 静态的web资源:内容一层不变 动态的web资源:根据不同的人和不同的时间,可能会发生变化 web技术: 静态的web技术:html css js... 动态的web技术:Servlet jsp 结构: B/S(浏览器/服务器): C/S(客户端/服务器): 通讯机制: 基于HTTP协议 一次请求一次响应,先有请求后有响应 web服务器: Tomcat: 下载: 安装: 目录结构: bin: conf: webapps: work: 启动: bin/startup.bat 关闭: X ctrl + c ★ bin/shutdown.bat 访问: 协议://地址:端口/资源 web项目: 项目名称: |-------html |-------css |-------js |-------img |-------WEB-INF |-----------lib |-----------classes |-----------web.xml http: 请求:浏览器发送给服务器的内容(request) 请求行 请求信息的第一行 请求方式 请求的资源 协议/版本 http/1.0 http/1.1 请求头 格式: key/value (value可以为多个值) 请求体 当请求是post的时候,存放post请求所携带的参数 响应:服务器返回给浏览器的内容(response) 响应行 响应信息的第一行 协议/版本 状态码 说明 响应头 格式: key/value (value可以为多个值) 响应体 浏览器解析的内容 //////////////////////////////////////////// servlet: 案例-使用servlet完成用户登录功能 需求分析: 用户在表单中填写完用户名和密码后,点击登录的时候,向服务器发送登录的请求, 在服务器上处理请求,处理完毕后将处理信息响应到页面 处理结果: 登录成功:欢迎...登录... 登录失败:用户名或密码错误 异常:当前功能正在维护.... 技术分析: html:表单 form action:提交路径 method:提交方式 get post servlet: request response //////////////// 项目: com.baidu.web com.baidu.service com.baidu.dao com.baidu.domain com.baidu.utils 导入jar包 导入工具类 - Servlet的概述 - Servlet就是运行在web服务器上的java程序,本质上就是一个类. "一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口" - 作用: - 接收浏览器的请求 - 处理请求 - 生成响应信息 - Servlet入门★ - 1.编写一个类 " 实现servlet接口 重写Service(request,response)方法" - 2.编写配置文件(web.xml) " 注册servlet 绑定路径" - 3.测试 " http://localhost:8080/项目名称/绑定路径" - Servlet API "查询javaEE的API" - Servlet:接口 - (掌握★)init:初始化(第一次访问Servlet的实现类时候进行初始化,也就是说开启实现Servlet类和继承Servlet类的实现类,或者说是开启继承Servlet类的实现类和Servlet类的实现类) - (掌握★)service:提供服务(每次访问都执行都提供服务) - (掌握★)destroy:销毁(Servlet开启后,调用这个方法就是关闭或者销毁继承类)(服务器正常关闭,会把每一个servlet都给销毁了.(销毁的是Servlet的对象,也就是实现类的对象)) - (理解)getServletConfig():获取当前Servlet的配置对象 - (了解)getServletInfo():获取Servlet信息 - GenericServlet:(通用Servlet) "实现了servlet接口的抽象类, 实现servlet中除service方法之外的所有方法" - HttpServlet: "继承GenericServlet,实现了Servlet的所有方法." - Servlet的生命周期★ "从创建到死亡的过程" - init:初始化 - service:提供服务 - destroy:销毁 - 面试题总结: "当浏览器第一次访问该servlet的时候,服务器会给我们创建该servlet的对象,并调用init()方法进行初始化,init()方法执行完毕后service方法会跟着执行. 以后再访问该servlet的时候,服务器不会给我们创建该servlet的对象,也不会调用init()方法进行初始化,但是会调用service()方法给我们提供服务,并且是访问一次调用一次. 当服务器正常关闭的时候或项目从服务器中移除的时候,服务器会的调用destroy()方法,将该servlet的对象销毁 ★: 不论访问多少次只有一个servlet对象" 这个servlet是一个单实例,多线程的. package com.baidu_02; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class ServletDemo implements Servlet /* * 初始化:init * 调用者:tomcat服务器 * 执行时机:servlet第一次访问的时候 * 执行次数:1次 */ public void init(ServletConfig config) throws ServletException System.out.println("ServletLife 的init方法执行了, ServletLife出生了...55555"); //提供服务的service // 调用者:tomcat服务器 // 执行时机:每次访问的时候 // 执行次数:访问一次执行一次 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException System.out.println("ServletLife 的service方法执行了,为您提供服务...66666"); //销毁:destroy // 调用者:tomcat服务器 // 执行时机:服务器正常关闭和项目从服务器移除 // 执行次数:1次 //分为两种,一种是正常销毁,另一种是不正常销毁,正常服务器死亡销毁例如在Servers窗口点击了红色按钮.另一种是不正常服务器死亡销毁了,比如宕机就是断电,或者在Console点击了红色按钮(服务器就是死掉了,后面的也就不执行了) public void destroy() System.out.println("ServletLife 的destory方法执行了...死亡了...44444444"); /* * 获取当前的Servlet的配置信息(web.xml中配置信息) */ public ServletConfig getServletConfig() return null; /* * 当前servlet的基本信息 */ @Override public String getServletInfo() return null; - Servlet配置: - servlet标签:(注册Servlet) - servlet-name:给Servlet起名称 - servlet-class:Servlet全限定名(包名+类名) - servlet-mapping标签:(绑定路径) - servlet-name:已经注册好的Servlet名称 - url-pattern: - 1.完全匹配: /a/b/hello 以"/"开始 - 2.目录匹配: /a/* 以"/"开始,以"*"结尾 - 3.后缀名匹配: .jsp .action 以"."开始,匹配后缀名 - 注意事项: "一个路径只能对应一个servlet, 一个servlet可以对应多个路径" - Tomcat的web.xml文件(了解) "作用:处理其他servlet都处理不了的请求" - DefaultServlet 在tomcat的conf/web.xml中配置的 "我们项目的web.xml配置文件优先匹对,匹对不上再找Tomcat的web.xml" - servlet中的其他标签: - init-param(了解):配置servlet的初始化参数的 "<init-param> <param-name>Str</param-name> <param-value>tom123</param-value> </init-param>" - load-on-startup:修改servlet的初始化时机的 "<load-on-startup>正整数</load-on-startup> 设置servlet的初始化时机,随着服务器的启动而初始化. 数字越小初始化的优先级越高" - 路径: - 相对路径(很少使用,了解即可) - ./ 当前目录下 ./也可以省略不写 - ../ 上一级目录 - 绝对路径 - 带协议和主机的绝对路径(访问站外资源) "http://localhost:80/34/js/jquery-1.11.3.min.js" - 不带协议和主机的绝对路径(访问站内资源) "/34/js/jquery-1.11.3.min.js" - 访问项目时,设置默认首页 - 在web.xml中 通过welcome-file-list标签设置的(可以删除) "访问的时候直接写项目名称,就可以访问到默认设置的资源" - ServletConfig(了解) "Servlet的配置对象" - 作用: "获取Servlet的名称 获取Servlet的初始化参数 获取上下文对象(全局管理者ServletContext)" - 创建 " 服务创建Servlet的同时,也创建了Servlet的配置对象,通过Servlet的init方法传递给Servlet." - 获取: "通过 getServletConfig方法获取即可" - 常见的方法: - 获取servlet的名称(注册到tomcat的名称) "String getServletName()" - 获取serlvet的初始化参数 "String getInitParameter(String name)" - 获取上下文(全局管理者ServletContext) "ServletContext getServletContext()" /* /* 案例1-统计CountServlet被访问的次数 需求分析: 服务器上有一个CountServlet,要统计CountServlet被访问的次数.通过调用ShowServlet展示CountServlet被访问的次数 技术分析: ServletContext对象 案例2-文件下载 需求分析: 将服务器上的文件保存到本地 技术分析: Response 步骤分析: //设置两个头 //设置文件的类型 response.setContentType(文件mime类型); //设置文件下载专用头 response.setHeader("content-disposition","attachment;filename="+文件名称); //设置一个流 输出流 案例3-点击切换验证码 作用: 防止暴力破解 - ServletContext: "上下文对象,全局管理者,知晓一个项目中所有Servlet的一切信息" - 作用: "获取全局的初始化参数 获取文件的mime类型 资源共享 获取资源的路径" - 生命周期 - 创建:当服务器启动的时候,服务器会为每一个项目创建servletcontext对象,一个项目只有一个servletcontext对象 - 销毁:项目从服务器上移除或者服务器正常关闭的时候 - 获取方式 - 方式1:通过ServletConfig对象获取 "ServletContext ServletConfig().getServletContext();" - 方式2:通过getServletContext方法获取 "ServletContext getServletContext();" - 常用方法: - (理解)获取指定的项目初始化参数 "String getInitParameter(String name)" - (了解)获取项目所有初始化参数名称 "Enumeration getInitParameterNames()" - (掌握)获取一个文件的mime类型 "String getMimeType(String 文件名)" - (掌握)资源共享: 相当于一个map集合 - setAttribute(String name,Object value):设置 - getAttribute(String name):获取指定的属性值 - removeAttribute(String name):移除指定的属性 - (掌握)获取资源在服务器上的路径 "String getRealPath(String filepath) 注意: filepath:直接从项目的根目录开始写 getRealPath("/") ---> d:/tomcat/webapps/14" - (理解)以流的方式返回一个文件 "InputStream getResourceAsStream(String filepath)" - response "设置服务器发送给浏览器的内容" - 操作响应行 "格式: 协议/版本 状态码 状态说明 状态码分类: 1xx:已发送请求 2xx:响应完成 200:正常完成响应 3xx:还需浏览器进一步操作 302:重定向 配合响应头location使用 304:读缓存 4xx:用户操作错误 404:用户访问的资源不存在 5xx:服务器错误 500:程序异常" - 常用方法 - (理解)setStatus(int code):针对1 2 3 - (了解)sendError(int code):针对 4 5 - 操作响应头 "格式: key/value形式(value可以为多个值)" - 常用方法 - (重点)setHeader(String name,String value); "设置一个字符串形式的响应头" - 了解: "setIntHeader(String name,int value);设置一个整型的响应头 setDateHeader(String name,long value);设置一个时间的响应头 追加: addHeader(String name,String value):追加一个字符串形式的响应头 若无设置则设置,若已设置则追加 addIntHeader(String name,int value);追加一个整型的响应头 addDateHeader(String name,long value);追加一个时间的响应头 " - 常见的响应头 - location:重定向 "需要配合302状态码一起使用" - 方式1(了解): "response.setStatus(302); response.setHeader("location","路径");" - 方式2(掌握): "response.sendRedirect("路径");" - refresh:定时刷新 - java中(使用比较少) "response.setHeader("refresh","秒数;url=跳转的路径"); 几秒之后跳转到指定的路径上" - html中 "<meta http-equiv="refresh" content="3;url=/14/2.html">" - content-type:设置文件的mime类型 //tomcat传递方式都是以iso-8859-1编码传递的 "设置文件的mime类型 并且通知浏览器用什么编码打开" - 方式1(了解): "格式: response.setHeader("content-type","mime类型;charset=编码");" - 方式2(掌握): "response.setContentType("文件的mime类型;charset=utf-8");" - content-disposition:文件下载专用头 "response.setHeader("content-disposition","attachment;filename="+文件名称);" - 操作响应体 "页面上需要解析的内容" - 常用方法: - PrintWriter getWriter():字符流 - ServletOutputStream getOutputStream():字节流 - 注意事项: "自己编写的文件 一般都使用字符流输出 如:txt html等 音频,视频等文件使用字节流输出 字节流和字符流互斥,不能同时使用 服务器会帮我们释放资源,建议自己关闭;底层使用的缓存流 " HTTP & Tomcat 1. web服务器 web资源:通过网络可以访问到的资源,通常指放在服务器上的文件 1. 静态web资源: 内容是一成不变的 2. 动态web资源: 内容有可能随着访问时间和人不同而发生改变 3. 静态web技术: html css js 4. 动态web技术: servlet jsp 软件架构: 1. c/s架构(Client/Server 客户端/服务器) 2. b/s架构(Browser/Server 浏览器/服务器) 通讯机制: 1. 基于http协议 浏览器发送给服务器的内容:请求(request) 服务器返回给浏览器的内容:响应(response) 注意:先有请求,后有响应,一次请求对应一次响应 web服务器: 常见的web服务器 Weblogic oracle 大型收费支持javaEE所有规范的web服务器(servlet和jsp) websphere ibm 大型收费支持javaEE所有规范的web服务器(servlet和jsp) tomcat apache 小型免费支持servlet和jsp规范的web服务器 Tomcat服务器 下载 http://tomcat.apache.org/download-70.cgi zip 可以在windows上使用 tar.gz 运行在linux上 目录结构 bin: 存放可执行的文件 conf: 存放配置文件 lib: 存放的是tomcat运行时和项目运行时必须的jar包 logs: 存放的是日志文件 temp: 临时文件 webapps: 需要发布的项目放在这 work: 存放项目运行时产生的java和class文件 启动tomcat 运行tomcat目录下 /bin/startup.bat 关闭tomcat 1. 直接关闭 2. 运行 /bin/shutdown.bat tomcat配置: 修改tomcat端口号: /conf/server.xml 大约70行 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> (0-1024是系统预留的端口号,一般不要使用,但是可以使用90端口, 80端口是http协议的默认端口号,访问的时候可以不写端口号) 访问格式: http://localhost:8080 http://ip:端口号/项目名/资源?参数名=值&参数名=值 Http协议: 协议:规定内容的传输的格式 http协议:规定互联网上数据的传输的格式 请求: 响应: 状态码: 1xx: 请求已经成功发送 2xx: 响应已经完成 200:响应成功(请求成功) 3xx: 需要浏览器进一步操作才可以完成 302:重定向(配合location头使用) 304: 读缓存 4xx:用户访问错误 404:用户访问的资源不存在 5xx:服务器内部错误 500:服务器内部异常 Eclipse上配置Tomcat: 1. Window --> Preference --> 搜索server --> 选择Runtime Environments 2. 将tomcat安装地址,添加到Server Runtime Environments列表中 3. 创建一个动态 web project,在servers窗口中添加你的tomcat服务器 4. 在servers窗口双击服务器, 1. 配置项目工作空间,2. 选择部署路径 添加项目,开启服务器 Servlet: 一个类如果想要被(浏览器)访问到,就必须直接或者间接的实现Servlet接口 作用: 1. 接受浏览器的请求 2. 处理请求 3. 生成响应信息 入门使用: 1. 编写一个类 实现servlet接口 重写Service(request, response)方法 2. 编写配置文件(web.xml) 将访问路径与java类绑定起来 3. 测试 http://192.xxx.xxx.xx:8888/项目名/路径名 Servlet API Servlet接口: init() -- 初始化时 service() destory() -- 销毁时(正常关闭服务器或者删除项目) getServletConfig() -- 获取当前Servlet的配置对象 getServletInfo() -- 获取Servlet信息 GenericServlet(抽象类,继承Servlet) 实现了出了service方法外的所有方法 HttpServlet(也是抽象类): 继承了GenericService实现了所有Servlet的方法 方法详细说明: 根据反射,利用xml文件创建servlet对象,创建三个参数对象: request response servletconfig 初始化方法:init方法中,利用this.config = config,为全局变量赋值 getServletConfig() 方法就是获取私有全局变量的方法 servletConfig对象就是配置文件信息对象,可以获取web.xml中信息 (可以获取到web.xml中自定义的key value 参数) HttpServlet中的service方法: String method = reg.getMethod(); if(method == "get") doGet(request, response); else if (method == "post") doPost(resquest, response); Servlet的生命周期: 当浏览器第一次访问该servlet的时候,服务器会给我们创建该servlet的对象, 并调用inizgt()方法进行初始化,init()方法执行完毕后service方法会跟着执行. 以后再访问该servlet的时候,服务器不会给我们创建该servlet的对象, 也不会调用init()方法进行初始化,但是会调用service()方法给我们提供服务, 并且是访问一次调用一次. 当服务器正常关闭的时候或则项目从服务器中移除的时候, 服务器会的调用destroy()方法,将该servlet的对象销毁 ★: 不论访问多少次只有一个servlet对象 ServletConfig: 1. 封装了servlet的配置信息,一个servlet有一个ServletConfig 2. Servlet创建时,会调用有参init方法,创建ServletConfig(再调用无参init) 拿到ServletConfig对象:getServletConfig(); 3. 作用: 1. 拿到web.xml中的servlet的名字:<servlet-name></servlet-name> 2. 拿到web.xml中该servlet自定义参数标签中的值(根据键) <init-param> <param-name>name</param-name> <param-value>value</param-value> </init-param> String value = config.getInitParameter("name"); 3. 拿到ServletContext对象 config.getServletContext(); ServletContext: 1. 封装了整个web应用信息,一个项目有一个ServletContext 2. 获取ServletContext对象: 直接:this.getServletContext(); public ServletContext getServletContext() return getServletConfig().getServletContext(); 3. 作用: 1. 获取整个web应用的全局初始化参数 String value = context.getInitParameter("name"); web.xml中: <context-param> <param-name>name</param-name> <param-value>tom</param-value> </context-param> 2. 存储数据:ServletContext是一个域对象 所有servlet都可以将数据存进去,共同使用 存、取、删: setAttribute(name,value); String,Object getAttribute(name); String removeAttribute(name); String Response: 设置服务器发送给浏览器的内容 1. 操作响应行: 格式: 协议/版本 状态码 状态说明 状态码分类: 1xx:已发送请求 2xx:响应完成 200:正常完成响应 3xx:还需要浏览器进一步操作 302:重定向,配合响应头中的location使用 304:读缓存 4xx:用户操作错误 404:用户访问的资源不存在 5xx:服务器错误 500:程序异常 方法: setStatus(int code)针对 1 2 3 sendError(int code) 针对 4 5 2. 操作响应头: 格式: key/value 方法: setHeader(String name, String value); 其他方法: setIntHeader(String name, int value); setDataHeader(String name, long value); addHeader(String name, String value);没有就设置,有就追加 addIntHeader(String name, int value); addDateHeader(String name, long value); 常见的响应头: 1. location:重定向 让浏览器重新访问其他服务器资源 (算是重新访问,地址栏跟新) 操作响应内容:需要同时配合302状态码使用 response.setStatus(302); response.setHeader("location","路径"); 简便、常用使用方法: response.sendRedirect("路径"); 2. refresh:定时刷新 java:(少) response.setHeader("refresh","秒数;url="); html: <meta http-equiv="refresh" content="3;url=路径"> 3. content-type:设置文件类型 设置文件类型,并通知浏览器用什么编码打开 常见互联网媒体类型(MIME类型) text/html : HTML格式 text/plain :纯文本格式 text/xml : XML格式 image/gif :gif图片格式 image/jpeg :jpg图片格式 image/png:png图片格式 response.setHeader("content-type","text/html;charset=utf-8"); response.setContentType("text/html;charset=utf-8"); PS:中文乱码原因 http协议响应头不支持中文,同一采用ISO-8859-1编码 浏览器:火狐、谷歌采用 UTF-8 IE采用GBK 文件下载 --> 经过响应头(文字 --> ISO字节)--> 客户端 文件上传 --> 经过响应头(字节 --> ISO文字)--> 服务端 待商议 4. 文件下载 步骤: 1. 获取前端传来的文件名 2. 根据文件名,使用ServletContext对象 response.setHeader("content-disposition","attachment;filename="+文件名称); 下载之前要将文件名字反编码成 ISO-8859-1 文字 传送到头文件中,头文件按照ISO解码,发送给浏览器 火狐、谷歌将字节编码成UTF-8显示,IE编码成GBK PS: 1. 发送get请求,参数中空格处理: 处理方式1: http://baidu.com?name=han&content=hello world url = “http://baidu.com?name=han&content=”+URLEncoder.encode(“hello world”,“utf-8”); 2. 文件下载中,在响应头中设置的文件名里面包含空格,使下载文件时无法获取空格之后的文件名 处理方式: 设置响应头时,使用双引号将文件名括起来 response.setHeader("content-disposition", "attachment;filename=\""+name+"\""); request: 请求行 请求头 请求体 requestAPI: request.getMethod() 获取请求方式 request.getContextPath() 获取本项目名 request.getServletPath() 获取本servlet名 request.RemoteAddr() 获取客户IP地址 请求头: 获取头信息 request.getHeader(String name) 请求体: 请求体中包含了请求携带的参数 get方式没有请求体,post有 获取参数的方法: request.getParameter(String name); String 根据参数名获取参数值 request.getParameterValues(String name); String[] 根据参数名获取一组参数值(checkbox) request.getParameterMap(); Map(String name, String[] values) 获取表单提交上来的所有参数值,以name为键, 存放在Map中(可以配合BeanUtils使用,使用populate方法, 直接给Bean对象赋值) 获取中文参数乱码: 接受到http流传送来的中文,需要手动处理乱码 以ISO格式将乱码解码,在按照想要的格式重新编码 若是post请求,参数在请求体中,可以直接使用api让tomcat处理 get: new String(str.getBytes("iso-8859-1"),"utf-8"); post: request.setCharacterEncoding("utf-8") 页面、后台跳转方式:请求转发 请求转发: 并不以向浏览器发送响应信息作为本次请求的结束, 而是将同一个request对象继续传送到下一个页面、后台程序 中去,一直使用客户方发送的第一个请求。 使用: request.getRequestDispatcher("路径").forward(request, response) 特点: 1. 地址栏访问地址不变,一直是第一次请求时的访问地址 2. 一直使用同一个request对象,可以使用request对象传递数据 3. 每次跳转都视为服务器内部跳转,相对路径为本服务器地址内 每次跳转之后相对路径都会变为服务器根目录,不是某个页面 或程序(路径需要从项目名写起) 重定向(sendRedirect)的不同点: 1. 地址栏每次跳转都改变,显示最新访问的路径 2. request每次跳转都会结束生命周期,不可使用它来传参 3. 可以访问服务器之外的资源(跳转到其他ip地址) 简单来说,如果只是返回页面,不关乎地址问题,那就转发 如果需要进行下一步业务操作,从而需要改变地址,那就重定向吧 重定向时的网址可以是任何网址 转发的网址必须是本站点的网址 重定向与请求转发使用 前后两个页面 有数据传递 用请求转发,没有则用重定向。 比如servlet查询了数据需要在页面显示,就用请求转发。 比如servlet做了update操作跳转到其他页面,就用重定向。 回顾: Request 行 获得请求方式 : request.getMethod(); 获得项目名称 : request.getContextPath() 获得资源名称 : request.getServletPath() 获得远程主机的地址: request.getRemoteAddr() 头 Request.getHeader(name) : 根据名称获得一个指定的头信息 体(请求参数) Request.getParameter(name) : 根据名称获得一个指定的value Request.getParameterValues(name) : 根据名称获得一组指定的value Request.getParameterMap() : 获得所有的表单中键值对 请求转发: request.getRequestDispatcher("路径").forward(request.response) 重定向: request.sendRedirect("路径") 乱码处理 Get new String(乱码.getBytes(iso-8859-1),"编码"); Post Request.setCharacterEncoding(编码) 通知tomcat处理 response.setHeader("content-type","text/html;charset=utf-8")
以上是关于javaWeb核心技术第七篇之HTTPTomcatServletRequest和Response的主要内容,如果未能解决你的问题,请参考以下文章