图片下载案例
-
获取请求参数,文件名称 String filename = request.getParameter("filename")
-
使用字节输入流加载文件进内存
-
找到文件服务器路径 ServletContext servletContext = this.getServletContext()
Sring realPath = servletContext.getRealPath("/img/"+filename)
-
用字节流关联 FileInputStream fis = new FileInputSream(realPath);
-
设置response响应头
-
设置响应头类型 content-type String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type",mimeType)
-
设置响应头打开方式 Content-disposition response.setHeader("content-disposition","attachment;filename=" + filename)
-
将输入流的数据写到输出流 ServletOutputStream sos = response.getOuputStream();
byte[] buff = new byte[1024*8]
int len = 0;
while((len = fis.read(buff)) != -1){
sos.write(buff,0,len);
}
会话技术
- 会话:一次会话中包含多次请求和响应
- 一次会话:浏览器第一次给服务器资源发送请求,服务器给浏览器进行一次回应
- 功能:再一次会话的范围内的多次请求间,共享数据
- 方式:
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
客户端会话技术:Cookie
- 概念:客户端会话技术,将数据保存在客户端
- 使用步骤:
- 创建Cookie对象,绑定数据
- 发送Cookie对象
- response.addCookie(Cookie cookie)
- 接收Cookie对象,拿到数据
- Cookie[] getCookies()
- getName
- getValue
- 实现原理
- 基于响应头ser-cookie和请求头cookie实现
- cookie的细节
- 一次可不可以发送多个cookie
- 可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie即可
- cookie在浏览器中保存多长时间
- 默认情况下,浏览器关闭会被销毁
- 持久化存储
- setMaxAge(int seconds)
- 整数:将Cookie写到硬盘文件。持久化存储,存活时间
- 负数:默认,关闭就没
- 零:删除cookie信息
- cookie能不能存中文
- tomcat 8 之前,cookie中不能直接存储中文数据
- 在tomcat 8 之后,cookie支持中文数据,不支持特殊字符,需要用URL编码存储、解析
- cookie的共享问题
- 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目长cookie能不能共享
- 默认情况不能共享
- setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
- 不同的tomcat服务器间cookie共享
- serDomain(String path):如果设置一级域名相同,那么多个服务器间,cookie可以共享
- Cookie的特点和作用
- cookie存储数据在客户端浏览器
- 浏览器对于单个cookie的大小有限制,对同一域名下的cookie总数也有限制
- cookie一般用于存储少量不敏感的数据
- 在不登陆的情况下,完成服务器对客户端的身份识别
JSP(被淘汰了,不过了解一下还是对用框架有一定帮助)
概念:Java Server Pagers:java服务器端页面
- 可以理解为一个特殊的页面,既可以写html标签也可以写java代码
- 用于简化书写
原理:本质上就是一个Servlet
JSP脚本:JSP定义Java的方式
- <% 代码 %>:定义Java代码,在service方法中。service方法中定义什么,该脚本就可以定义什么
- <%! 代码 %>:定义java代码,定义成员(尽量不用,用的很少)
- <%= 代码 %>:定义的java代码,会输出到页面上,输出语句中可以定义什么。
Session:服务器端会话技术
-
概念:服务器端会话技术,在一次会话中多次请求间共享数据,将数据保存在服务器对象中。HttpSession -
HttpSession
-
获取session对象 HttpSession session = request.getSeesion()
-
存储数据,使用对象 Object msg = session.getAttribute(name)
void setAttribute(name,value)
void removeAttribute(name)
-
原理:
-
客户端不关闭,服务器不关闭时,依赖于Cookie,通过生成Cookie保证多次获取的session为同一个 -
客户端不关闭,服务器关闭时,两次获取是session不是同一个
-
session的失效时间
- 服务器关闭
- session对象调用自杀方法invalidate()
- session默认失效时间30分组,可以改
-
特点:
- session用于存储一次会话的多次请求数据,存储在服务器端
- session可以存储任意类型,大小的数据
- session和cookie的区别
- session存在服务器端,cookie存在客户端
- session没有数据大小限制,cookie有
- session数据安全,cookie相对不安全
MVC开发模式
- 演变历史
- 早期只有servlet,没有jsp只能使用response输出标签数据,非常麻烦
- 后来有jsp,简化了Servlet开发,过度使用的话很难维护,分工
- 后来Javaweb开发借助MVC开发模式,使得程序的设计更加合理性
- MVC:
- M:Model,模型 JSP
- 业务逻辑操作
- V:View,视图 JavaBean
- 展示数据
- C:controller,控制器 Servlet
- 获取客户端输入
- 调用模型
- 将数据交给视图禅师
- 优缺点:
- 优点:耦合性低,利于维护,利于分工合作,重用性高
- 缺点:使得项目架构变得复杂,对开发人员要求高
EL表达式
-
概念:Expression Language 表达式语言 -
作用:替换和简化jsp页面中Java代码的编写 -
语法:${表达式}
-
${域名.键值}:从指定域中获取指定键的值
- 域名称:
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope -->application(ServletContext)
-
${域名}:表示依次从最小的域中获取值 -
获取对象、List集合、Map集合的值
-
对象:${域名.键名.属性值} 本质上会调用对象的getter方法 -
List集合:${域名.键名[索引]} -
Map集合: ${域名.键名.key名} ${域名.键名[“key名”]}
三层架构:软件设计架构
- 界面层(表示层/web层):用户看的界面。用户可以通过界面上的组件和服务器交互
- 控制器:Servlet,封装后调用业务逻辑层,再将数据返回给视图
- 业务逻辑层(service层):处理业务逻辑的
- 接受界面层的请求,到数据访问层获取数据返回
- 数据访问层(dao层,Data Access Object):操作数据存储文件
- 定义最基本的增删改查操作
Filter:过滤器
当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
过滤器的作用:
- 一般用于完成通用的操作。如:登录验证,编码统一处理、敏感字符过滤…
步骤:
- 定义一个类,实现接口Fileter
- 复写方法
- 配置拦截路径
- web.xml
- 注解
细节:
- web.xml配置
- 过滤器执行流程
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器的放行代码下边的代码
- 过滤器生命周期
- init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次,用于加载资源(类似于C++的构造函数)
- doFilter:每一次请求被拦截资源时,会执行。执行多次
- destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次,用于释放资源。(类似于C++的析构函数)
- 过滤器配置详解
- 拦截路径配置:
- 具体资源路径:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
- 后缀名拦截:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
- 拦截所有资源: /* 访问所有资源时,过滤器都会被执行
- 拦截方式配置:资源被访问到的方式
- 注解配置,设置dispatcherTypes属性
- REQUEST:默认值。浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
- web.xml配置
- 过滤器链(配置多个过滤器)
- 执行顺序:如果有两个过滤器,过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
- 过滤器先后顺序的问题
- 注解配置:按照类名的字符串比较规则比较,值小的先执行
- 如:AFilter 和 BFilter,AFilter就先执行
- web.xml配置
- 增强对象的功能
- 装饰模式
- 代理模式
- 概念:
- 真实对象:被代理的对象
- 代理对象:
- 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
- 实现方法:
- 静态代理:有一个类文件描述代理模式
- 动态代理:在内存中形成代理类
- 实现步骤:
- 代理对象和真实对象实现相同的接口
- 代理对象 = Proxy.newProxyInstace()
- 使用代理对象调用方法
- 增强方法
- 增强方式:
- 增强参数列表
- 增强返回值类型
- 增强方法体执行逻辑
Listener监听器
web的三大组件之一
- 事件监听机制
- 事件:一件事情
- 事件源:事件发生的地方
- 监听器:一个对象
- 注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
- ServletContextLinser:监听servletContext对象的创建和销毁
- void contextDestroy(ServletContextEvent sce):ServletContext对象被销毁之前调用该方法
- void contextInitialized(ServletContextEvent sce):ServletContext对象创建后会调用该方法
AJAX:
-
概念:ASynchronous Javascript And XML 异步的Javascript 和XML
-
异步和同步:客户端和服务器端
- 同步:客户端必须等待服务器端的响应,在等待响应期间客户端不能做其他操作
- 异步:客户端不需要等待服务器端的响应,在等待响应期间客户端可以做其他操作
AJAX是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术 通过在后端与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个页面的情况下,对页面的某部分进行更新。 -
实现方式:
- 原生JS实现方式
- JQuery实现方式
- $.ajax()
- 语法:$ajax({键值对});
- url 地址
- type 默认GET
- data 传参,JSON格式
- success
- error
- dataType:返回格式
- $.get()
- 语法:$get(url。[data],[callback],[type])
- $.post()
JSON
-
概念:Javascript Object Notation Javascript对象表示法 用于模拟对象对于数据的封装
- json现在多用于存储和交换文本信息,进行信息传输
- 比xml更小,传输更快,更易解析
-
语法:
- 基本规则
- 数据在名称/值对中:json数据由键值对构成
- 数据用逗号分隔
- 花括号保存对象
- 方括号保存数组
- 获取数据
- json对象.键名
- json对象[“键名”]
- 数组对象[索引]
-
JSON数据和Java对象的互相转换
- JSON解析器:
- 常见的解析器:Jsonlib,Gson,fastjson,jackson
-
JSON转为Java对象 mapper.readValue(json,class) -
Java对象转换为JSON字符串
-
导入jackon的相关jar包 -
创建Jackson核心对象 ObjectMapper -
转换 writeValue(参数1:obj)
- File:将obj对象转换为JSON字符串,并保存到指定的文件中
- Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
- OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
writeValueAsString(obj):将对象转换为json字符串 -
注解:
- @JsonIgnore:排除属性
- @JsonFormat:属性值的格式化
-
复杂对象转换
- List:数组
- Map:对象格式一致
Redis:数据库软件
-
概念:redis是一款高性能的NOSQL的非关系型数据库
- 数据之间没有关联关系
- 数据存储在内存中
- 一般将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
-
命令操作
- redis的数据结构
- redis存储的是:key,value格式的数据,键值对
- value的数据结构:
- 字符串 String
- 哈希类型 hash:map格式
- 列表类型 list 数据允许重复
- 集合类型 set 数据不允许重复
- 有序集合类型 sortedset 数据不允许重复,会自动排序
- 字符串类型 string
- 存储:set key value
- 获取:get key
- 删除:del key
- 哈希类型 hash map类型
- 存储:hset key field value
- 获取:
- hget key field:获取指定的field对应的值
- hgetall key:获取所有的field和value
- 删除:hedl key field
- 列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
- 添加:
- lpush key value:将元素加入列表左表
- rpush key value:将元素加入列表右表
- 获取:
- lrange key start end:范围获取
- 删除:
- lpop key:删除列表最左边的元素,并将元素返回
- rpop key:删除列表最右边的元素,并将元素返回
- 集合类型 set: 不允许重复
- 存储:sadd key value
- 获取:smembers key:获取set集合所有元素
- 删除:srem key value:删除set集合中的某个元素
- 有序集合类型 sortedset:不允许重复元素,且元素有顺序
- 存储:zadd key score value:
- 获取:zrange key start end
- 删除:zrem key value
- 通用命令
- keys *:查询所有的键
- type key:获取键对应的value类型
- del key:删除指定的key value
-
持久化
-
redis是一个内存数据库,当redis服务器重启或电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中 -
持久化机制:
-
RDB:默认方式
- 在一定间隔时间中,检测key的变化情况,然后去持久化数据
- 编辑redis.windows.conf文件
- 重新启动redis服务器,并指定配置文件名称
-
AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
-
编辑redis.window.conf文件 appendonly no(关闭aof) —> appendonly yes(开启aof) appendfync always:每一次操作都持久化 appendfsync everysec:每隔一秒进行一次持久化 appendfsync no:不进行持久化 -
Java客户端 Jedis
-
连接池:JedisPool
-
使用:
-
创建JedisPool连接池对象 new -
获取连接 Jedis jedis = jedispool。getResource(); -
关闭连接
Maven
同一套生命周期中,执行后边的操作,会自动执行前边的操作
坐标:被Maven管理的资源的唯一标识
- groupId:组织名称
- artifactId
- version:版本
打包方式
- jar:java项目。默认值
- war:web项目
- pom
|