当我们在一个JSP页面中使用了JSP动作标签(JSP Action
当我们在一个JSP页面中使用了JSP动作标签(JSP Action Tag),比如<jsp:include>
或者<jsp:forward>
,其实际上就是调用了指定页面中对应的Servlet进行处理。在这种情况下,Servlet只会在JSP页面首次被加载时被调用执行,后续如果没有被重新加载,就不会再次被调用了。
下面通过两个示例来详细讲解这种情况下的具体过程。
示例1
我们可以新建一个名为index.jsp
的JSP页面,并在其中使用<jsp:include>
标签引入一个名为MyServlet
的Servlet进行处理。在Servlet中,我们可以输出一行日志来验证Servlet是否被正常调用。
以下是index.jsp
页面的代码:
<html>
<head>
<title>JSP Test</title>
</head>
<body>
<jsp:include page="/MyServlet"/>
<p>Hello, World!</p>
</body>
</html>
以下是MyServlet.java
文件的代码:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyServlet is executed at " + new Date().toString());
response.getWriter().println("<p>MyServlet is executed at " + new Date().toString() + "</p>");
}
}
当我们访问index.jsp
页面时,可以看到浏览器中输出了Hello, World!
和MyServlet is executed at ...
两行内容,表示页面正常访问且Servlet也被正常调用了。
但是如果我们不刷新页面,再次访问index.jsp
,我们会发现MyServlet is executed at ...
这一行内容并没有再次出现。这是因为在第一次访问该页面时,/MyServlet
已经被调用了一次,之后再次访问时,JSP程序会直接将之前调用的结果(而不是重新执行)直接复用。
示例2
我们还可以修改一下上面的示例,使得Servlet的处理结果根据当前时间的不同而发生变化。这样便于我们验证Servlet是否被重新调用了。
以下是index.jsp
页面的代码:
<html>
<head>
<title>JSP Test</title>
</head>
<body>
<jsp:include page="/MyServlet"/>
<p>Hello, World!</p>
</body>
</html>
以下是修改后的MyServlet.java
文件的代码:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Date now = new Date();
System.out.println("MyServlet is executed at " + now.toString());
response.getWriter().println("<p>MyServlet is executed at " + now.toString() + "</p>");
response.getWriter().println("<p>The time in milliseconds is " + now.getTime() + "</p>");
}
}
如果我们在不刷新页面的情况下连续访问index.jsp
页面,我们会发现每次访问/MyServlet
都会打印出新的时间,即表示Servlet每次都被重新调用了。
从上面的示例可以看出,当我们在JSP页面中使用JSP动作标签,如<jsp:include>
或者<jsp:forward>
,调用对应的Servlet进行处理时,Servlet只会在JSP页面首次被加载时被调用执行,后续如果没有被重新加载,就不会再次被调用了。
本文标题为:jsp只在首次加载时调用action实现代码
- Java幂等性解决方案用法介绍 2023-10-08
- jsp+mysql实现网页的分页查询 2023-07-30
- Mybatis-Plus中and()和or()的使用与原理详解 2023-05-14
- Java基本语法和面向对象编程实践 2023-10-08
- java – 当JSON对象作为字符串文字插入时,MySQL JSON列丢失小数精度 2023-11-01
- Java实现贪吃蛇大作战小游戏(附源码) 2023-03-22
- MyBatis实现批量插入方法实例 2023-06-24
- jsp中EL表达式获取数据 2023-12-10
- Java实现优先队列式广度优先搜索算法的示例代码 2022-09-03
- Mybatis关于动态排序 #{} ${}问题 2023-06-23