修改 HTML 和 JSP

Posted

技术标签:

【中文标题】修改 HTML 和 JSP【英文标题】:Modifying HTML and JSP 【发布时间】:2017-05-30 12:19:39 【问题描述】:

如何在每个 html 和 JSP 页面上添加 HTML 注释?

我尝试使用过滤器对其进行修改,但它只能修改 JSP 页面,而不能修改 HTML 页面。

我使用了这样的过滤器:

package com.app.server.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class WaterMarkFilter implements Filter 

    private List<String> extensionsToFilter = new ArrayList<>();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException 
        String[] extensions = filterConfig.getInitParameter("extensionsToFilter").split(",");
        for (String extension : extensions) 
            extensionsToFilter.add(extension.trim());
        
    

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
        chain.doFilter(request, response);
        postFilter(request, response);
    

    @Override
    public void destroy() 

    

    private void postFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException 
        String path = ((HttpServletRequest) request).getRequestURI();
        if (canIntercept(path)) 
            response.getWriter().write("modified");
            response.getWriter().close();
        
    

    private boolean canIntercept(String path) 
        if (path.equals("/")) 
            return true;
        
        for (String extension : extensionsToFilter) 
            if (path.endsWith("." + extension)) 
                return true;
            
        
        return false;
    


这是 Web.xml 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">

        <servlet>
            <servlet-name>com.app.configuration ShoppingCartService</servlet-name>
            <servlet-class>com.app.server.servlet.ShoppingCartServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>com.app.configuration ShoppingCartService</servlet-name>
            <url-pattern>/application/ShoppingCartServlet</url-pattern>
        </servlet-mapping>

        <servlet>
            <servlet-name>test</servlet-name>
            <servlet-class>com.app.server.servlet.TestServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>test</servlet-name>
            <url-pattern>/application/test</url-pattern>
        </servlet-mapping>

        <listener>
        <listener-class>com.app.server.ApplicationInitializer</listener-class>
    </listener>

    <filter>
        <filter-name>WaterMarkFilter</filter-name>
        <filter-class>com.app.server.filter.WaterMarkFilter</filter-class>
        <init-param>
            <param-name>extensionsToFilter</param-name>
            <param-value>jsp, html</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>WaterMarkFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

【问题讨论】:

请编辑并发布您的过滤器的完整代码,您的 web.xml(如果在此处声明了过滤器)。 @RC。补充,希望你能找到一些东西 我认为问题在于你在做事之前“链接”到下一个过滤器 @user2997204 检查我的答案。我测试了它。它工作正常。如果它也适合你,别忘了点赞并接受我的回答 很高兴这有效。您是否也考虑过像 Tiles 这样的模板系统,然后将其添加到那里?可能有意义,具体取决于您尝试分离关注点的方式。 【参考方案1】:

实际的问题是如何使用过滤器操作 ServletResponse。My detailed answer with full code example and many links is here

短: 在 doFilter 实现中:

    chain.doFilter 调用之前,准备一个HttpServletResponseWrapper 和一个PrintWriter 调用后,在 PrintWriter 中写入包装响应的副本 +“您想要的文本”

下面是代码更改,以便过滤器也可以与 HTML 一起使用:

public class WaterMarkFilter implements Filter 

    private ServletRequest request;
    private PrintWriter out;
    private CharResponseWrapper wrapper;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
               throws IOException, ServletException 

        this.request = request; 
        out = response.getWriter();
        wrapper = new CharResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, wrapper);

        postFilter();

        out.close();
    

    private void postFilter() throws IOException, ServletException 
        String path = ((HttpServletRequest) request).getRequestURI();
        if (canIntercept(path)) 
            out.write(wrapper.toString() + "modified");
        
        else 
            out.write(wrapper.toString());
        
    

CharResponseWrapper 与 my detailed answer here 中的相同。 还有一个更好的示例如何将文本包含到已创建的 html 中。 仅在末尾添加文本仅适用于纯文本文件。 对于 HTML - 最好在 HTML 中插入文本。这里的示例带有&lt;head&gt; 标签,但它可以适应插入到&lt;body&gt; 标签。

【讨论】:

以上是关于修改 HTML 和 JSP的主要内容,如果未能解决你的问题,请参考以下文章

(jsp+servlet+html+jdbc)修改mysql中数据表信息

.html 页面修改成 .jsp 后缀后中文乱码解决办法。

JSP实现HTML网页对Mysql数据库的数据修改

修改Myecclipse servlet/jsp的默认模板

关于MyEclipse编写jsp很卡的修改方法 (转载)

每次修改完jsp代码都要重启eclipse