- 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")