【问题标题】:servlet filters not applied at all in Java?Java 中根本没有应用 servlet 过滤器?
【发布时间】:2014-08-08 01:03:24
【问题描述】:

我是使用 Java Servlet 的初学者。我的 servlet 有一些问题。 我的过滤器没有被应用。我在过滤器中有一些打印语句,但我从未在控制台上看到任何打印内容,表明未应用过滤器。此外,我的过滤器应该将生成的 xml 转换为 Json 或 HTML。但它只是返回 xml 本身。

这是我的 web.xml:

<web-app>
        <display-name>CP130 Assignment 8</display-name>
        <servlet>
            <description>Servlet obtaining stock quote from Yahoo Financial Services</description>
            <display-name>CP130QuoteServlet</display-name>
            <servlet-name>StockQuoteJsp</servlet-name>
            <jsp-file>/Quote.jsp</jsp-file>
        </servlet>
        <servlet-mapping>
            <servlet-name>StockQuoteJsp</servlet-name>
            <servlet-class>edu.uw.rgm.web.YahooStockQuoteServlet</servlet-class>
            <url-pattern>/Quote.jsp</url-pattern>
        </servlet-mapping>
        <filter>
            <description>Filter using XSLT to format servlet response</description>
            <display-name>CP130QuoteTransformFilter</display-name>
            <filter-name>QuoteResponseFormatter</filter-name>
            <filter-class>edu.uw.rgm.web.QuoteTransformFilter</filter-class>
            <init-param>
                <description>HTML transform</description>
                <param-name>html-transform</param-name>
                <param-value>xslt/quote2html.xslt</param-value>
            </init-param>
            <init-param>
                <description>JSON transform</description>
                <param-name>json-transform</param-name>
                <param-value>xslt/quote2json.xslt</param-value>
            </init-param>
            <init-param>
                <description>Plain transform</description>
                <param-name>plain-transform</param-name>
                <param-value>xslt/quote2plain.xslt</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>QuoteResponseFormatter</filter-name>
            <servlet-name>StockQuoteJsp</servlet-name>
        </filter-mapping>
        <filter-mapping>
            <filter-name>QuoteResponseFormatter</filter-name>
            <url-pattern>/Quote.jsp</url-pattern>
        </filter-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>

我已经三重检查了 web.xml 中的拼写错误 为什么我的过滤器没有作为响应应用?我还注意到 web.xml 中元素的顺序很重要。如果我在servlet 上方更改位置filters,则会出错。

编辑

过滤器:

public class QuoteTransformFilter implements Filter {
    private FilterConfig cfg;
    private String htmlStylePath;
    private String jsonStylePath;
    private String plainStylePath;

    /**
     * @see Filter#init(FilterConfig)
     */
    @Override
    public void init(final FilterConfig fConfig) throws ServletException {
        cfg = fConfig;
        String styleSheet = cfg.getInitParameter("html-transform");
        htmlStylePath = cfg.getServletContext().getRealPath(styleSheet);
        styleSheet = cfg.getInitParameter("json-transform");
        jsonStylePath = cfg.getServletContext().getRealPath(styleSheet);
        styleSheet = cfg.getInitParameter("plain-transform");
        plainStylePath = cfg.getServletContext().getRealPath(styleSheet);

        cfg.getServletContext().log(htmlStylePath);
        cfg.getServletContext().log(jsonStylePath);
        cfg.getServletContext().log(plainStylePath);
    }

    /**
     * @see Filter#destroy()
     */
    @Override
    public void destroy() {
        // no-op
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
        ServletRequest requestWrapper = request;
        // Illustrate the use of a request wrapper, and the use of a request document
        if ("application/json".equals(request.getContentType()) && request instanceof HttpServletRequest) {
            final ObjectMapper mapper = new ObjectMapper();
            Properties props = mapper.readValue(request.getReader(), Properties.class);
            requestWrapper = new PropertyRequestWrapper((HttpServletRequest)request, props);
        }

        final CharResponseWrapper responseWrapper = new CharResponseWrapper((HttpServletResponse)response);

        String rsType = requestWrapper.getParameter("rstype");
        if (rsType == null) {
            rsType = "html";
        }

        cfg.getServletContext().log("rsType = '" + rsType +"'");

        // pass the request along the filter chain
        chain.doFilter(requestWrapper, responseWrapper);
        final String xml = responseWrapper.toString();
        System.out.println("printing rstype = "+rsType);

        Source styleSource = null;
        String responseStr = xml;
        if (!rsType.equals("xml")) {
            // Select the appropriate sytle sheet
            if (rsType.equals("plain")) {
                System.out.println("plain");
                response.setContentType("text/plain");
                styleSource = new StreamSource(plainStylePath);
            } else if (rsType.equals("json")) {
                response.setContentType("application/json");
                styleSource = new StreamSource(jsonStylePath);
            } else {
                response.setContentType("text/html");
                styleSource = new StreamSource(htmlStylePath);
            }

            // Process the XML document using the stylesheet
            final StringReader sr = new StringReader(xml);
            final Source xmlSource = new StreamSource(sr);

            try {
                final TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer;
                transformer = transformerFactory.newTransformer(styleSource);
                final CharArrayWriter caw = new CharArrayWriter();
                final StreamResult result  = new StreamResult(caw);
                cfg.getServletContext().log("Transforming...");
                transformer.transform(xmlSource, result);
                responseStr = caw.toString();

            } catch(final TransformerConfigurationException ex) {
                cfg.getServletContext().log("Config error", ex);
                return;
            } catch (final TransformerException e) {
                cfg.getServletContext().log("Transform error", e);
                return;
            }
        }
        System.out.println(responseStr);
        response.setContentLength(responseStr.length());
        final PrintWriter out = response.getWriter();
        out.write(responseStr);
        out.close();

    }

}

我为 GET 请求尝试的 URL 是:

http://localhost:8080/StockQuote/Quote.jsp?symbol=GOOG&rstype=plain

【问题讨论】:

  • 向我们展示过滤器代码和您提出的请求示例(URL 和其他相关详细信息)。
  • @SotiriosDelimanolis:在上面添加了它们。
  • 您正在使用ServletContext 记录您的消息。那是寄到哪里的?你检查过吗?您是否尝试过调试您的应用程序并单步执行代码?您是否尝试过更改过滤器代码以引发异常并查看异常是否出现?
  • 我在上面的代码中插入了打印语句,看看它是否打印在控制台上。但什么都没有打印出来。我会检查日志文件。在过滤器代码中抛出异常是个好主意。现在让我检查一下
  • @SotiriosDelimanolis:我尝试在过滤器的 init 方法中抛出异常。但不会抛出异常。我还发现 index.jsp 没有在localhost:8080/StockQuote 加载。页面是空的

标签: java jsp servlets web.xml servlet-filters


【解决方案1】:

我在您的 web.xml 中看到了很多错误。我不知道为什么它没有抛出解析异常。可能是它,而你没有看到它。

  1. servlet-mapping 中不能有 servlet-class 元素,必须在 servlet 中。
  2. 您可以同时拥有jsp-fileservlet-class,但不能同时拥有。
  3. 过滤器应该在 Servlet 之前定义
  4. 当有关联的查询字符串时,最好在url-pattern 的末尾使用**

    <web-app>
        <display-name>CP130 Assignment 8</display-name>
        <filter>
            <description>Filter using XSLT to format servlet response</description>
            <display-name>CP130QuoteTransformFilter</display-name>
            <filter-name>QuoteResponseFormatter</filter-name>
            <filter-class>edu.uw.rgm.web.QuoteTransformFilter</filter-class>
            <init-param>
                <description>HTML transform</description>
                <param-name>html-transform</param-name>
                <param-value>xslt/quote2html.xslt</param-value>
            </init-param>
            <init-param>
                <description>JSON transform</description>
                <param-name>json-transform</param-name>
                <param-value>xslt/quote2json.xslt</param-value>
            </init-param>
            <init-param>
                <description>Plain transform</description>
                <param-name>plain-transform</param-name>
                <param-value>xslt/quote2plain.xslt</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>QuoteResponseFormatter</filter-name>
            <servlet-name>StockQuoteJsp</servlet-name>
        </filter-mapping>
        <filter-mapping>
            <filter-name>QuoteResponseFormatter</filter-name>
            <url-pattern>/Quote.jsp**</url-pattern>
        </filter-mapping>
        <servlet>
            <description>Servlet obtaining stock quote from Yahoo Financial Services</description>
            <display-name>CP130QuoteServlet</display-name>
            <servlet-name>StockQuoteJsp</servlet-name>
            <servlet-class>edu.uw.rgm.web.YahooStockQuoteServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>StockQuoteJsp</servlet-name>            
            <url-pattern>/Quote.jsp**</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    

【讨论】:

  • 关于第2点)你的意思是整个web.xml,我应该只有jsp文件或servlet-class正确吗?
  • 没有。每个 Servlet/Servlet 映射可以有一个 Servlet 类或 JSP
  • 为了清楚起见,对于每个 servlet/servlet 映射组合,我应该让 JSP 或 servlet 类正确吗?我现在面临一个奇怪的问题。我启动了tomcat服务器。它没有在根 / 上显示任何内容。它应该显示tomcat 的欢迎页面。我试过localhost:8080。页面只是空的。页面上没有错误或任何内容
  • 我修复了上述问题。但现在,它没有加载欢迎页面
  • 这意味着你仍然有错误。启动时检查日志和 tomcat 控制台
猜你喜欢
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2015-04-18
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
相关资源
最近更新 更多