【问题标题】:Spring-mvc servlet mapping, is it possible to have "/" for servlet 1 and "/server/" for servlet 2?Spring-mvc servlet 映射,servlet 1 可以有“/”,servlet 2 可以有“/server/”吗?
【发布时间】:2013-03-19 09:12:40
【问题描述】:

目前我有以下web.xml 配置:

<servlet>
    <servlet-name>Website</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Website</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>Server</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Server</servlet-name>
    <url-pattern>/server/</url-pattern>
</servlet-mapping>

至于两个示例控制器:

@Controller
public class ApiRequests {
    protected final Logger logger = Logger.getLogger(ApiRequests.class);

    @RequestMapping(value = "api.json", produces = {"application/json"}, method = RequestMethod.GET)
    @ResponseBody
    public String handleActionJson(final HttpServletRequest request){
        return "{test: 'blaat'}";
    }
}

@Controller
@RequestMapping("/")
public class IndexController {
    @RequestMapping("*.html")
    public void showIndex(){

    }
}

现在我的问题是,当我尝试调用 /server/api.json url 时,服务器不会给出 json 响应,而是给我以下错误:

PageNotFound:1108 - No mapping found for HTTP request with URI [/WorldDefense/server/api.json] in DispatcherServlet with name 'Website'

这基本上意味着它试图在网站 servlet 而不是服务器 serlvet 中搜索 /server/api.json,至于我的问题:是否有可能让这个设置工作? (所以 /server/ 映射到服务器 servlet 和所有其他 url 组合到网站 servlet)

编辑 1 我更新了代码以反映 Costi Ciudatu 建议的更改,但它仍然不起作用。我删除了@RequestMapping("/server"),现在在handleActionJson 方法中只有@RequestMapping。两者都会导致这些错误:

10:57:26,046  WARN PageNotFound:1108 - No mapping found for HTTP request with URI [/WorldDefense/server/server/api.json] in DispatcherServlet with name 'Website'
10:57:40,509  WARN PageNotFound:1108 - No mapping found for HTTP request with URI [/WorldDefense/server/api.json] in DispatcherServlet with name 'Website'

根据tomcat日志映射:

服务器-servlet

11:03:49,655  INFO RequestMappingHandlerMapping:178 - Mapped "{[/api.json],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}" onto public java.lang.String com.world2.worlddefense.server.controllers.ApiRequests.handleActionJson(javax.servlet.http.HttpServletRequest)
11:03:50,125  INFO RequestMappingHandlerMapping:178 - Mapped "{[/api.json],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}" onto public java.lang.String com.world2.worlddefense.server.controllers.ApiRequests.handleActionJson(javax.servlet.http.HttpServletRequest)

网站-servlet

11:03:50,380  INFO RequestMappingHandlerMapping:178 - Mapped "{[//*.html],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public void com.world2.worlddefense.website.controllers.IndexController.showIndex()
11:03:50,381  INFO RequestMappingHandlerMapping:178 - Mapped "{[/login],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.world2.worlddefense.website.controllers.TempTestController.showTest()

【问题讨论】:

    标签: servlets spring-mvc mapping url-pattern


    【解决方案1】:

    您可以在同一个web.xml 中定义多个DispatcherServlets,并根据需要映射它们。但是,servlet 映射不应反映在控制器的@RequestMapping 中。你的控制器总是映射到相对于 servlet 映射的路径;在您的情况下,我认为如果您尝试 /WorldDefence/server/server/api.json... 可以得到 JSON 响应...

    如果您希望不同的控制器与两个调度程序相关联,您只需确保在相应的应用程序上下文中加载了正确的控制器:Website-servlet.xmlServer-servlet.xml,以防您遵守此约定。

    长话短说,ApiRequests 的映射应该是“/”,而不是“/server”,并且该控制器应该只包含在“服务器”调度程序上下文中。

    附带说明,从 3.2.x 开始,.json 扩展由 ContentNegotiationManager 处理,因此您的控制器应返回一些域对象,这些对象将由 Spring HttpMessageConverter 机制透明地编组,从而能够生成媒体JSON 以外的其他类型,毫不费力。

    【讨论】:

    • 查看更新的问题,它仍然给我带来了问题。此外,服务器和网站的控制器加载在自己的应用程序上下文中(Website-servlet.xml 和 Server-servlet.xml)
    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2014-05-27
    • 2015-03-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多