代码之家  ›  专栏  ›  技术社区  ›  Chris Williams

将请求解释为JSP而不是通过servlet

  •  0
  • Chris Williams  · 技术社区  · 14 年前

    这应该是相对简单的,但我还没有找到一个如何做的描述。

    我的设置是一个简单的Web应用程序,它通过一个servlet处理每个请求(对于这个问题,我将称之为myVerythingservlet)。下面是我的web.xml的一个稍微修改过的版本:

    <servlet>
        <servlet-name>MyEverythingServlet</servlet-name>
        <servlet-class>blah.blah.blah.MyEverythingServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>MyEverythingServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

    现在,servlet非常简单,可以做一些工作(当work.do是路径的一部分时),如果在路径中指定了.txt文件,我们将进行一些验证,然后加载文件并发送文本作为响应:

    response.getOutputStream().print( content );
    

    我想做的是:

    • 在servlet中,如果请求是.jsp文件的URL,那么我希望在将字符串写入响应之前,能够让容器解释jsp scriptlet parts/taglib的内容。
    • 将我的web.xml更改为让它在myVerythingServlet之外处理.jsp文件。
    1 回复  |  直到 14 年前
        1
  •  4
  •   BalusC    14 年前
    • 在servlet中,如果请求是.jsp文件的URL,我希望能够让容器在将字符串写入响应之前解释jsp scriptlet parts/taglib的内容。

    没有直接的API可以像那样以编程方式处理JSP文件。理论上,您希望在公共Web内容中使用JSP,并且 向前地 向JSP发出的请求。你可以用 RequestDispatcher#forward() .

    if (request.getServletPath().endsWith(".jsp")) {
        request.getRequestDispatcher(request.getServletPath()).forward(request, response);
    } else {
        // Write "plain" to response as you did.
    }
    

    您可能只想对路径的正确性进行一些检查,但这至少应该给您一个通用的想法。但是有一个小问题:servlet将被递归调用,因为它被映射到 /* . 你宁愿换这个 MyEverythingServlet 由A Filter 它只是将作业的剩余部分委托给AppServer的内置默认servlet。有一个 Servlet 倾听 /* 已经是一种设计气味表明它应该是 滤波器 从一开始;)

    • 将我的web.xml更改为让它在myVerythingServlet之外处理.jsp文件。

    你不能有“否定” url-pattern 在里面 web.xml . 你能做的最好的事情就是让servlet监听一个更具体的 访问路径 喜欢 *.txt /static/* 把JSP文件放在外面。