Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to modify the real-time effectiveness of JSP files

2025-01-16 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Internet Technology >

Share

Shulou(Shulou.com)06/01 Report--

这篇文章将为大家详细讲解有关怎样修改JSP文件的实时生效,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

那JSP文件是怎么样做到改动实时生效的呢

在JSP处理过程中,会判断文件是否生成,是否过期,根据此来决定是否重新编译JSP文件生成Servlet类。这个一般是通过JspServletWrapper的service方法开始调用的。

在该方法中有如下代码:

if (options.getDevelopment() || firstTime ) {//重点看这里

synchronized (this) {

firstTime = false;

// The following sets reload to true, if necessary

ctxt.compile();

}}

默认的情况下,这个options的development属性为true,所以都会进到这个代码块中。

对应的compile方法,有如下代码段:

public void compile() {

createCompiler();

if (jspCompiler.isOutDated()) {//此处判断文件是否过期

if (isRemoved()) {

throw new FileNotFoundException(jspUri);

}

try {

jspCompiler.removeGeneratedFiles();

jspLoader = null; //注意这里

jspCompiler.compile();

jsw.setReload(true); //这里会设置reload标识

jsw.setCompilationException(null);

}

判断过期的代码比较多,这里不全部罗列了,大致包含以下几个点:

检查jsp文件生成的Servlet类对应的class文件,如果不存在,则认为过期

如果class文件修改时间和jsp的修改时间不一致,则认为过期

对于jsp中include的一些资源,如果有更新操作的,也会认为过期

从上面的代码看到,在判断文件过期之后,会执行这样几个操作:

删除旧文件,

编译并生成新文件,

设置reload属性为true

设置jspLoader为null

操作的最后两点,是jsp文件能够修改立即生效的秘密所在。

我们看在jsp所对应的Wrapper的service方法中,判断并执行compile操作之后,第二步就是获取具体的servlet类,这个方法的一些主要代码如下:

public Servlet getServlet() throws ServletException {

if (reload) {

synchronized (this) {

if (reload) {

destroy();

final Servlet servlet;

try {

InstanceManager instanceManager = InstanceManagerFactory.getInstanceManager(config);

servlet = (Servlet) instanceManager.newInstance(ctxt.getFQCN(), ctxt.getJspLoader());

} catch (Exception e) {}

theServlet = servlet;

reload = false;

}}}

return theServlet;

}

我们看,上面首先根据reload标识来判断是否要重新加载Servlet类。而每次的jsp修改,都会导致compile时将此标识设置为true,自然每次的修改都是要加载的。那这个和上面的jspLoader有什么关系呢?

我们注意到instanceManager的newInstance方法,会从JspCompilationContext这个类取Jsp的ClassLoader,这个取classLoader的过程如下:

public ClassLoader getJspLoader() {

if( jspLoader == null ) {//看这里

jspLoader = new JasperLoader

(new URL[] {baseUrl}, //这里的baseUrl,就是应用的file:/D:/xxx/work/Catalina/localhost/test/

getClassLoader(),

rctxt.getPermissionCollection());

}

return jspLoader;

}

在获取jspLoader的,如果这个对象为null,就会新创建一个。这个get到的

jspLoader会被用来执行loadClass的操作,即jsp对应的Servlet类是会被其进行加载的。

假设在请求应用的index.jsp页面,那初次请求时, instanceManager对应的classLoader是一个,当修改jsp文件后再次请求时,又是使用的另一个classLoader,所以新的内容修改被成功加载,而原来旧的内容,已经在compile阶段被清除了。

关于怎样修改JSP文件的实时生效就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Internet Technology

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report