通用Servlet到JSP的映射

通用Servlet到JSP的映射,jsp,servlets,servlet-mapping,Jsp,Servlets,Servlet Mapping,我有一个包含许多JSP文件的web应用程序,我想删除URL中显示的.JSP扩展名,而不必将每个servlet映射到类似的页面名称。为此,我希望以一种通用的方式将所有servlet重定向到JSP文件,例如映射/Login到/Login.JSP。 我将所有servlet映射到一个过滤器,如下所示。这适用于重定向到*.jsp,但最终结果是一个URL仍然包含.jsp扩展名的空白页面 <servlet> <servlet-name>PageNameFilter</s

我有一个包含许多JSP文件的web应用程序,我想删除URL中显示的.JSP扩展名,而不必将每个servlet映射到类似的页面名称。为此,我希望以一种通用的方式将所有servlet重定向到JSP文件,例如映射/Login到/Login.JSP。
我将所有servlet映射到一个过滤器,如下所示。这适用于重定向到*.jsp,但最终结果是一个URL仍然包含.jsp扩展名的空白页面

 <servlet>
    <servlet-name>PageNameFilter</servlet-name>
    <servlet-class>PageName</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>PageNameFilter</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>


public class PageName extends HttpServlet
{
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        String uri = request.getRequestURI();

        if (!uri.endsWith(".jsp"))
        {
            String newPage = uri + ".jsp";

            RequestDispatcher dispatcher = request.getRequestDispatcher(newPage);
            dispatcher.forward(request, response);
        }
        else
        {
            // Here when we have a full URL (ie: /Login.jsp)

            // ??? WHAT TO DO HERE ???
        }
    }
}

页面名称过滤器
页码
页面名称过滤器
/*
公共类PageName扩展了HttpServlet
{
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException
{
字符串uri=request.getRequestURI();
如果(!uri.endsWith(“.jsp”))
{
字符串newPage=uri+“.jsp”;
RequestDispatcher=request.getRequestDispatcher(newPage);
转发(请求、响应);
}
其他的
{
//当我们有一个完整的URL时(即:/Login.jsp)
//??在这里做什么???
}
}
}

我能够通过自动化servlet映射来实现这一点。所以,归根结底就是运行一个脚本,并将映射转换为Web.xml。此脚本(windows cmd)生成一个名为servletmap.xml的文件,其中包含要包含的映射

@echo off

set outFile=servletmap.xml

echo. > %outFile%


for /f %%i in ('dir ..\WebContent\*.jsp /b') do (

echo %%~ni

echo   ^<servlet^> >> %outFile%
echo     ^<servlet-name^>%%~ni^</servlet-name^> >> %outFile%
echo     ^<jsp-file^>/%%i^</jsp-file^> >> %outFile%
echo   ^</servlet^> >> %outFile%
echo   ^<servlet-mapping^> >> %outFile%
echo     ^<servlet-name^>%%~ni^</servlet-name^> >> %outFile%
echo     ^<url-pattern^>/%%~ni^</url-pattern^> >> %outFile%
echo   ^</servlet-mapping^> >> %outFile%

echo. >> %outFile%
echo. >> %outFile%
)
@echo关闭
set outFile=servletmap.xml
回声。>%输出文件%
对于('dir..\WebContent\*.jsp/b')中的/f%%i(
回声%%~ni
回声^>>%outFile%
echo^%%~ni^>>%outFile%
echo^/%i^>%outFile%
回声^>>%outFile%
回声^>>%outFile%
echo^%%~ni^>>%outFile%
回声^/%~ni^>>%outFile%
回声^>>%outFile%
回声。>>%outFile%
回声。>>%outFile%
)

我终于在没有servlet映射的情况下使用tuckey的URLRewite动态地完成了这项工作。请参阅此处的SO帖子

为什么不在web应用程序的web.xml文件中映射JSP?以/test.jsp为例,如果可能的话,我试图避免将每个jsp文件映射到servlet。我有150多个JSP文件,这将是一个熊维护。这并不难做到。您不需要映射到Servlet。您将每个JSP文件映射到一个将成为其url模式的名称。然后需要维护150*2(映射和servlet)配置、添加、删除、名称更改等。如果不能在Tomcat中实现自动化,我想需要使用Apache桥和重写规则来完成。因此我尝试为每个JSP文件添加映射,我用命令行脚本生成了它们,并将300个新条目粘贴到web.xml中。我测试了一个映射,它成功了。300只雄猫在床上拉屎。它不会启动,jsp编译器会发现代码中不存在的问题。