web应用的本质:客户端与服务器之间,通过HTTP协议通信。
Filter相当于一个拦截器。它会在请求到达Servlet之前,以及响应返回到浏览器之前,被激活。
Filter的用途很广泛,例如:验证授权、加密、压缩等。
Servlet生命周期:
创建对象 – Servlet对象被创建时,不能做任何分配系统资源的操作。
init初始化
service多次使用 一个servlet对象将用来处理所有的相关请求
销毁: 当服务器关闭,或者undeploy时,调用destroy方法
被垃圾收集器收集
M-V-C是Model-View-Controller的简写。这个模式指出,在一个WEB应用中,应该把Model、View、Controller三种角色彻底分开:
Model代表了数据。数据可以从任意地方取得,例如:数据库、XML等。通常用JavaBeans来代表model。
View代表了可见的页面。View的目标是将数据(Model)正确地呈现出来。但是View绝不关心数据是从何处来的、怎样来的。通常用JSP、模板技术来代表view。
Controller代表了控制逻辑、业务逻辑。Controller是M-V-C的核心 —— 它接受请求,执行相应的控制逻辑、业务逻辑,生成models,最后调用views。Controller通常由Servlet来担当。
velocity
必须明确指定Velocity模板本身所采用的字符集编码。
所以你必须指定一个init-param:input.encoding=GBK,表示我们用GBK编码来写模板。
转发重定向区别?
请求次数不同? 转发一次请求完成
共享对象不同? 转发可以共享一些对象,而重定向是在两次请求中完成,因此无法共享对象
目标不同? 转发只能发生在同一个应用内部
重复提交? 转发容易引起重复提交(完全防止重复提交,必须使用session技术)
Web应用Spring解决了什么?
Spring 解决了一个非常关键的问题他可以让你把对象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制。
spring 一中心,三基础!
一个中心:POJO编程(简化J2EE开发)
三个基础:IOC(易事简为),AOP(难事善为),服务抽象(重用轮子)
工具:
HttpWatch工具非常有用,尤其对我们跟踪重定向、session、cookie特别有用。通过它也可以观测到一些不明显的错误,而这些错误可能无法在浏览器中直接表现出来。
关于架构:
最高层次的系统分解
系统中不易改变的决定
管道方式
过滤器方式
分层,如何将企业应用组织成不同的层次,以及这些层次之间如何协同工作。
根据应用的复杂程度来分层,应对不同的分离方式,有一条关于依赖性的普遍原则:领域层和数据源层绝对不要依赖表现层, 这条原则将简化在相同的基础上替换表现层的待嫁,也使得表现层的修改所带来的连锁反应尽可能小,领域层与数据源层的关系更为复杂,其取决于数据源层的架构模式。
关于性能:
尽量减少远程调用
响应时间:系统完成一次外部请求处理所需的时间。
吞吐率:单位时间系统处理多大的请求量。对于企业应用来说,吞吐率是每秒事务数(tps)来度量。
响应性:系统响应请求的速度有多快。为了提高响应性可以损失一些响应时间和吞吐率是值得的。
模式
每一个模式描述了一个在我们周围不断重复发生的问题以及该问题解决方案的核心。
你什么时候能不用她?
从领域层说开起
如何建模,如何抽象领域模型就变得很难,因为 如何使用领域模型是很难学习的,另外领域模型的数据库连接非常复杂。
数据源层
对象与数据库,如何映射?
活动记录
实现松耦合:使用表数据入口或行数据入口
随复杂度的进一步增加:考虑使用O/R映射 确保领域模型尽可能与其他各层相互独立。
存储过程看做一个性能优化的步骤,而不是看做一项架构原则
持久化数据?
很多人同时访问数据?确保两个人在同时操作同一数据项时不出现错误,事务管理可以处理这个问题。但无法做到对应用开发者透明。
表现层:
胖客户用户界面 需要对客户程序进行控制和部署管理
HTML浏览器界面 尽可能使用这种方式
Martin 建议使用模型—视图—控制器 作为设计基础
站点面向文档:推荐使用页面控制器 特别是当既有静态页面又有动态页面的时候。
如果站点导航机制和UI更为复杂,考虑使用前端控制器
关于视图
主要有两种选择:模板视图和转化视图,
如果开发的是一个有多种表现形式的站点,考虑使用两步试图
与下层通信:
尽可能将所有的东西运行在一个进程中,这样就不用考虑低效的进程间通信
如果无法再一个进程中完成,可以将领域逻辑层用远程外观包装,然后使用数据传输对象实现与Web服务器的通信。
Web Services是应用集成而不是应用架构的技术。
缓存
定时任务
spring中使用quartz
1)那个对象--那个方法
targetObject
targetMethod
2)触发器
配置JobDetail
清空浏览器缓存:
1, 使用java提供的方法,在jsp或者servlet中都可以
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>
2, 使用HTML标记,如下面:
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</HEAD>