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

时间:2010-09-07 20:54:29

标签: java jsp servlets jboss

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

我的设置是一个简单的Web应用程序,它通过servlet处理每个请求(我将这个问题称为MyEverythingServlet)。这是我的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,我希望能够在将String写入响应之前让容器解释JSP scriptlet parts / taglib内容。
  • 更改我的web.xml,让它处理MyEverythingServlet之外的.jsp文件。

1 个答案:

答案 0 :(得分:4)

  
      
  • 在servlet内部,如果请求是.jsp文件的URL,我希望能够在将String写入响应之前让容器解释JSP scriptlet parts / taglib内容。
  •   

没有直接的API可用于以编程方式处理JSP文件。从理论上讲,您希望将JSP放在公共webcontent中,并将转发请求发送到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替换为Filter,它只是将作业的剩余部分委托给appserver的内置默认servlet。让Servlet/*已经是一种设计气味,表明它应该从一开始就是Filter;)

  
      
  • 更改我的web.xml,让它处理MyEverythingServlet之外的.jsp文件。
  •   

url-pattern中不能有“否定”web.xml。最好的办法是让servlet监听更具体的url-pattern *.txt/static/*,并将JSP文件保存在外面。