java之Servlet(七)

学习路径

  • 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

结构目录

在这里插入图片描述

  1. conf:存放配置文件
    server.xml该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host)
    web.xml文件配置与web应用(web应用相当于一个web站点)
    tomcat-user.xml配置用户名密码和相关权限
  2. work工作目录:该目录用于存放jsp被访问后生成对应的server文件和.class文件
web站点目录规范

在这里插入图片描述

配置虚拟目录

为什么需要配置虚拟目录?

  • 如果把所有web站点的目录都放在webapps下,可能导致磁盘空间不够用,也不利于对web站点目录的管理【如果存在非常多的web站点目录】
  • 把web站点的目录分散到其他磁盘管理就需要配置虚拟目录【默认情况下,只有webapps下的目录才能被Tomcat自动管理成一个web站点】
  • 把web应用所在目录交给web服务器管理,这个过程称之为虚拟目录的映射
    方法
  1. 在其他盘符下创建一个web站点目录,并创建WEB-INF目录和一个html文件;找到Tomcat目录下/conf/server.xml文件;在server.xml中的节点下添加如下代码。path表示的是访问时输入的web项目名,docBase表示的是站点目录的绝对路径;
<Context path="/web1" docBase="D:\web1"/>
  1. 进入到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程序
  1. 创建一个自定义类,实现Serlvet接口

  2. 我们发现有5个方法需要重写,有init【初始化】,destroy【销毁】,service【服务】,ServletConfig【Servlet配置】,getServletInfo【Serlvet信息】
    在这里插入图片描述

  3. 配置xml文件,光写了Servlet是不行的,Tomcat还要知道浏览器怎么访问这个Servlet。
    在这里插入图片描述

生命周期

第一次访问Servlet,我们发现init()和service()都被调用了;第二次访问Servlet,service()被调用了;当我们关闭Tomcat服务器的时候,destroy()被调用了。

  1. 加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
  2. 初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
  3. 处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
  4. 销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
  5. 卸载。当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
细节
  1. 一个已经注册的Servlet可以被多次映射,访问多个域名时可以指向同一个资源
  2. Servlet映射的URL可以使用通配符
    通配符有两种格式:
    1. *.扩展名
    2. 正斜杠(/)开头并以/*结尾。
      同时出现看谁的匹配度高,谁就被选择*.扩展名的优先级最低
  3. Servlet是单例的;浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。
  4. 每次访问请求对象和响应对象都是新的;对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
  5. 当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。
    原则:
    1. 如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}
    2. 如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题
  6. 如果在元素中配置了load-on-startup,么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
  7. 在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站点

  1. ServletContext既然代表着当前web站点,那么所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。
  2. ServletConfig获取的是配置的是单个Servlet的参数信息,ServletContext可以获取的是配置整个web站点的参数信息
  3. 利用ServletContext读取web站点的资源文件
  4. 实现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站点的名字不一样】。

  1. 我们通过ServletContext读取就可以避免修改代码的情况,因为ServletContext对象是根据当前web站点而生成的
  2. 如果我的文件放在web目录下,那么就简单得多了!,直接通过文件名称就能获取
  3. 通过类装载器读取资源文件。
    我的文件放在了src目录下【也叫做类目录】
Response与Request
常用对象

HttpServletResponse对象
http响应由状态行、实体内容、消息头、一个空行组成。HttpServletResponse对象就封装了http响应的信息
请参考:click here
HttpServletRequest对象
请参考:click here

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值