javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response
程序员文章站
2022-05-29 10:02:30
- Web服务器 - 概念: - web资源: "英文直译"网"的意思 资源:一切数据文件 web资源:通过网络可以访问到的资源,通常指的是一切放在服务器上的文件" - web资源的分类: - 静态的web资源: " 内容是一成不变的" - 动态的web资源: " 内容有可... ......
- 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")
上一篇: 算法分析之猴子吃桃