学习路径
- Tomcat
- 一个web服务器,也是装servlet的容器,要理解各个目录含义,学会使用
- 使用Servlet写出第一个程序
- JavaWeb的标准目录结构,写一个程序和配置,了解继承体系和生命周期
- ServletConfig与ServerContext
- request与response
- Cookie与Session会话机制
- Cookie的有效期如何设置
- Cookie如何保存中文
- Cookie的不可跨域性是什么意思
- 使用Cookie来显示用户上次访问的时间
- 使用Cookie来显示上次浏览过的商品
- 有了Cookie,为什么需要Session(因为他俩都是会话机制)
- Session的API基本使用
- Session的生命周期和有效期
- Session的实现原理,如果禁用Cookie,还能使用Session吗
- 尝试完成Session的几个小Demo
- 使用Session完成购物的功能
- 使用Session完成简单的登录注册完成防止表单重复提交完成一次性校验码
- Cookie和Session的区别主要有哪些
Tomcat
作为JSP和Servlet的容器
需要配置java_home的环境变量以使tomcat可以使用java,版本要对应Tomcat8.0对应jdk1.8.0,在bin目录下startup.bat脚本启动Tomcat
结构目录
- conf:存放配置文件
server.xml
该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host)
web.xml
文件配置与web应用(web应用相当于一个web站点)
tomcat-user.xml
配置用户名密码和相关权限 - work工作目录:该目录用于存放jsp被访问后生成对应的server文件和.class文件
web站点目录规范
配置虚拟目录
为什么需要配置虚拟目录?
- 如果把所有web站点的目录都放在webapps下,可能导致磁盘空间不够用,也不利于对web站点目录的管理【如果存在非常多的web站点目录】
- 把web站点的目录分散到其他磁盘管理就需要配置虚拟目录【默认情况下,只有webapps下的目录才能被Tomcat自动管理成一个web站点】
- 把web应用所在目录交给web服务器管理,这个过程称之为虚拟目录的映射
方法
- 在其他盘符下创建一个web站点目录,并创建WEB-INF目录和一个html文件;找到Tomcat目录下/conf/server.xml文件;在server.xml中的节点下添加如下代码。path表示的是访问时输入的web项目名,docBase表示的是站点目录的绝对路径;
<Context path="/web1" docBase="D:\web1"/>
- 进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字;xml文件的代码如下,docBase是你web站点的绝对路径;
<?xml version="1.0" encoding="UTF-8"?>
<Context
docBase="D:\web1"
reloadable="true">
</Context>
设置虚拟主机
多个不同域名的网站共存于一个Tomcat中
例子:我现在开发了4个网站,有4个域名。如果我不配置虚拟主机,一个Tomcat服务器运行一个网站,我就需要4台电脑才能把4个网站运行起来。
步骤
在tomcat的server.xml文件中添加主机名
Servlet
入门与生命周期
Servlet其实就是一个遵循Servlet开发的java类。Serlvet是由服务器调用的,运行在服务器端。
Servlet带给我们最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。
编写一个Servlet程序
-
创建一个自定义类,实现Serlvet接口
-
我们发现有5个方法需要重写,有init【初始化】,destroy【销毁】,service【服务】,ServletConfig【Servlet配置】,getServletInfo【Serlvet信息】
-
配置xml文件,光写了Servlet是不行的,Tomcat还要知道浏览器怎么访问这个Servlet。
生命周期
第一次访问Servlet,我们发现init()和service()都被调用了;第二次访问Servlet,service()被调用了;当我们关闭Tomcat服务器的时候,destroy()被调用了。
- 加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
- 初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
- 处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
- 销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
- 卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。
简单总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。 destroy()只有在Tomcat关闭的时候才会被调用。
继承HttpServlet编写Servlet程序
在上面我们实现Servlet接口,要实现5个方法。这样太麻烦了!而HttpServlet类已经实现了Servlet接口的所有方法,编写Servlet时,只需要继承HttpServlet,重写你需要的方法即可,并且它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。
一般我们开发的时候,都是重写doGet()和doPost()方法的。对于idea而言,创建Servlet的时候已经帮你重写好了
细节,ServletConfig、ServletContext
细节
- 一个已经注册的Servlet可以被多次映射,访问多个域名时可以指向同一个资源
- Servlet映射的URL可以使用通配符
通配符有两种格式:*.
扩展名- 正斜杠(/)开头并以
/*
结尾。
同时出现看谁的匹配度高,谁就被选择*.
扩展名的优先级最低
- Servlet是单例的;浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。
- 每次访问请求对象和响应对象都是新的;对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
- 当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。
原则:- 如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}
- 如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题
- 如果在元素中配置了
load-on-startup
,么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。 - 在web访问任何资源都是在访问Servlet
当你启动Tomcat,你在网址上输入http://localhost:8080。为什么会出现Tomcat小猫的页面?
这是由缺省Servlet为你服务的!
我们先看一下web.xml文件中的配置,web.xml文件配置了一个缺省Servlet
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
什么叫做缺省Servlet?凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求
既然我说了在web访问任何资源都是在访问Servlet,那么我访问静态资源【本地图片,本地HTML文件】也是在访问这个缺省Servlet【DefaultServlet】
证实一下:当我没有手工配置缺省Servlet的时候,访问本地图片是可以访问得到的
ServletConfig对象
通过此对象可以读取web.xml中配置的初始化参数。
ServletContext对象
当Tomcat启动的时候,就会创建一个ServletContext对象。它代表着当前web站点
- ServletContext既然代表着当前web站点,那么所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。
- ServletConfig获取的是配置的是单个Servlet的参数信息,ServletContext可以获取的是配置整个web站点的参数信息
- 利用ServletContext读取web站点的资源文件
- 实现Servlet的转发【用ServletContext转发不多,主要用request转发】
** 实现通讯**
ServletContext对象可以被称之为域对象
到这里可能有一个疑问,域对象是什么呢?其实域对象可以简单理解成一个容器【类似于Map集合】
实现Servlet之间通讯就要用到ServletContext的setAttribute(String name,Object obj)方法, 第一个参数是关键字,第二个参数是你要存储的对象
** 获取web站点配置信息**
如果我想要让所有的Servlet都能够获取到连接数据库的信息,不可能在web.xml文件中每个Servlet中都配置一下,这样代码量太大了!并且会显得非常啰嗦冗余。
web.xml文件支持对整个站点进行配置参数信息【所有Servlet都可以取到该参数信息】
<context-param>
<param-name>name</param-name>
<param-value>test</param-value>
</context-param>
读取文件资源
我们以前读取文件的时候,如果程序和文件在同一包名,可以直接通过文件名称获取得到的!,原因很简单,以前我们写的程序都是通过JVM来运行的,而现在,我们是通过Tomcat来运行的
根据web的目录规范,Servlet编译后的class文件是存放在WEB-INF\classes文件夹中的,要进入classes目录中读取文件读取文件的时候都要写上绝对路径,这样太不灵活了。试想一下,如果我将该读取文件的模块移到其他的web站点上,我的代码就又要修改了【因为web站点的名字不一样】。
- 我们通过ServletContext读取就可以避免修改代码的情况,因为ServletContext对象是根据当前web站点而生成的
- 如果我的文件放在web目录下,那么就简单得多了!,直接通过文件名称就能获取
- 通过类装载器读取资源文件。
我的文件放在了src目录下【也叫做类目录】
Response与Request
常用对象
HttpServletResponse对象
http响应由状态行、实体内容、消息头、一个空行组成。HttpServletResponse对象就封装了http响应的信息
请参考:click here
HttpServletRequest对象
请参考:click here