java程序中获取src目录的文件路径:
String path = 当前类的名称.class.getClassLoader().getResource("users.xml").getPath();
如果有,则再找到对应的全类名
调用其方法
被创建:执行init方法,只执行一次
默认情况下,第一次被访问时,Servlet被创建
可以配置指定Servlet的创建时期
的值为负数
2. 在服务器启动时,创建
的值为0或正整数
提供服务:执行service方法,执行多次
被销毁:执行destroy方法,只执行一次
servlet --> 接口
|
GenericServlet --> 抽象类
|
HttpServlet --> 抽象类
概念:Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了客户端和服务器端通信时,发送数据的格式
特点:
历史版本:
请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求头:客户端浏览器告诉服务器一下信息
请求头名称:请求头值
请求空行
请求体(正文):
POST /login.html HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
username=zhangsan
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
$Title$
hello , response
request对象和response对象的原理
request对象继承体系结构:
ServletRequest -- 接口
| 继承
HttpServletRequest --接口
| 实现
org.apache.catalina.connector.RequestFacade -- 类(Tomcat实现)
request功能:
GET /day14/demo1?name=zhangsan HTTP/1.1
String getMethod()
String getContextPath()
String getServletPath()
String getQueryString()
String getRequestURI()
:/day14/demo1String getRequestURL()
:http://localhost/day14/demo1URL
:统一资源定义符:http://localhost/day14/demo1URI
:统一资源表示符:/day14/demo1String getProtocol()
String getRemoteAddr()
String getHeader(String name)
:通过请求头的名称获取请求头的值Enumeration getHeaderNames()
:获取所有请求头的名称BufferedReader getReader()
:获取字符输入流,只能操作字符数据ServletInputStream getInputStream()
:获取字节输入流,可以操作所有类型的数据获取请求参数通用方式
String getParameter(String name)
:根据参数名称来获取参数值String[] getParameterValues(String name)
:根据参数名称来获取参数值的数组Enumeration getParameterNames()
:获取所有的请求的参数名称Map getParameterMap()
:获取所有参数的map集合request.setCharacterEncoding("UTF-8");
请求转发:一种在服务器内部的资源跳转方式
RequestDispatcher getRequestDispatcher(String path)
forward(ServletRequest request, ServletResponse response)
共享数据
void setAttribute(String name,Object obj)
:存储数据Object getAttribute(String name)
:通过键获取值void removeAttribute(String name)
:通过键移除键值对获取ServletContext
ServletContext getServletContext()
BeanUtils工具类,简化数据封装
JavaBean:标准的java类
概念:
成员变量:
属性:setter和getter方法截取后的产物
例如:
getUsername() -> Username -> username
方法:
setProperty()
getProperty()
populate(Object obj, Map map)
:将map集合的键值对信息,封装到对应的JavaBean对象中功能:设置响应消息的
setStatus(int sc)
setHeader(String name, String value)
PrintWriter getWriter()
ServletOutputStream getOutputStream()
重定向:资源跳转的方式
// 简单的重定向方法
response.sendRedirect("/response/responseDemo2");
// 设置状态码
response.setStatus(302);
// 设置重定向地址
response.setHeader("location","/response/responseDemo2");
重定向的特点:redirect
转发的特点:forward
路径写法
路径分类:
相对路径:通过相对路径不可以确定唯一资源
如:./index.html
不以/
开头,以.
开头
规则:找到当前资源和目标资源之间的相对位置关系
./
:当前目录../
:后退一级目录绝对路径:通过绝对路径可以确定唯一资源
如:http://localhost:8080/response/responseDemo2
/response/responseDemo2
以/
开头的路径
规则:判断定义的路径是给谁用的?判断请求将来从那发出
request.getContextPath()
服务器输出字符数据到浏览器
步骤:
注意:
乱码问题:
response.getWriter();
获取流的默认编码是ISO-8859-1的
设置该流的默认编码
告诉浏览器响应体使用的编码
// 简单的形式,设置编码,是在获取流之前设置
response.setContentType("text/html;charset=utf-8");
// 获取流对象之前,设置流的默认编码 可省略
// response.setCharacterEncoding("UTF-8");
// 告诉浏览器,服务器发生的消息体数据的编码,建议浏览器使用该编码解码
response.setHeader("Content-type","text/html;charset=utf-8");
// 简单的形式,设置编码
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("你好,response
");
response.getOutputStream().write("你好,response".getBytes());
概念:代表了整个web应用,可以和程序的容器(服务器)来进行通信
获取:
通过request对象获取
request.getServletContext();
通过HttpServlet获取:
this.getServletContext();
功能:
获取MIME类型
String getMimeType(String file)
域对象:共享数据
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
获取文件的真实(服务器)路径
String getRealPath(String path)
会话:一次会话中包含多次请求和响应。
功能:在一次会话的范围内的多次请求间,共享数据
方式:
Cookie
Session
概念:客户端会话技术,将数据保存到客户端
快速入门:
new Cookie(String name, String value)
response.addCookie(Cookie cookie)
Cookie[] request.getCookies()
实现原理
cookie的细节:
一次可以不可以发生多个cookie?
cookie在浏览器中保存多少时间?
setMaxAge(int seconds)
cookie能不能存中文?
cookie共享问题?
假设在一个Tomcat服务器中,部署了多个web项目,那么在这些web项目中能不能共享?
setPath(String path)
:设置cookie的获取范围,默认情况下,设置当前的虚拟目录
path
设置为/
setDomain(String path)
:如果设置一级域名相同,那么多个服务器之间cookie可以共享了setDomain(".baidu.com")
,那么tieba.baidu.com
和news.baidu.com
中cookie可以共享cookie的特点和作用
概念:
java servlet pages
:java服务器端页面
原理:
jsp的脚步:JSP定义java代码的方式
<% 代码 %>
:定义的java代码在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。<%! 代码 %>
:定义的java代码,在jsp转换后的java类的成员位置。<%= 代码 %>
:定义的java代码,会输出到页面上,输出语句中可以定义什么,该脚本中就可以定义什么。jsp的内置对象
request
response
out
:字符输出流对象,可以将数据输出到页面上,和response.getWriter()
类似
response.getWriter()
和out.write()
的区别:概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
快速入门:
获取HttpSession
对象:
HttpSession request,getSession()
使用HttpSession
对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
原理:
细节:
如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
session什么时候被销毁?
服务器关闭
session对象调用invalidate()
session默认失效时间 30分钟
选择性的配置修改
<session-config>
<session-timeout>30session-timeout>
session-config>
session的特点
作用:用于配置jsp页面,导入资源文件
格式:
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 %
分类:
contentType
:等同于response.setContentType()
import
:导包errorPage
:当前页面发生异常后,会自动跳转到指定的错误页面isErrorPage
:表示当前页面是否是错误页面
true
:是,可以使用内置对象exception
false
:否,默认值,不可以使用内置对象exception
:只能注释html代码片段<%-- --%>
:可以注释所有概念:Expression Language 表达式语言
作用:替换和简化jsp页面中java代码的编写
语法:${表达式}
注意:
isELIgnored="true"
忽略当前jsp页面中所有的el表达式\${表达式}
:忽略当前这个el表达式使用:
运算:
+ - * /(div) %(mod)
> < >= <= == !=
&&(and) ||(or) !(not)
empty
获取值
el表达式只能从域对象中获取值
语法:
${域名称.键名称}
:从指定域中获取指定键的值
域名称:
pageScope --> pageContext
requestScope --> request
sessionScope --> session
applicationScope --> application(ServletContext)
举例:在request域中存储了name = 张三
获取:${requestScope.name}
${键名称}
:表示依次从最小的域中查找是否有该键对应的值,直到找到为止
获取对象,list集合,map集合的值
对象:${域名称.键名.属性名}
* 本质上会去调用对象的getter方法
List集合:${域名称.键名[索引]}
Map集合:
隐式对象:
概念:JavaServer Pages Tag Library JSP标准标签库
作用:用于简化和替换jsp页面上的java代码
使用步骤:
常用的JSTL标签
if:相当于java代码的if语句
choose:相当于java代码的switch语句
使用choose标签声明 相当于switch声明
2. 使用when标签做判断 相当于case
3. 使用otherwise标签做其他情况的声明 相当于default
foreach:相当于java代码的for语句
概念:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一下特殊的功能。
作用:
快速入门:
细节:
web.xml配置
<filter>
<filter-name>demo1filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo1filter-class>
filter>
<filter-mapping>
<filter-name>demo1filter-name>
<url-pattern>/*url-pattern>
filter-mapping>
过滤器执行流程
执行过滤器
执行放行后的资源
回来执行过滤器放行代码下边的代码
过滤器生命周期方法
init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
doFilter:每一次请求被拦截资源时,会执行。执行多次
destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
过滤器配置详解
执行顺序:如果有两个过滤器:过滤器1和过滤器2
过滤器先后顺序问题:
设计模式:一些通用的解决固定问题的方式
1. 装饰模式
2. 代理模式
* 概念:
1. 真实对象:被代理的对象
2. 代理对象:
3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
* 实现方式:
1. 静态代理:有一个类文件描述代理模式
2. 动态代理:在内存中形成代理类
* 实现步骤:
1. 代理对象和真实对象实现相同的接口
2. 代理对象 = Proxy.newProxyInstance();
3. 使用代理对象调用方法。
4. 增强方法
* 增强方式:
1. 增强参数列表
2. 增强返回值类型
3. 增强方法体执行逻辑
概念:redis是一款高性能的NOSQL系列的非关系型数据库
数据结构:
命令:
持久化:
redis是一个内存数据库,当redis服务器重启或者电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
redis持久化机制:
RDB:默认方式,不需要进行配置,默认就使用这种机制
编辑redis.windows.conf文件
# after 900 sec (15 min) if at least 1 key changed
save 900 1
# after 300 sec (5 min) if at least 10 keys changed
save 300 10
# after 60 sec if at least 10000 keys changed
save 60 10000
重新启动redis服务器,并指定配置文件名称
D:\JavaWeb2018\day23_redis\资料\redis\windows-64\redis-2.8.9>redis-server.exe redis.windows.conf
AOF:日志记录方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
appendonly no(关闭aof) --> appendonly yes (开启aof)
# appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化