Servlet 介绍
- java提供用于生成动态web资源技术,java 服务器端的应用小程序 server + applet = servlet
- servlet必须实现或间接实现servlet接口(
javax.servlet.Servlet
)- 实现:implements Servlet
- 间接实现:extends Xxxx , Xxxx implements Servlet
效果:http://localhost:8080/ms/HelloServlet ,输入的地址,tomcat将能执行一个servlet程序 (调用一个类相应的方法)
为了使tomcat可以找到处理类,需要编写配置文件,给当前web项目进行配置(web.xml)
<servlet> <servlet-name>xxxx <servlet-class>com.mszs.servelet <servlet-mapping> <servlet-name>xxxx <url-pattern>/HelloServlet</url-pattern>
- servlet继承树
- 通用实现类(默认实现类) class GenericServlet implements Servlet
- 通过实现类与协议无关的实现的,没有具体的功能。
- 子类 HttpServlet, class extends GenericServlet
- 与Http协议有关的
- 自定义servlet继承HttpServlet,复写方法,doGet 用于处理get请求,doPost 用于处理post请求
- 通用实现类(默认实现类) class GenericServlet implements Servlet
手动
- javac -cp “D:\java\tomcat\apache-tomcat-7.0.42\lib\servlet-api.jar” -d . HelloServlet.java
servlet生命周期
- init(ServletConfig) ,初始化方法
- 执行者(调用者):tomcat (servlet容器)
- 执行次数:1次
- 执行时机
- 默认情况:第一次请求前(在service方法之前)
- 服务器启动时:
配置启动时机,内容为数字,数字越小优先初始化
- service(ServletRequest,SerlvetResponse) , 处理
- 执行者:tomcat
- 执行次数:每一次请求,执行一次
- destroy() ,销毁
- 执行者:tomcat
- 执行次数:1次
- 执行时机:服务器正常关闭
init方法参数ServletConfig
- 当前servlet的配置对象,通过配置对象获得需要的配置信息
- api
- config.getServletName() ,获得配置的servlet名称 web.xml
名称 - getInitParameter(java.lang.String name) 通过指定的名称获得初始化参数
- 如果没有返回null
- 需要在web.xml进行配置
- getInitParameterNames() ,获得所有初始化参数的名称
- getServletContext() ,可以通过ServletConfig对象获得ServletContext对象的引用
- config.getServletName() ,获得配置的servlet名称 web.xml
service方法参数:
- ServletRequest,http协议请求封装对象
- 接口:javax.servlet.ServletRequest
- 子接口:javax.servlet.http.HttpServletRequest , 与http协议有关的对象
- ServletResponse,http协议响应的封装对象
- 接口:javax.servlet.ServletResponse
- 子接口:javax.servlet.http.HttpServletResponse , 与http协议有关的对象
tomcat的实现类,实现的接口是子接口
ServletRequest impl = new HttpServletRequestImpl() service(ServletRequest req,....){ // req 运行时,是HttpServletRequest子接口的实现类 HttpServletRequest request = (HttpServletRequest)req; } ## 对比 Object obj = new ArrayList(); demo(Object xxx){ xxx,运行时表示ArrayList ** 思考:将xxx转换成List List list = (List)xxx; } * 结论【】 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp;
GenericServlet 实现分析
abstract class GenericServlet implments Servlet,ServletConfig{
//实现4个方法 ,init() , destroy() ,getServletConfig (),getServletInfo() 没用
// 提供成员变量缓存ServletConfig
private SerlvetConfig config;
void init(SerlvetConfig config){
this.config = config;
this.init();
}
ServletConfig getServletConfig(){
return this.config;
}
//##提供ServletConfig 对象4个api简洁操作
SerlvetContext getServletContext(){ //提供简洁方式
return getServletConfig().getServletContext();
}
String getServletName(){
return getServletConfig().getServletName();
}
...
// 提供没有参数初始化
public void init(){
}
//与协议无关,没有具体实现
abstract service()
}
class DemoServlet extends GenericServlet{
//必须实现service
public void service ... {
//使用父类的方法
getServletConfig().getServletContext(); //获得父类缓存的ServletConfig,再获得ServletContext
getServletContext(); //简洁方式获得ServletContext
// 如果需要使用ServletConfig中的api可以直接使用父类提供简洁api
}
public void init(){
//复写的父类的init()方法
}
}
** 总结:
* 如果有父子关系,使用方法时,this表示的当前运行类
List list = new ArrayList();
* GenericSerlvet 需要执行初始化操作时,复写init() 没有参数的
* 如果复写生命周期的init方法,必须在方法体中添加super.init(config);
* 如果没有添加this.getServletConfig() api都失效了,将出现空指针
HttpServlet 详解
abstract class HttpServlet extends GenericServlet{ //一个抽象类,但没有抽象方法,不允许new,只能作为父类存在。
public void service(ServletRequest req,ServletResponse resp){
//req 变量只能使用与协议无关的api
//强转
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//request 变量 就可以使用与协议有关的api
service(request,response);
}
public void service(HttpServletRequest request,HttpServletResponse response){
// 获得HTTP请求的请求方式:GET、POST
String method = request.getMethod();
if("GET".equals(method)){
doGet(request,reposone);
} else if("POST"...){
doPost(request,response);
}
}
// 支持get请求
public void doGet(HttpServletRequest request,HttpServletResponse response){
* 抛异常,发送错误状态码
response.sendError("405","提示信息")
}
// 执行post请求
public void doPost(HttpServletRequest request,HttpServletResponse response){
}
}
class EndServlet extends HttpServlet{
//get,复写doGet方法
public void doGet(HttpServletRequest request,HttpServletResponse response){
//执行
}
//post,复写doPost方法
public void doPost(HttpServletRequest request,HttpServletResponse response){
//执行
}
}
- 总结
- HttpServlet根据http协议,对程序进行分流
- get请求将执行doGet方法
- post请求将执行doPost方法
- HttpServlet根据http协议,对程序进行分流
- get和post总结
- post请求
- 表单:
- ajax: 将提交设置成post(了解)
- get请求,默认请求
- 表单:
- 超链接: <a href=””
- 图片:<img src=””
- 等
- post请求
servlet路径配置
…. 分类
- 1 完全匹配,例如:/a/b/c/HelloServlet ,浏览器访问:http://localhost:8080/day08/a/b/c/HelloServlet
- 要求:必须/开头
- 2 不完全匹配,例如:/a/b/c/* ,浏览器访问:http://localhost:8080/day08/a/b/c/HelloServlet
http://localhost:8080/day08/a/b/c/ABCDServlet
- 表示只要是/a/b/c目录下的所有资源都匹配
- 注意:特殊的配置 “/* ,匹配所有”
- 3 通配符匹配,例如:*.do ,浏览器访问:http://localhost:8080/day08/a/b/HelloServlet.do
- 只要扩展名为.do都匹配
- 例如:*.jsp ,扩展名为jsp文件都进行匹配
4 默认路径,/ ,如果1,2,3都不匹配,将使用4
优先级:1 > 2 > 3 > 4
- 思考: /*.jsp ,错误
- 1 完全匹配,例如:/a/b/c/HelloServlet ,浏览器访问:http://localhost:8080/day08/a/b/c/HelloServlet
ServletContext
- ServletContext ,表示的servlet的上下文对象,别名:servlet管理者
- 每一个web项目都对应一个ServletContext对象
- 服务器启动时,由tomcat创建
- 服务器关闭时,由tomcat销毁
功能:(api)
获得资源
- getRealPath(String) ,获得发布到tomcat下面的绝对路径,注意:必须/开头,表示web项目的根
- getRealPath(“/a/1.html”) –> d:/tomcat/webapps/day08/a/1.html
- getResourceAsStream(java.lang.String path) ,与getRealPath相同,获得的资源表示的流
- getResourcePaths(java.lang.String path) 获得所有的内容
- getRealPath(String) ,获得发布到tomcat下面的绝对路径,注意:必须/开头,表示web项目的根
属性操作,Attribute,相当于是一个Map对象
- setAttribute(name,value) ,相当于map.put(key,value) , 设置
- getAttribute(name),相当于map.get(key) ,获得
- removeAttribute(name),相当于map.remove(key) ,移除
- 注意:多用户,多浏览器之间共享数据
- web项目的初始化参数‘
getInitParameter(java.lang.String name) 获得初始化内容 getInitParameterNames() 获得所有名称
servlet模板修改
- 1.myeclipse安装目录/myeclipse.ini ,查看第4行 , 目的:查看Common目录位置
- common/ ,当前目录
- ../common ,上一级目录
- c:/ ,指定目录
- 2.进行common/plugins目录,查询文件com.genuitec.eclipse.wizards_*.jar
- 3.拷贝jar文件,并修改 (注意:先备份)
- 先将扩展名修改zip
- zip/templates/Servlet.java ,进行修改
- 将修改的内容,替换myeclipse jar即可,先将zip改成jar
总结
- 总结:就是接口编程,所有的实现类都在web服务(tomcat)里,操作与实现类无关。
- Servlet接口:javax.servlet.Servlet
- 所有servlet实现类必须实现接口,提供init(ServletConfig) ,service(ServletRequest,ServletResponse), destroy()
- ServletConfig接口:javax.servlet.ServletConfig
- 每一个servlet的配置对象
- 常用:可以获得ServletContext 引用 ,config.getServletContext()
- ServletContext接口:javax.servlet.ServletContext
- 每一个web项目都具有一个ServletContext对象,作为servlet上下文(管理者),可以操作所有内容
- ServletRequest接口:javax.servlet.ServletRequest
- 每一次请求的封装对象
- 子接口:javax.servlet.http.HttpServletRequest ,http协议有关
- ServletResponse接口:javax.servlet.ServletResponse
- 每一次响应的封装对象
- 子接口:javax.servlet.http.HttpServletResponse ,http协议有关
- GenericServlet类,Servlet通用实现类,与协议无关
- HttpServlet类,Http协议servlet实现,doGet、doPost与协议有关的具体方法
- Servlet接口:javax.servlet.Servlet