Servlet 整体加载过程如下
1、Web服务器接受request。
2、请求发给Servlet引擎,如果已经加载servlet,class 则直接执行,否则从硬盘中查找class 加载进来。
3、执行Service方法处理请求,并返回给web服务器。
4、web服务器返回给客户端。
Servlet的继承关系为
Servlet 接口
|
GenericServlet 抽象类
|
HttpServlet 实现类
|
普通Servlet 子类
Servlet生命周期
1、装载及实例化Servlet
每次访问时候会检查文件修改时间来决定是否重新loader,过程为硬盘-》内存。至于是启动时候装载还是在访问时候装载是由容器来定。
2、初始化 执行init方法
带参数的init方法和无参数的init方法分2种。
如果ServletConfig 参数不空的情况下,调用super.init(config);来初始化父类的成员变量ServletConfig。
初始化
public abstract class GenericServlet{
private ServletConfig _config;
public void init(ServletConfig conf){
_config=config;
}
public String getInitParameter(String s){
_config.getInitParameter(s);
}
}
3、处理客户请求 执行service方法
PrintWriter output = resp.getWriter();
4、销毁 执行destroy方法
JSP四种元素
1、脚本元素
a.表达式
格式:<%= %>
转化形成Servlet: out.print(express);
b.脚本小应用程序:
格式:<% %>
转化形成Servlet: _jspService方法中语句内容
c.声明:
格式:<%! %>
转化形成Servlet: 类内部,_jspService方法外部内容;
2、动作元素
<%@page import="java.util.*l"%>
<%@page errorPage="error.jsp"%>
<%@include file="resource_url"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3、指令元素
<jsp:include page="" flush=""/>
<jsp:forward page=""/>
4、EL元素
JSP九个对象
reqeust
response
pageContext
session
application
out
config
page
exception
RequestDispatcher
RequestDispatcher r=ServletContext.getRequestDispatcher(String url);
r.forward(HttpServletRequest req,HttpServletResponse res);
r.include(HttpServletRequest req,HttpServletResponse res);
RequestDispatcher.forward同一请求 新的资源来处理 只能是转移请求到别的页面
RequestDispatcher.include同一请求 还是第一个资源返回客户端 可以包含别的页面内容
HttpServletRequest.sendRedirect不同请求 新请求
创建RequestDispatcher
方法一:ServletContext.getRequestDispatcher();只能使用绝对路径 /开头 这里是应用根目录 表单中是服务器
方法二:HttpServletRequest.getRequestDispatcher();绝对和相对都可以使用
这两个都可以在两个资源间传递一些数据
serAttribute()->Map.put
getAttribute->Map.get
三种方式:
1) RequestDispatcher.forward();
2)RequestDispatcher.include();
3)HttpServletResponse.sendRedirect();
是否同一个Request 地址栏显示 / 返回给用户的内容 是否可以转发至不同的Web应用地址
forward 是 请求资源的URL Web应用 目的资源响应内容 否
include 是 请求资源的URL Web应用 请求目的资源混合响应内容 否
sendRedirect 否 跳转目的资源的URL 服务器 目的资源响应内容 是 sendRedirect("http://www.sohu.com");
form表单 服务器
web.xml 应用
forward和redirect的区别
区别主要有四点:
1. 请求方不同
redirect: 客户端发起的请求
forward: 服务端发起的请求
2. 浏览器地址表现不同
redirect: 浏览器地址显示被请求的url
forward: 浏览器地址不显示被请求的url
3. 参数传递不同
redirect: 重新开始一个request,原页面的request生命周期结束。
forward: forward另一个连接的时候。request变量是在其生命周期内的。另一个页面也可以使用,其实质是 把目标地址include
4. 底层运作不同:
redirect: 发送的请求信息又回送给客户机,让客户机再转发到另一个资源上,需要在服务器和客户机之间增加一次 通信
forward: 服务器端直接找到目标,并include过来
创建RequestDispatcher
方法一:ServletContext.getRequestDispatcher();只能使用绝对路径 /开头 这里是应用根目录 表单中是服务器
方法二:HttpServletRequest.getRequestDispatcher();绝对和相对都可以使用