Web阶段(servlet)

1.servlet概述
servlet技术是有一门由sun公司提供的动态资源开发的技术。servlet本质就是一个java文件。存放在servlet容器中。
servlet容器:存储并运行servlet的环境,tomcat服务器。
web容器:存储并运行web资源(动态、静态资源)的环境,tomcat服务器。
2.servlet开发
a.编写serlvet文件,放入servlet容器。
编写一个.java文件,并实现Servlet接口即可成为一个servlet文件。
具体实现:继承GenericServlet抽象类,重写service方法。
编写FirstServlet类,内部添加:
package cn.tedu.servlet;
import java.io.;
import javax.servlet.
;
public class FirstServlet extends GenericServlet{
public void service(ServletRequest req,ServletResponse res)
throws ServletException,IOException{
res.getWriter().write(“hello servlet!!!”);
}
}
临时修改classpath,添加javax扩展包。
在命令提示符中输入:set classpath=%classpath%;D:\software\apache-tomcat-7.0.62\lib\servlet-api.jar (注:必须按照这样写classpath中不能出现空格,后面的包路径可以直接拖动。)
带包编译:
javac -d . FirstServlet.java(javac -d . java文件名)
将编译后的目录放入到一个web应用的classes目录中。
b.配置servlet映射。
在web.xml中添加和标签。

	<!-- 准备访问的资源的真实路径 -->
	<servlet>
		<servlet-name>FirstServlet</servlet-name> // FirstServlet为servlet文件名。
		<servlet-class>cn.tedu.servlet.FirstServlet</servlet-class>	 //路径为servlet文件所在的路径。
	</servlet>
	<!-- 准备访问的资源的映射路径 -->
	<servlet-map>
		<servlet-name>FirstServlet</servlet-name> // FirstServlet为servlet文件名。
		<url-pattern>/servlet/FirstServlet</url-pattern> //路径为映射的虚拟路径,即在浏览器中输入的路径。
	</servlet-map>

3.servlet继承关系
Servlet —— 基础接口servlet接口
GenericServlet 通用servlet(抽象类),重写service()方法。
HttpServlet 是和HTTP协议相关的servlet。HTTPServlet其中包含和HTTP协议相关的api操作,更善于HTTP相关开发。

	在浏览器中访问:
		localhost/Day07_servlet/servlet/FirstServlet
		这样就可以访问到Day07_servlet

4.Servlet运行过程:
如何和确定使用哪一台虚拟主机提供服务?
在请求头中读取Host头中的虚拟主机名称,确定是哪一台虚拟主机。
Host — 此时使用缺省虚拟主机提供服务。
如何确定访问的是当前虚拟主机中的哪一个web应用?
在请求行的资源名部分,可以确定访问的web应用虚拟路径。
如何确定访问的是当前web应用的那个资源?
在请求行的资源名称部分,可以确定访问的是哪一个web资源的虚拟路径名称。
如何根据资源名确定当前web资源的真实路径?
根基web.xml文件发现虚拟路径和真实路径匹配的信息。
访问的servlet,其中service()缓冲区中的内容如何向页面中输出?
先将response缓冲区中的内容组织成一定结果,然后再发送给浏览器解析使用。
将数据放入响应缓冲区,等待service方法加载完毕,再将数据发送到浏览器中显示。
5.Servlet生命周期
在用户访问servlet的时候,会在tomcat的内存中创建一个servlet对象,这个对象会驻留在tomcat内存中。在创建servlet对象的时候,还会自动调用init()方法完成一些初始化的操作。在存在servlet对象之后,每一个用户访问servlet对象,就是调用其身上的service()方法提供服务。在tomcat服务器关闭或者web应用被移出容器的时候servlet对象会被销毁(servelt随着web应用的销毁而销毁)。在销毁之前会调用一次destroy()方法执行一些善后的操作。
6.request和response对象何时产生?
在servlet对象创建之后,request和response对象产生。
7.问题:HttpServletRequest和HttpServletResponse都是接口
两个接口并不能创建对象,而是有各自接口的子实现类创建的对象,这两个子实现类分别为HttpServletRequestWrapper、HttpServletResponseWrapper
8.问题:为什么静态资源也可以加载?
在地址栏中输入的index.html也会作为虚拟路径使用,它和servlet运行过程一致,可是在web.xml中没有与index.html匹配的路径,所以这个虚拟路径会交个DefaultServlet处理,这个servlet称之为缺省Servlet。缺省Servlet会将index.html与所有的静态资源相比较,一旦有匹配项则在浏览器中显示,如果没有匹配项则在页面中展示404错误。
结论:DefaultServlet是为了展示静态资源和不存在资源而使用的一个Servlet文件。
9.修改Servlet模板
参考课前资料
10.Servlet细节——标签组成
servlet组成是由两个标签servlet及servlet-mapping组成,其中servlet称之为注册servlet标签,servletmapping称之为映射servlet标签。
如果有多个路径要映射在同一个servlet身上,那么需要重复书写映射servletmaping标签。修改其中的url-parttern标签。

<servlet>
	<servlet-name</servlet-name>
	<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name></servlet-name>
	<url-parttern></url-parttern>
</servlet-mapping>

11.Servlet细节——通配映射
如果有多个虚拟路径同时映射在一个servlet身上,这些路径还十分相似,这时就可以将它们写成一个通配的映射方式。
通配映射的方式:

	方式一:以"/"开头,以"/*"结尾。
		例:<servlet-mapping>
				<servlet-name>AnyName</servlet-name>
				<url-pattern>*.do</url-pattern>
			</servlet-mapping>		
	方式二:"*.后缀"的形式使用。(通常使用*.do)
		例:<servlet-mapping>
				<servlet-name>AnyName</servlet-name>
				<url-pattern>/action/*</url-pattern>
			</servlet-mapping>
	/*表示将全部地址栏中的路径做拦截,所有的路径都会访问这个虚拟路径对应的Servlet。

12.Servlet细节——映射顺序
对于如下的一些映射关系:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 .do (永远匹配级最低)
问题:
当请求URL为“/abc/a.html”,“/abc/
”和“/”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/abc/
”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/”和“.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/”和“.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
当请求URL为“/xxx/yyy/a.do”时,“/”和“.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
总结:Servlet映射路径与URL匹配程度越高,越优先使用,*.do匹配级别永远最低。
13.Servlet细节——DefaultServlet
在浏览器中访问的静态资源,会经过web.xml文件,如果没有任何一个虚拟路径和这个资源名所匹配,则会交给DefaultServlet处理,DefaultServlet会使用这个资源名和所有的静态资源去匹配,如果可以匹配则使用静态资源展示,
如果没有匹配的静态资源,则返回404错误页面。
14.Servlet的细节
如果在元素中配置了一个元素,若标签中的数字为0或者大于0,那么web应用程序在启动时就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法,当时一个负数时或者没有
指定时,则指示容器在该servlet被选择时才加载,正数的值越小,启动该servlet的优先级越高。
举例:

	<servlet>
		<servlet-name>invoker</servlet-name>
		<servlet-class>
			org.apache.catalina.servlets.InvokerServlet
		</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>
	如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,
	服务器会自己决定初始化顺序。

15.Servlet的细节——线程安全
sun公司提供了一个SingleThreadModel接口用于解决线程安全问题,对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程
分别调用一个独立的Servlet实例对象。实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同
时调用的问题。(该接口已经被标记为过时的)
!!真正解决线程安全的方式:
尽量少的使用全局变量,多使用局部变量。
合理加锁,利用锁机制,锁住关键部分代码,因为锁会降低程序的执行效率,所以不能锁住过多的代码。
16.Servlet的生命周期和运行过程总结
生命周期:在servlet被初次访问的时候,会在tomcat内存中创建一个对象,这个对象会驻留在tomcat内存中,后续访问的用户都会使用同一个servlet对象。在servlet对象创建的时候会调用init()执行初始化操作。每一次访问
servlet都是调用其中的service()方法提供服务。在服务器关闭或者web资源被移出容器的时候servlet对象会被销毁。在Servlet销毁之前会调用distory()方法,做一些善后处理操作。
运行过程:
浏览器发出请求,将域名解析为ip地址,访问对应ip地址的服务器,在根据端口号确定访问的是tomcat服务器。
再根据请求头host确定访问哪一台虚拟主机。
再根据请求行确定请求web应用虚拟路径。
再根据请求行确定请求的哪一个web资源虚拟路径。
再根据web.xml文件与虚拟路径相比较,如果有对应的servlet映射路径,则将创建一个servlet对象。
再将响应结果放入response缓冲区中,在服务器中组织成一定结构。
由服务器发送到浏览器中,浏览器解析执行。
17.request对象
request概述:
代表HTTP请求的对象:
请求的组成:一个请求行,多个请求头,一个空行,请求实体内容。
继承结构:
ServletRequest——request请求的最高级别接口。
HttpServletRequest 在原有的接口之上实现了和HTTP协议相关的方法,这个接口更善于HTTP相关开发。
HttpServletRequest的API操作:
功能一:获取浏览器相关的信息
getRequestURL方法 – 返回客户端发出请求完整URL
getRequestURI方法 – 返回请求行中的资源名部分
getQueryString方法 – 返回请求行中的参数部分
getRemoteAddr方法 – 返回发出请求的客户机的IP地址
getMethod – 得到客户机请求方式
!!getContextPath – 获得当前web应用虚拟目录名称 – 在写路径时不要将web应用的虚拟路径的名称写死, 应该在需要写web应用的名称的地方通过getContextPath方法动态获取
功能二:获取请求头信息
getHeader(name)方法 — String
getHeaders(String name)方法 — Enumeration
getHeaderNames方法 — Enumeration
getIntHeader(name)方法 — int
getDateHeader(name)方法 — long(日期对应毫秒)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值