学习中遇到的问题:java基础不行,都忘光了。
主要是:继承,接口,多线程,IO。尤其是多线程,在分布式系统中应该使用的比较多
第一章:前言和体系结构
HTTP协议:
TCP/IP的上层协议(应用层)。是一个请求/响应序列
HTTP响应:HTTP首部信息+HTTP体(多数未HTML)
HTTP请求:
GET:请求获得一个页面,字数有限,参数转化为url地址
POST:使用表单向服务器发送数据
url结构:略
web服务器:只提供静态网页,调用其他程序(cgi或servlet)提供动态网页
servlet:编写,部署,运行的小例子,P30
按照书中方法,部署servlet。其中,首次部署失败,原因是书中xml可能与tomcat不匹配,把tomcat 中examples的xml开头拷贝一下就解决了。
通过这个例子,基本了解了servlet和tomcat的工作流程!
servlet的问题:println html太糟糕了,因此引入jsp,页面设计人员只需要会用java对象即可!
第二章:高层体系结构
容器:Servlet没有main方法,管理servlet的程序成为web容器。
就是这样的容器。由容器向servlet提供请求和相应,容器调用servlet的方法。
容器提供:
servlet与web服务器之间的API
servlet实例
多线程支持:
xml配置安全性
jsp翻译成servlet
API,为上层提供API,极大的提高工作效率!
采用xml方式配置servlet
*提高灵活性:不必或较少修改源码,便于维护
*提高安全性:不能让用户知道真是路径
MVC:
Servlet+jsp模式业务逻辑与表示分离,但又有密切联系,servlet中的业务逻辑只能处理web应用,不能重用到其他应用(如PC客户端,无线应用),MVC设计模式解决此问题!
模型-视图-控制器把业务逻辑从servlet中抽取出来放到“模型”中,业务逻辑和表示清晰分离。
问题:每个Model的Controller都有大量重复代码,都要写在每一个servlet还是只需要一个servlet???
第三章:MVC实战
不使用IDE构建一个MVC架构的web应用
构建成功!
问题:servlet怎么把请求交给jsp并把页面转至jsp页面???request和response作用域是什么???
第四章:请求和响应
servlet流程:
init()
httpservlet中service()方法决定调用doGet还是doPost。
他们是抽象方法,需要用户的servelt程序覆盖至少一个!
servlet生命周期中(可以理解为服务器程序开启到关闭)只有一个实例!采用多线程实现多用户访问。这里如何操作线程,共享数据,线程安全等都有tomcat的web容器完成,如果要深入理解,得先学习多线程!
*GET和POST的区别:
GET参数你能放在请求行中,数据量小,暴露在url中 ,GET原则上应该是幂等的,同样的操作返回相同的结果,不对系统产生影响
POST参数放在http体中,数据量大,是不幂等的,对系统产生影响!
*介绍HttpServletRequeset和HttpServletReponse的一些API
Servlet处理IO,重定向,请求分派
第五章: 属性和监听者
*ServletConfig:可以在web.xml中配置参数
通过设置request属性的方式可以把servlet的初始化参数传递给jsp
*ServlentContext:整个web-app的全局参数
*如果希望整个web应用有一个main函数,用于数据库 初始化等操作,即为监听者listener
Servlet提供ServletContextListener接口。
在上下文初始化时得到通知
从ServletContext中得到初始化参数
使用初始化参数建立数据库链接
把数据库存储为一个属性,是Web应用各个部分都能访问
在上下文撤销时得到通知:关闭数据库链接
除了上下文监听者,还有其他监听者!
*属性:
属性建立了名称和对象的映射,在属性的作用域中的web应用中的其他程序就能通过名称使用属性的对象!
3个接口可以设置属性:ServletContext,ServletRequest,HttpSession。
*线程安全:
上下文属性不是线程安全的!
同步一个servlet也不能阻止其他servlet和jsp访问属性,所以要对上下文加锁!
会话也不是线程安全的,应为一个会话可能有多个请求。
请求属性是线程安全的,应为一个请求一个线程,请求的生命周期就是线程的生命周期
第六章 会话管理
*会话用于保存同一客户多个请求的状态
*会话使用coikie识别客户id(用ip也不安全,因为可能多个用户用一个ip),如果客户禁用cookie,则使用url重写!
url重写 :不是太明白
*删除会话,靠设置超时来完成,可以在DD中配置全局超时,也可以在程序中设置单独的超时
*cookie:服务器与客户之间交换信息
*会话监听
*会话迁移:在分布式系统中,Servlet,ServletConfig,ServletContext都在vm中复制,只有会话在vm中迁移(一个时刻,一个会话之存在于一个vm中)
第七章 使用jsp
jsp scriplet,page指令,jsp表达式
jsp声明:在类中定义,置于服务方法外!
jsp生命周期:首次访问时编译加载
初始化jsp:在DD中配置,可以重写jspInit方法
jsp属性:多一个pageContext,且pageContext包含其他属性的引用
jsp指令:
page指令:定义页面特定的属性
taglib指令:定义jsp可以使用的标记库
include指令:主要用于重用页面
Scriptlet有害论:
多数人认为java代码放入jsp是个不好的实践!
难于维护,不应要求页面设计人员懂java
解决:EL表达式,详见下章,可以忽略
jsp动作:下章