重点内容:
Servlet的生命周期:Servlet交给Tomcat服务器运行的
生命周期相关的方法生命周期:
1.构造方法:当第一次访问servlet的时候调用,一般情况下,构造方法只会执行一次。(servlet在tomcat中是单例的)
2.init():servlet初始化--在构造方法执行之后执行,并且也只会调用一次
3.service()方法:每次调用servlet都会调用 (调用多次) 用于调用doGet() doPost() 处理请求(根据不同的请求调用不用的处理方法)
4. destroy()方法:servlet销毁时调用 (重新部署项目、重启服务器调用、关闭服务器调用)
load-on-startup:servlet自动加载。如果servlet的初始化参数比较多,那么第一次访问的时候,就会占用很长时间。
将该servlet提前到服务器启动的时候创建
配置:
<servlet>
<servlet-name>lifeCycleServlet</servlet-name>
<servlet-class>com.igeekhome.servlet.LifeCycleServlet</servlet-class>
<!-- 将该servlet提前到服务器启动的时候创建 -->
<load-on-startup>1</load-on-startup> <!-- 数值:优先级 数值越大,优先级越低 -->
</servlet>
<servlet-mapping>
<servlet-name>lifeCycleServlet</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
HttpServletRequest:请求对象 获取请求参数
HttpServletResponse:响应对象 设置响应信息
ServletContext
ServletConfig:获取加载servlet时初始化参数(一个web应用可以有多个servletConfig对象,取某一个Servlet的初始化参数,只能针对该servlet对象的ServletCOnfig对象进行获取)
(1)创建:在初始化servlet时创建该对象
(2)获取:在init()有参方法中进行获取
init(ServletConfig config)中的方法:
- ① java.lang.String getInitParameter(java.lang.String name) 获取指定初始化参数值
- ② java.util.Enumeration<java.lang.String> getInitParameterNames() 返回初始化参数的name(以枚举类型返回) 如果该servlet没有初始化参数 则返回空的枚举。
- ③ServletContext getServletContext() 返回ServletContext对象
- ④ java.lang.String getServletName() 返回servlet的名称
ServletContext对象:servlet上下文对象,代表了web应用环境(一个web应用只有一个servlet上下文对象)
ServletConfig对象包含了ServletContext对象
ServletContext对象:
创建:在加载web应用的时候创建该对象
获取:从ServletConfig中获取(从ServletRequest对象中也能获取)
常用方法:(数据共享方式:域对象,GET+URL)
域对象相关:(域对象:获取数据 设置数据 用于数据在不同资源间的共享)【 ServletContext是一个域对象】(方法)
void
|
removeAttribute(java.lang.String name) 移除属性
|
void
|
setAttribute(java.lang.String name, java.lang.Object object) 设置属性
|
java.lang.Object
|
getAttribute(java.lang.String name) 获取属性
|
java.util.Enumeration<java.lang.String>
|
getAttributeNames() 获取多个属性
|
java.lang.String
|
返回当前应用路径
|
java.lang.String | getInitParameter(java.lang.String name) 全局参数 |
java.util.Enumeration<java.lang.String> |
getInitParameterNames() 获取全局参数
|
boolean |
setInitParameter(java.lang.String name, java.lang.String value) 设置初始化参数
|
与转发有关的方法:
getRequestDispatcher(java.lang.String path) 分派,转发
|
界面跳转:
html->html
html->servlet
servlet->html
servlet->servlet
重定向(set)
|
转发(get)
|
1.地址发生改变,指向重定向后的地址
|
1.地址不会发生改变
|
2.重定向可以重定向到当前web资源,也可以定向到其他web资源或者网络资源都可以
|
2.转发只能转发到当前web资源
|
3.不能使用request域对象传值 ,重定向前后两个资源的request是不一样
|
3.转发可以使用request域对象传值
|
域对象:用于数据在不同资源间的共享
|
域对象: ServletContext HttpServletRequest HttpSession PageContext
|
重定向:
(1)拼接参数(适用于简单字符串)
例:reapose.sendReadirect("d?name=jack");
Person person = new Person("jack",20);
(2)使用域对象
例 : ServletContext sc = request.getServletContext( );
sc.setAttribute("person",person);
request.setAttribute("person",person );注意在“d”中无法接收因为重定向 “c”"d"是两个不同的request对象
|
重定向:
Servlet传递
response.sendRedirect("d");
config配置
获取web应用路径
System.out.println(context.getContextPath( ));
设置域对象
Context.setAttribute("name",张三);
获取域对象
System.out.println(context.getAttribute("name"));
移除对象
System.out.println(context.getAttribute("name") );
context.removetAttribute("name");
|
数据共享方式:
GET方式提交 拼接在URL后面
location.href = "c?name="+val;
局限性:只能传递string类型,不能传递对象
|
使用域对象
会话管理:对浏览器客户端与服务端的会话过程中的会话数据进行管理
现实:打开QQ 开始聊天 结束聊天 【聊天记录->会话数据】
Web:打开网页 浏览数据 关闭网页
域对象:HttpServletRequest(必须使用转发技术) ServletContext(数据覆盖,因为整个web应用只有一个上下文对象)
|
转发
进行转发:
r equest.getRequestDisPathcher(“d”).forward(request,response);
跳转到index.jsp——html 转发地址保持不变
(1)获取上下文对象
ServletContext = request.getServletContext();
(2)获取转发对象
RequestDispatcher rd = Context.getRequestDispatcher("/index.html“);
RequestDispatcher rd =request.getRequestDispatcher("/index.html“);
(3)执行转发
(4) 字符编码集
response.setHead("context-type","text/html",charset=utf-8);
request.setCharacterEncoading("utf-8");
|
实现过程:
1.通过配置文件获取到完整类名
2.通过完整的类名创建字节码对象
3.通过反射创建servlet对象(构造方法)
Object obj = clazz.newInstance( );
4.获取init方法
Mothod m = object.getDeclareMethod("init",ServletConfig.class) 实例化servlet对象
5.调用init方法
m.invoke(obj.config)
6.获取service方法
|