servlet映射中的url-pattern存在问题。我使用的是Spring 3.0并使用带注释的控制器。我已经使用Spring的DispatcherServlet映射了* .do。我试图将@PathVariable与url一起使用 - /test.do/{username}这是一个404.尝试了一些试验和错误,它没有帮助。 url-patter“/”可以正常工作,但我的应用程序的其他部分已被破坏(CSS,图像等)
答案 0 :(得分:2)
当使用带有映射扩展名的url(例如.do,.html等)来弹出时,所有的URL都将由spring处理。因此,您需要将静态资源映射到另一个URL并使用其他servlet进行处理。
示例:您的旧css将映射到http://localhost:8080/css/style.css
,您的css将映射到http://localhost:8080/static/css/style.css
并为/static/*
url
<!-- Servlet for static resource -->
<servlet>
<servlet-name>static</servlet-name>
<servlet-class>com.jegbagus.servlet.DefaultServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>basic</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Mapper for static resource -->
<servlet-mapping>
<servlet-name>static</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
并添加用于处理这些静态请求的servlet。
package com.jegbagus.servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DefaultServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
// Tomcat, Jetty, JBoss, and GlassFish
private static final String COMMON_DEFAULT_SERVLET_NAME = "default";
// Resin
private static final String RESIN_DEFAULT_SERVLET_NAME = "resin-file";
// WebLogic
private static final String WEBLOGIC_DEFAULT_SERVLET_NAME = "FileServlet";
// WebSphere
private static final String WEBSPHERE_DEFAULT_SERVLET_NAME = "SimpleFileServlet";
public String scanDefaultServlet(){
if(this.getServletContext().getNamedDispatcher(COMMON_DEFAULT_SERVLET_NAME) != null) {
return COMMON_DEFAULT_SERVLET_NAME;
} else if(this.getServletContext().getNamedDispatcher(RESIN_DEFAULT_SERVLET_NAME) != null) {
return RESIN_DEFAULT_SERVLET_NAME;
} else if(this.getServletContext().getNamedDispatcher(WEBLOGIC_DEFAULT_SERVLET_NAME) != null){
return WEBLOGIC_DEFAULT_SERVLET_NAME;
} else if(this.getServletContext().getNamedDispatcher(WEBSPHERE_DEFAULT_SERVLET_NAME) != null){
return WEBSPHERE_DEFAULT_SERVLET_NAME;
} else {
throw new IllegalStateException("Cannot determine what Server you currently use");
}
}
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
RequestDispatcher rd = getServletContext().getNamedDispatcher(this.scanDefaultServlet());
HttpServletRequest wrapped = new HttpServletRequestWrapper(req) {
public String getServletPath() {return "";}
};
rd.forward(wrapped, resp);
}
}
答案 1 :(得分:0)
我认为3.0中的URI模板不支持url中的@path变量,扩展名为.do。
您需要使用目录网址模式,就像在web.xml中使用/或/ soft /一样。
您可以设置一个弹出servlet将忽略映射的路径,如下例所示https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/ 要么 使用web.xml,以便对路径(如/ soft / *)的请求仅由spring servlet处理。