jsp只在首次加载时调用action实现代码

当我们在一个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实现代码

基础教程推荐