Head first servlet and jsp学习笔记

时间:2022-06-12 00:16:52

学习中遇到的问题: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容器。

     Tomcat就是这样的容器。由容器向servlet提供请求和相应,容器调用servlet的方法。

容器提供:

  通信支持:隐藏了servletweb服务器之间的API

  生命周期管理:实例化和销毁servlet实例

  多线程支持:

  用xml配置安全性

  把jsp翻译成servlet

  注:本质上还是计算机设计的层次化思想:只关心本层次的工作,使用底层的API,为上层提供API,极大的提高工作效率!

采用xml方式配置servlet

  *提高灵活性:不必或较少修改源码,便于维护

  *提高安全性:不能让用户知道真是路径

MVC:

  Servlet+jsp模式业务逻辑与表示分离,但又有密切联系,servlet中的业务逻辑只能处理web应用,不能重用到其他应用(如PC客户端,无线应用),MVC设计模式解决此问题!

  模型-视图-控制器把业务逻辑从servlet中抽取出来放到“模型”中,业务逻辑和表示清晰分离。

 

Head first servlet and jsp学习笔记

问题:每个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动作:下章