一、HTTP协议:消息头的特点
1、用于客户端和服务器端说的悄悄话(消息头相当于服务器和浏览器之间的一些暗号指令)
二、HTTP协议:常用请求消息头
三、HTTP协议:常用响应消息头
四、Servlet入门
javax.servlet.Servlet接口:任何的Servlet必须实现的接口(被容器调用)
void init(ServletConfig config):初始化一个Servlet时会被调用
void service(ServletRequest req,ServletResponseresp):针对用户的每一次请求,此方法都会被调用
void destroy():当一个Servlet对象被摧毁时,调用该方法。
五、Servlet的编写步骤
1、建立标准的javaWeb应用目录结构
FirstApp
2、在classes目录下建立一个类,直接或间接的实现Servlet这个接口
package com.itheima;
import java.io.*;
import javax.servlet.*;
public class HelloServlet extends GenericServlet{
}
3、编译java源文件(编译前把servlet-api.jar 加入到classpath中)
setclasspath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar
进入到classes目录中,执行以下语句进行编译:
javac -d . HelloServlet.java
4、修改web.xml,对servlet进行URL映射
<?xml version="1.0"encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
</web-app>
5、访问该Servlet的地址是:http://localhost:8080/FirstApp/hello
六、Servlet的生命周期
1、默认情况下:只有第一次访问Servlet对象时,才会被实例化,并调用init方法。
2、只要初始化了,Servlet的对象就驻留内存了
3、当应用被卸载或者Tomcat被关掉时,才会调用destroy方法,释放Servlet占用的资源。
4、针对用户的每一次请求,服务器都会采用线程的机制调用service方法。
Tips:
编写一个Servlet也可以通过集成
javax.servlet.GenericServlet:覆盖掉service方法
javax.servlet.http.HttpServlet:于HTTP协议有关的Servlet,应该集成该类。
不应该覆盖掉其中service方法。因为其中有一些标准的实现,(典型模板方法设计模式)。
应该根据客户端的请求方式,覆盖掉doXXX方法。
Servlet规范的类包:
javax.servlet
javax.servlet.http. 存放的接口、抽象类与HTTP协议有关
小知识:
修改MyEclipse自动生成的Servlet的模板
1、关闭MyEclipse
2、找到MyEclipse的安装目录
3、搜索*wizard*,找到com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar
4、打开,找到templates\Servlet.java,此文件就是模板文件
5、(修改前先备份)修改该文件,再推回去
八、Servlet映射的细节
Tips:Servlet映射的细节
Serlvet映射的路径可以使用通配符*,但只有以下2中写法:
以*开头,以扩展名结尾:<url-pattern>*.do</url-pattern>
以*结尾,以/开头:<url-pattern>/action/*</url-pattern>
路径匹配多个Servlet映射时:
绝对匹配优先于通配符
都是用通配符时,/开头的优先级高
都是用通配符时,都以/开头又有多个匹配:从前往后开始匹配
如果一个Servlet的映射路径为一个"/",那么这个Servlet称之为默认的Servlet,
它负责处理所有找不到的映射请求路径。
Tips:Servlet的生命周期
当应用被容器加载时就初始化Servlet对象,而不必等到第一个用户来访时才初始化。
<servlet>
</servlet>
七、Servlet的配置参数:ServletConfig
<servlet>
ServletConfig:代表了针对当前Servlet的配置参数init-param中配置的参数
常用的方法:
String getInitParameter(String paramName):获取指定参数名称的取值
Enumeration getInitParameterNames():获取所有的参数的名称
九、线程安全问题
1、SingleThreadModel接口是一个标识接口(过时了)
如果实现了该接口,可以在内存中搞出多个Servlet实例为用户服务;或者对为用户服务的方法进行同步处理。
具体看实现:
Tomcat服务器采用的前者。
尽量使用局部变量。
十、ServletContext对象
1、容器加载JavaWeb应用时,都会为之创建一个ServletContext对象。一个应用只有一个ServletContext对象。
2、ServletContext对象是一个域对象。
域对象说明其内部维护了一个Map<String,Object>,生命周期与ServletContext同在。
Map<String,Object> map = newHashMap<String,Object>();
public void setAttribute(String name,Object obj){//向Map中放东东
}
public Object getAttribute(String name){
}
public void remove(String name){
}
a、实现Servlet间共享数据
b、获取JavaWeb应用的全局参数
<context-param>
String getInitParameter(String paramName)
Enumeration getInitParameterNames()
c、实现请求转发
请求重定向:客户端行为
请求转发:服务器的行为
RequestDispatcher getRequestDispatcher(Stringpath):path:目标的地址。该地址必须以"/"开头,此"/"就代表当前的应用/day04
RequestDispatcher.forward(request,response);
d、读取资源文件的三种方式
one:ResourceBundle:
特点:只能读取properties的配置文件。且只能读取类路径下的配置文件。
two:ServletContext:getRealPath(Stringpath):path资源的路径。该地址必须以"/"开头,此"/"就代表当前的应用/day04,返回在磁盘上的实际绝对路径。
特点:读取任何位置上的任何文件。
three:ClassLoader
特点: