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