`

Cached JSP引发的问题与思考

阅读更多

       在最近的Project中遇到了一个表面上看起来蛮奇怪的问题。具体问题是这样的,在Project中,所有跨模块的constant都会定义在一个名字叫Constants的interface中,然后在JSP里面,我们也会相应地使用到这些constant。 每当更改了Interface里面某一个constant的值的时候,在JSP中并不会反应出来,从而引起了很多混淆。由于Constants是由我来负责的,每当我修改了constant的值,都会有同事问我,到底constant的值修改了没有,为什么JSP上面没有看到更新的值。一开始我也很迷惑,后来仔细一想,应该是由于Cached JSP引起的。大家都知道,JSP的本质仍然是Servlet,一个更新的JSP文件在第一次被访问的时候,会translate(翻译)成一个Servlet,然后再被编译成.class文件,存放在固定的一个folder中,以后的访问就不必再进行编译的动作,从而提高JSP的访问速度。而JSP的编译动作通常都会在JSP本身发生改变后进行,那么JSP所依赖的class发生变化之后,是不是也会引发JSP的重新编译呢?带着这个问题,我做了一个很简单的试验。
        我在WSAD中建立了一个很简单的Dynamic Web Project,这个Project中之包含了一个JSP:Test.jsp和一个interface:Constants。具体代码如下:

<HTML>
<HEAD>
<%@ page import="constants.Constants" %>
<TITLE>Test.jsp</TITLE>
</HEAD>
<BODY>
<P><%=Constants.NAME%></P>
</BODY>
</HTML>
                                                                          ( Test.jsp )

public interface Constants {
    
public static final String NAME = "Java";
}
                                                                      ( Constants.java )

编译Project并且在浏览器中访问Test.jsp,我们可以看到"Java"字样出现在屏幕上。接着,我将NAME的值从"Java"改为"Perhaps"并将Project编译。但是不管我是以刷新页面的方式还是重启Server,都没有办法看到我期待的"Perhaps"。当然,改动一下Test.jsp就可以得到我想要的结果。从这个小小的试验可以看出,Constants这个interface的改变并没有让JSP重新编译。 试验到这里并没有结束,因为同事告诉我说,interface的改变没有引发依赖这个interface的JSP文件的编译动作,是因为interface中variable是final所致。既然有了这样的解释,我就再来验证一下。
        我新建了一个class:NewConstants并且在Test.jsp中增加了对它的访问。具体代码如下:

public class NewConstants {
    
public static final String NAME = "Fantasy";
}

重复以上的步骤,当我改变了NAME的值之后,譬如改为"Soft",编译Project却会引发JSP的重新编译。 由此可以得出,final关键字的使用并非问题的关键所在。
        最后我得出的结论就是JSP是否能够自动编译,需要看所依赖的是class还是interface。如果是class,则class的改动也会相应引起JSP的编译,而interface则不会。这只是我的试验的结论,哪位朋友可以更深入地对这个问题解释一下呢?在下不胜感激了。:)
分享到:
评论

相关推荐

    模版的样式文件(css_cached.jsp)

    里面有关于常用样式的注释 大部分是我关注的,还有一部分很简单的,我就没有注释

    cached-0.1.0.jar

    jar包,亲测可用

    前端开源库-coffeeify-cached

    Coffeeify-Cached插件的出现解决了这个问题。它实现了缓存功能,使得在多次构建过程中,已经编译过的CoffeeScript文件不会再次进行编译,而是直接从缓存中读取结果。这样,在开发过程中,即使频繁修改和保存文件,也...

    oracle参数open_cursors与session_cached_cursors详解.pdf

    Oracle 参数 open_cursors 与 session_cached_cursors 详解 Oracle 数据库中,open_cursors 和 session_cached_cursors 是两个重要的参数,它们对 Oracle 的运行性能产生了直接的影响。本文将详细解释这两个参数的...

    CacheD_l2_

    Ida database for cached server.

    Python库 | cached-1.0.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:cached-1.0.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Laravel开发-cached-embed

    `cached-embed`正是为了解决这个问题而诞生的,它将获取的嵌入信息存储在本地缓存中,避免了频繁的外部网络请求。 **一、安装与配置** 要在Laravel项目中使用`cached-embed`,首先需要通过Composer进行安装: ```...

    Fast Priority Queues for Cached Memory.

    Fast Priority Queues for Cached Memory.

    前端项目-angular-cached-resource.zip

    "angular-cached-resource"是专门为AngularJS设计的一个模块,其核心目标是在用户离线时也能实现与RESTful API的交互,从而提升应用的可用性和用户体验。 **Cached-Resource模块的原理和功能** Cached-Resource...

    cached-property, 在类中,用于缓存属性的修饰器.zip

    cached-property, 在类中,用于缓存属性的修饰器 缓存属性 用于在类中缓存属性的修饰器。为什么?使时间或者计算的昂贵属性快速而简便地缓存。因为我厌倦了把这个代码从非网络项目复制到非web项目。我需要在 python ...

    flutter_cached_pdfview:Flutter的增强PDF视图

    flutter_cached_pdfview 用于显示iOS和Android的本机PDF视图的软件包,支持从其他资源(例如Path,Asset或Url)打开并对其进行缓存。 支持= [ ]; 从路径打开Pdf(本地文件) 从资产打开PDF 从URl中打开Pdf并将...

    sql学习 session_cached_cursors.sql

    sql学习 session_cached_cursors.sql

    PyPI 官网下载 | django-cached-functions-0.1.1.tar.gz

    《PyPI与Django-Cached-Functions:提升Python后端性能的利器》 在Python的开发世界中,PyPI(Python Package Index)是广大开发者获取和分享Python软件包的重要平台。资源“django-cached-functions-0.1.1.tar.gz...

    Python 3.8中实现functools.cached_property功能

    缓存属性( cached_property )是一个非常常用的功能,很多知名Python项目都自己实现过它。我举几个例子: bottle.cached_property Bottle是我最早接触的Web框架,也是我第一次阅读的开源项目源码。最早知道 cached_...

    use-cached:React缓存的钩子

    构建在之上,以提供与TTL /到期支持的无缝缓存集成。安装yarn add use-cached# ORnpm install use-cached用法 import { cached } from 'use-cached'// or import its default, which is the same functionimport ...

    node-cached:受Play缓存API启发的用于node.js的简单缓存库

    cached = require ( 'cached' ) ; kittens = cached ( 'kittens' ) ; // Set a key using a plain value kittens . set ( 'my.key' , 'Hello World' ) ; // Set a key using a lazily created promise (or value) ...

    git-cached:按需缓存git仓库

    可以设置一个可选的全局变量GIT_CACHED_DIR 。 这是存储缓存的对象的位置。 默认值如下所示。 export PATH= $HOME /bin: $PATHexport GIT_CACHED_DIR= $HOME /.gitobjectstore用法gitc接受所有git命令。 对于它不...

    rails-settings-cached:Rails应用程序的全局设置

    Rails设置已缓存 在Rails应用程序中存储全局设置的最佳解决方案。...$ bundle add rails-settings-cached 生成您的设置: $ rails g settings:install # Or use a custom name: $ rails g settings

    打开缓存版本「Open Cached Version」-crx插件

    打开谷歌缓存版本的链接。右键点击一个链接,然后选择“打开... 打开Goog​​le链接的缓存版本。 右键单击链接,然后选择“打开Goog​​le的缓存版本”以打开带有该链接的Google缓存版本的新标签。 支持语言:English

    gulp-companeo-concatanduglify-cached:将grunt-companeo-concatanduglify-cached导出到gulp

    gulp-companeo-concatanduglify-cached 将grunt-companeo-concatanduglify-cached导出到gulp 仅在必要时才对每个文件进行丑化,然后再进行合并 入门 这个插件需要Gulp 如果您以前从未使用过 ,请务必查看《指南》...

Global site tag (gtag.js) - Google Analytics