Java Web复习——task03:JSP 内置对象和生命周期


前言

为了简化 Web 程序的开发过程,JSP 提供了由容器实现和管理的内置对象,也可以将其称为固有对象,隐含对象。这些内置对象在所有的 JSP 页面中都可以直接使用,不需要 JSP 页面编写者来实例化。JSP页面的内置对象被广泛应用与 JSP 的各种操作中,例如应用 request对象来处理请求、应用 out 对象向页面输出信息,应用 session 对象来保存数据等。


一、JSP内置对象

1.1 HttpServletRequest类和Request对象

代表请求对象,主要用户接受用户端通过HTTP协议连接传输服务器的数据

1.2 HttpServletResponse类和Response对象

代表响应对象,主要用于向客户端发送数据

1.3 JspWriter类的out对象

主要用于向客户端输出数据,out的基类是jspWriter

1.4 HttpSession类的session对象

主要用来分别保存每个月的信息与请求关联的会话;会话状态的维持是web应用开发者必须面对的问题

1.5 ServletContext类的application对象

主要用于保存用户信息,代码片段的运行环境;它是一个共享的内置对象,即一个容器的多个用户共享一个application,故其保存的信息被所有用户所共享

1.6 PageContext类的PageContext对象

管理网页属性,为jsp页面包装页面的上下文,管理对属于jsp的特殊可见部分中已经命名对象的访问,它的创建和初始化都是由容器来完成的

1.7 ServletConfig类的Config对象

代码片段配置对象,标识Servlet的配置

1.8 Object类的Page对象

处理jsp页面,是object类的一个实例,指的是jsp实现类的实例

1.9 Exception对象

处理jsp文件执行时发生的错误和异常,只有在错误页面里才使用,前提是在页面指令里要有isErrorPage=true

二、生命周期

2.1 理解JSP底层功能的关键就是去理解它们所遵守的生命周期

JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。

以下是JSP生命周期中所走过的几个阶段:

  1. 编译阶段:
    servlet容器编译servlet源文件,生成servlet类

  2. 初始化阶段:
    加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法

  3. 执行阶段
    调用与JSP对应的servlet实例的服务方法

  4. 销毁阶段
    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

很明显,JSP生命周期的四个主要阶段和servlet生命周期非常相似,下面给出图示:
在这里插入图片描述

2.2 JSP编译

当浏览器请求JSP页面时,JSP引擎首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。

编译的过程包括三个步骤:

  • 解析JSP文件
  • 将JSP文件转为servlet
  • 编译servlet

2.3 JSP初始化

容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法就行了,就像下例:

public void jspInit(){
	//初始化代码
}

一般来讲程序只初始化一次,servlet也是如此,通常情况下我们可以在jspInit() 方法中初始化数据库连接、打开文件和创建查询表。

2.4 JSP清理

JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。

jspDestory()文件在JSP中等价于servlet中的销毁方法。

jspDestory()方法的格式如下:

public void jspDestory(){
	//清理代码
}

2.5 JSP执行

格式如下:

void_jspService(HttpServletRequest request, HttpServletResponse response)
{
	// 服务端处理代码
}

_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生7个HTTP方法的反应,比如GET、POST、DELETE等等。

三、Servlet的配置方法

3.1 web.xml中Servlet的注解

代码:

<servlet>
		<!-- servlet的内部名称,自定义 -->
		<servlet-name>DemoAction</servlet-name>
		<!-- servlet的类全名:包名+类名 -->
		<servlet-class>com.uplooking.controller.DemoAction</servlet-class>
		<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
		<!-- servlet的内部名称,一定要和上面的内部名称保持一致 -->
		<servlet-name>DemoAction</servlet-name>
		<!-- servlet的映射路径(访问servlet的名称)-->
		<url-pattern>/DemoAction</url-pattern>
</servlet-mapping>
  1. 首先,从浏览器中发送请求,是从当前工程中的路径与servlet-mapping标签中的url-pattern的标签值进行匹配。
  2. 根据这个映射值,找到servlet-mapping标签中的servlet-name的值与servlet标签中的servlet-name进行匹配
  3. 匹配到以后,找到servlet标签中的servlet-class标签中对应的src文件夹下的全路径。
  4. 从而调用并执行相应的servlet类。

注意:

servlet-mapping标签中的servlet-name的值与servlet标签中的servlet-name必须相同。

初始化参数

<init-param>
			<param-name>abc</param-name>
			<param-value>123</param-value>
</init-param>

一个Servlet可以配置一个或多个初始化参数。

在应用程序中,可以使用Servlet的getInitParameter(String param)来读取初始化param对应的参数;若要读取所有的初始化参数名称,则可以使用getInitParameterNames()方法获得所有的参数名称,类型为枚举(Enumeration).
//获取所以初始化参数
Enumeration<String> strs=this.getInitParameterNames();
while(strs.hasMoreElements()){
	str=strs.nextElement();
	System.out.println(str+"   "+this.getInitParameter(str));
	//-->abc 123
	//-->aaa 111
	
}
这些初始化参数也可以由ServletConfig对象获取,Servlet提供getServletConfig()方法提供ServletConfig对象。由ServletConfig获取初始化参数和由Servlet获取初始化参数的方法是一样的。
//两种调用getInitParameter的情况,视情况而定
//this是指ServletConfig的对象config
String str=this.getInitParameter("abc");//第一种

String str=config.getInitParameter("abc");//第二种
初始化参数的一个有趣应用是进行单个文件的访问加密,原理是将用户名和密码写入初始化参数中,这样的好处是简单、方便,缺点是不灵活,安全性也不高,适用于临时性的措施。

上下文参数

<context-param>
		<param-name>root</param-name>
		<param-value>123</param-value>
</context-param>
获取context-param需要使用ServletContext对象。ServletContext对象可以通过在Servlet中的getServletConfig().getServletContext()方法获得。得到ServletContext对象后,使用getInitParameter(String param)方法获取名为param的参数值,通过getInitParameterNames()获取所有的context-param名称。
ServletContext context=this.getServletContext();
String root=context.getInitParameter("root");
System.out.println("root="+root);

3.2 注解访问Servlet

只需在对应的servlet类中添加servlet注解即可,从浏览器发送请求时,是用当前“工程”下的路径,会去对应servlet类的上面寻找是否存在对应url名称的@webServlet注解,存在的话,调用并执行对应的servlet类。

格式:

@WebServlet("/DemoAction")
public class DemoAction extends HttpServlet{
}

总结:

共同点:注解访问servlet和web配置文件访问servlet都能完成对servlet的访问。

注解访问servlet

优点:代码少,可读性强,易于理解。

缺点:如果大量使用servlet注解,servlet类文件数量过多,不便于查找和修改。

web配置文件访问servlet

优点:集中管理各servlet类路径的映射路径,便于修改和管理。

缺点:代码多,可读性不强,不易于理解。

注意:

有时候在服务器上运行的web程序数据不能及时更新,记得重启一下服务器或者清除浏览器缓存。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值