为了简化 Web 程序的开发过程,JSP 提供了由容器实现和管理的内置对象,也可以将其称为固有对象,隐含对象。这些内置对象在所有的 JSP 页面中都可以直接使用,不需要 JSP 页面编写者来实例化。JSP页面的内置对象被广泛应用与 JSP 的各种操作中,例如应用 request对象来处理请求、应用 out 对象向页面输出信息,应用 session 对象来保存数据等。
代表请求对象,主要用户接受用户端通过HTTP协议连接传输服务器的数据
代表响应对象,主要用于向客户端发送数据
主要用于向客户端输出数据,out的基类是jspWriter
主要用来分别保存每个月的信息与请求关联的会话;会话状态的维持是web应用开发者必须面对的问题
主要用于保存用户信息,代码片段的运行环境;它是一个共享的内置对象,即一个容器的多个用户共享一个application,故其保存的信息被所有用户所共享
管理网页属性,为jsp页面包装页面的上下文,管理对属于jsp的特殊可见部分中已经命名对象的访问,它的创建和初始化都是由容器来完成的
代码片段配置对象,标识Servlet的配置
处理jsp页面,是object类的一个实例,指的是jsp实现类的实例
处理jsp文件执行时发生的错误和异常,只有在错误页面里才使用,前提是在页面指令里要有isErrorPage=true
JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。
以下是JSP生命周期中所走过的几个阶段:
编译阶段:
servlet容器编译servlet源文件,生成servlet类
初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
执行阶段
调用与JSP对应的servlet实例的服务方法
销毁阶段
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
很明显,JSP生命周期的四个主要阶段和servlet生命周期非常相似,下面给出图示:
当浏览器请求JSP页面时,JSP引擎首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
编译的过程包括三个步骤:
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法就行了,就像下例:
public void jspInit(){
//初始化代码
}
一般来讲程序只初始化一次,servlet也是如此,通常情况下我们可以在jspInit() 方法中初始化数据库连接、打开文件和创建查询表。
JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。
jspDestory()文件在JSP中等价于servlet中的销毁方法。
jspDestory()方法的格式如下:
public void jspDestory(){
//清理代码
}
格式如下:
void_jspService(HttpServletRequest request, HttpServletResponse response)
{
// 服务端处理代码
}
_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生7个HTTP方法的反应,比如GET、POST、DELETE等等。
代码:
<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>
注意:
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);
只需在对应的servlet类中添加servlet注解即可,从浏览器发送请求时,是用当前“工程”下的路径,会去对应servlet类的上面寻找是否存在对应url名称的@webServlet注解,存在的话,调用并执行对应的servlet类。
格式:
@WebServlet("/DemoAction")
public class DemoAction extends HttpServlet{
}
总结:
共同点:注解访问servlet和web配置文件访问servlet都能完成对servlet的访问。
注解访问servlet
优点:代码少,可读性强,易于理解。
缺点:如果大量使用servlet注解,servlet类文件数量过多,不便于查找和修改。
web配置文件访问servlet
优点:集中管理各servlet类路径的映射路径,便于修改和管理。
缺点:代码多,可读性不强,不易于理解。
注意:
有时候在服务器上运行的web程序数据不能及时更新,记得重启一下服务器或者清除浏览器缓存。