test45656 2021-03-27 19:48 采纳率: 0%
浏览 3

问一个关于古老jsp的问题,jsp不改变网页链接刷新会有缓存,解决的方法是给每一个引入的文件后面添加

问一个关于古老jsp的问题,jsp不改变网页链接刷新会有缓存,解决的方法是给每一个引入的文件后面添加一个随机值,有没有什么方法可以遍历添加,那么多页面不可能每次都手动添加,如果要是别人新引入js,忘了添加,还是存在缓存问题。
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-23 21:14
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在JSP中,为了防止浏览器缓存导致的性能问题,我们可以使用<c:if>标签来检查是否已经加载了某个资源(例如JS文件)。如果已经加载,则跳过该资源的再次加载。以下是一个简单的示例:

    <c:if test="${requestScope.resourceAlreadyLoaded == true}">
        <!-- 如果资源已经被加载 -->
    </c:if>
    

    在这个例子中,resourceAlreadyLoaded是一个在JSP上下文中定义的变量,用于存储资源是否被加载过的信息。如果这个变量的值为true,则表示资源已经被加载,不再需要重新加载。

    如果你希望遍历所有的文件并为每个文件添加一个随机值作为唯一标识符,你可以使用Java的Stream API和Map集合。这是一个可能的解决方案:

    import java.util.*;
    import org.apache.jasper.servlet.JspServlet;
    import javax.servlet.jsp.JspException;
    
    public class ResourceLoader {
        private Map<String, String> resourceCache = new HashMap<>();
    
        public void loadResource(String fileName) throws JspException {
            try {
                // 加载资源
                Class<?> resourceClass = Class.forName(fileName);
                Object resourceInstance = resourceClass.newInstance();
    
                // 保存到cache
                resourceCache.put(fileName, resourceInstance.getClass().getName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                throw new JspException("Failed to load resource " + fileName, e);
            }
        }
    
        public boolean isResourceCached(String fileName) {
            return resourceCache.containsKey(fileName);
        }
    
        public Object getResource(String fileName) {
            if (!isResourceCached(fileName)) {
                loadResource(fileName);
            }
            return resourceCache.get(fileName);
        }
    }
    

    在这个示例中,我们首先尝试加载资源,然后将结果保存到resourceCache中。之后,我们可以通过getResource方法获取已加载的资源实例或其类名。这样,你就可以确保你的所有资源都是唯一的,并且不会因为多次加载而出现性能问题。

    评论

报告相同问题?