做了个小实验,对email.jsp的jspInit()方法进行重写,首先通过ServletConfig获取email,并请其存储在ServletContext中,最后对存储的attribute进行输出。具体配置如下。
web.xml配置:
<servlet>
<servlet-name>email</servlet-name>
<jsp-file>/email.jsp</jsp-file>
<init-param>
<param-name>email</param-name>
<param-value>test@hotmail.com</param-value>
</init-param>
</servlet>
email.jsp:
<%!
public void jspInit() {
ServletConfig config = getServletConfig();
String email = config.getInitParameter("email");
System.out.println("jspInit : "email);
ServletContext ctx = getServletContext();
ctx.setAttribute("email", email);
}
%>
<%= application.getAttribute("email") %>
启动tomcat 结果为:
写道
2012-7-9 16:54:44 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.27
jspInit : test@hotmail.com
2012-7-9 16:54:44 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory D:\tomcat\webapps\docs
2012-7-9 16:54:44 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory D:\tomcat\webapps\examples
2012-7-9 16:54:44 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: contextInitialized()
2012-7-9 16:54:44 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextInitialized()
2012-7-9 16:54:44 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: attributeAdded('org.apache.jasper.compiler.TldLocationsCache', 'org.apache.jasper.compiler.TldLocationsCache@22ce00')
2012-7-9 16:54:44 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory D:\tomcat\webapps\host-manager
2012-7-9 16:54:44 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory D:\tomcat\webapps\manager
2012-7-9 16:54:44 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory D:\tomcat\webapps\ROOT
2012-7-9 16:54:44 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-8080"]
2012-7-9 16:54:44 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-bio-8009"]
2012-7-9 16:54:44 org.apache.catalina.startup.Catalina start
信息: Server startup in 571 ms
jspInit :null
注意其中2行红字部分:
第1行:在容器启动时会对jsp进行转换操作,并调用其jspInit(),因此输出的为test@hotmail.com。此时并没有对email.jsp 进行访问,因此<%= application.getAttribute("email") %>还没有执行。
第2行:对页面(email.jsp) 进行访问,输出的结果为jspInit : null。这里非常奇怪,为什么jspInit会执行2次?而且结果为null。我们知道jspInit()只在初始化的时候执行,而且容器中只有这么一个实例,也就是说最多只会执行一次而已。
通过eclipse debug一下,发现这里分别实例化了2个ServletContext对象。。。于是想到一定是某些配置不对,导致容器的实例化是出现一些问题。
最终发现,一定要配置相应的<servlet-mapping>,而且url-pattern必须为相应email.jsp,修改如下:
<servlet>
<servlet-name>email</servlet-name>
<jsp-file>/email.jsp</jsp-file>
<init-param>
<param-name>email</param-name>
<param-value>test@hotmail.com</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>email</servlet-name>
<url-pattern>/email.jsp</url-pattern>
</servlet-mapping>
目前还不清楚,容器具体的实现细节。
分享到:
相关推荐
8. **生命周期方法**:Servlet 2.3扩展了Servlet的生命周期方法,如`init()`、`service()`、`destroy()`,以及`jspInit()`和`jspDestroy()`,让开发者能更好地控制Servlet的初始化和销毁过程。 9. **静态资源服务...
`<servlet-mapping>` 和 `<url-pattern>` 通常在 `<servlet-mapping>` 元素内部使用,用于指定 Servlet 的映射路径。 #### 3. 假设 web 应用的文档根目录为 MyApp,那么可以从哪里找到 database.jar 文件。(选择1 ...
- 在页面转换阶段,JSP会经历几个关键步骤:编译JSP页面成对应的Servlet类,然后创建该Servlet的实例,最后调用Servlet的`jspInit()`方法。在这些步骤中,对JSP语法的合法性检查和相关标记文件的语法检查是在转换前...
在Web应用的部署描述文件(web.xml)中,通过`<servlet-mapping>`元素可以将Servlet映射到特定URL,如`<servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/utils/LoginServlet</url-pattern...
在初始化阶段,Servlet会调用`init()`方法进行一次性配置。服务阶段,Servlet通过`service()`方法处理HTTP请求。当Web应用不再需要Servlet时,会调用`destroy()`方法释放资源。 JSP的生命周期则分为翻译、编译、...
6. Servlet API:熟悉Servlet API中提供的各种接口和类,如HttpServletRequest、HttpServletResponse、ServletConfig、ServletContext等,它们是进行Servlet开发的基础。 7. 数据共享和数据持久化:了解如何在JSP和...
- **缓冲区**:JSP的输出默认先写入缓冲区,只有在页面完成、缓冲区满或调用flush方法时,内容才会发送到客户端。 2. **Servlet** - **生命周期**:Servlet的生命周期包括加载、初始化(jspInit)、服务(jsp...
- **初始化**:在实例化后,服务器调用Servlet的`init()`方法,用于初始化Servlet,例如设置配置参数。 - **服务**:对于每个来自客户端的请求,服务器都会调用Servlet的`service()`方法,该方法会根据请求类型...
- `jspInit()`: 在Servlet初始化时调用。 2. **服务处理**: - `_jspService()`: 处理用户请求的主要方法。 3. **销毁**: - `jspDestroy()`: 当Servlet容器卸载Servlet时调用。 综上所述,JSP是一种强大的Web开发...
2. **初始化**:Servlet容器调用`init()`方法进行初始化工作,通常在此方法中设置配置参数等。 3. **服务请求**:当客户端发送请求时,Servlet容器调用`service()`方法来处理请求。根据请求类型(GET或POST),可能...
A. 本留言本采用jsp+javabean+servlet+mysql B. 本系统运行环境: ...6、 此留言本实现了MVC模式,完全是通过servlet控制数据,而且使用了连接池,一些基本的类也是完全提供,对学习jsp的MVC模式有很大的帮助。
需要注意的是,`jspInit()`方法在整个Servlet的生命周期中仅执行一次。 - **服务阶段**:对于每次请求,JSP引擎都会创建一个新的线程来调用Servlet实例的`jspService()`方法。若多个客户端同时请求该JSP文件,JSP...
4. **`config`**:`javax.servlet.ServletConfig`,提供了对Servlet配置信息的访问。 5. **`application`**:`javax.servlet.ServletContext`,提供了对整个Web应用上下文的访问。 6. **`page`**:`javax.servlet....
可以重装 JDK 到 1.6 版本,然后将项目的 Java Compiler 改为 1.6 版本,对项目进行重新编译。 6. Mysql 的错误:Data source rejected establishment of connection message from server: "Too many connections...
5. **呼叫jspInit()方法**:在Servlet生命周期中,jspInit()方法用于初始化Servlet,可以在XML配置文件中设置JSP的初始化参数。 6. **呼叫_jspService()方法**:这是Servlet的核心方法,处理客户端的请求,并生成...
之后,servlet的实例被创建,执行jspInit()方法进行初始化工作,此方法仅在servlet生命周期中执行一次。然后,对每个请求,JSP引擎都会创建一个新的线程进行处理,从而达到以多线程方式执行的目的,这大幅降低了系统...
其中,`jspInit()`在Servlet初始化时调用;`jspService()`用于处理请求;`jspDestroy()`在Servlet被卸载前调用。而 `_jspService()` 不是标准方法,通常是由JSP容器内部使用的方法。 #### 四、覆盖JSP文件的初始化...
- B选项:`jspInit()`方法在JSP首次加载时执行一次。 - C选项:每当用户请求JSP时,`_jspService()`方法都会执行一次。 - D选项:`jspDestroy()`方法在JSP实例不再需要时执行,而不是每次请求。 5. 代码输出: ...
3. **Servlet实例的创建与初始化**:接下来,JSP引擎会创建一个对应的Servlet实例,并调用该实例的`jspInit()`方法进行初始化操作。`jspInit()`方法在Servlet的整个生命周期中只会被执行一次,通常用于执行一些一次...
- `jspService()`: 由容器自动生成,不应重写,它是处理请求的核心方法。 **JSP元素** - **JSP脚本元素**:包括注释、表达式、声明和脚本let,它们都用`<%...%>`包裹。 - **指令元素**:以`<%@...%>`开始,用于...