【问题标题】:Issues with mapping multiple controllers映射多个控制器的问题
【发布时间】:2015-06-21 16:02:07
【问题描述】:

我是 spring 新手。尽管我的 Tomcat 日志显示我的 URL 已映射,但我的映射无法正常工作。

INFO: Mapped URL path [/movie/{name}] onto handler 'movieController'
Jun 21, 2015 9:03:24 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/movie/{name}.*] onto handler 'movieController'
Jun 21, 2015 9:03:24 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/movie/{name}/] onto handler 'movieController'
Jun 21, 2015 9:03:24 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/movies] onto handler 'movieController'
Jun 21, 2015 9:03:24 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/movies.*] onto handler 'movieController'
Jun 21, 2015 9:03:24 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/movies/] onto handler 'movieController'
Jun 21, 2015 9:03:24 PM **org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/employeelist] onto handler 'userList'
Jun 21, 2015 9:03:24 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/employeelist.*] onto handler 'userList'
Jun 21, 2015 9:03:24 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/employeelist/] onto handler 'userList'

我在 web.xml 中定义了两个控制器。

<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Spring Web MVC Application</display-name>


    <servlet>       <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>    </servlet>

    <!-- for ListDispatcher -->

    <servlet>       <servlet-name>list-dispatcher</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>    </servlet>


    <servlet-mapping>       <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/test/*</url-pattern>  </servlet-mapping>


    <servlet-mapping>       <servlet-name>list-dispatcher</servlet-name>
        <url-pattern>/list/*</url-pattern>  </servlet-mapping>


<context-param>   <param-name>contextConfigLocation</param-name>  
<param-value>
    /WEB-INF/list-dispatcher-servlet.xml
    /WEB-INF/mvc-dispatcher-servlet.xml   </param-value> </context-param>

    <!-- <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener> --> 
</web-app>

我正在获取 MovieController 中定义的输出。 http://localhost:8080/SpringMVC/test/movies

但是当我给出获取员工列表(另一个控制器)的 URL 时,它不起作用。下面是控制器类。:-

@Controller

public class UserList {


    public ModelAndView getdata() {
        System.out.println("Data");

        ArrayList<Employee> list = getEmpList();

        //return back to index.jsp
        ModelAndView model = new ModelAndView("index");
        model.addObject("lists", list);

        return model;

    }

    @RequestMapping(value="/employeelist", method = RequestMethod.GET) 
    public @ResponseBody  ArrayList<Employee> getEmpList(){
        System.out.println("inside The ArrayList");
        ArrayList<Employee> emp=new ArrayList<Employee>();
        emp.add(new Employee("sougata",25));
        emp.add(new Employee("sahil",30));
        return emp;

    }
}

有人可以帮我从第二个控制器那里得到响应吗? 我使用的网址是:- http://localhost:8080/SpringMVC/list/employeelist

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    更改应用程序中的一段 sn-p 代码。

    在您的情况下,您已将两个控制器分开以进行多项操作。所以根据你的案例场景,在web.xml中替换这个sn-p代码,像这样

    <servlet-mapping>
         <servlet-name>mvc-dispatcher</servlet-name>
         <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    并更改控制器类中的控制器请求映射, 为电影控制器添加这样的,

    @Controller
    @RequestMapping("/movieController")
    public class MovieController {
    

    为 userList 控制器添加这样的,

    @Controller
    @RequestMapping("/userListController")
    public class UserList {
    

    检查 dispatcher-servlet.xml 中正确提及的基于组件的包属性。

    【讨论】:

    • 目前,当我尝试点击此 URL 时:-localhost:8080/SpringMVC/userListController/employeelist 它打印测试行但无法返回 json。下面是我得到的错误。 “此请求标识的资源只能生成具有根据请求“接受”标头不可接受的特征的响应。它进入方法但无法打印json。“你能建议一下吗,
    • 试试这个,这将帮助您在响应中获取 json 对象。在您的方法中添加 ResponseBody 注释... @RequestMapping(value = "/methodURL", method = RequestMethod.GET or POST, headers="Accept=application/json") public @ResponseBody methodName {
    • @RequestMapping(value="/employeelist", method = RequestMethod.GET,headers="Accept=application/json") public @ResponseBody ArrayList getEmpList(){ System.out.println ("在 ArrayList 内"); ArrayList emp=new ArrayList(); emp.add(new Employee("sougata",25)); emp.add(new Employee("sahil",30));返回雇员; }
    • 您是要求将响应返回到同一页面还是不同页面?您是点击 URL 以获取响应还是传递 ajax 请求?
    • 我试图只返回同一页面上的 json。 localhost:8080/SpringMVC/userListController/employeelist 它显示没有为 servlet 请求找到匹配的处理程序:路径'userListController/employeelist',方法'GET',参数映射[[empty]]
    【解决方案2】:

    尝试将produce="application/json" 添加到您的@RequestMapping,如下所示。

    @RequestMapping(value="/employeelist", method = RequestMethod.GET,produces="application/json")

    【讨论】:

    • 似乎问题出在第二个控制器的初始化上。警告:在名称为“mvc-dispatcher”的 DispatcherServlet 中找不到具有 URI [/SpringMVC/userListController/employeelist] 的 HTTP 请求的映射。这里的名字应该是 list-dispatchet-servlet 而不是 mvc-dispatcher。
    • 另外我添加了@RequestMapping(value ="/employeelist", method = RequestMethod.GET,headers="Accept=application/json") 在这里不适用。
    • 在点击 URL 后,您还能看到下面的测试/调试行吗?在 ArrayList 里面
    • 当我给出这个 @RequestMapping(value ="/employeelist", method = RequestMethod.GET) 我能够看到测试线。但是我在浏览器中收到 406 错误。但是一旦我添加了@RequestMapping(value ="/employeelist", method = RequestMethod.GET,headers="Accept=application/json"),我就再也看不到测试线了。
    • 你能在这里分享你的模型班员工吗
    【解决方案3】:

    您是否正在尝试集成 spring MVC 和 CXF 服务? list-dispatcher 的 servlet 类是 web.xml 中的 CXFServlet。 org.apache.cxf.transport.servlet.CXFServlet 如果不是——您实际上不需要两个不同的 servlet 配置。 只需以下

    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
        version="2.4">
        <servlet><servlet-name>mvc-dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>mvc-dispatcher</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
    </web-app>
    

    【讨论】:

    • list-dispatcherorg.springframework.web.servlet.DispatcherServlet1 mvc-dispatcherorg.springframework.web.servlet.DispatcherServlet类> 1这里有什么问题。我无法从第二个控制器得到响应
    • 每个映射中的 url 模式是什么?上面带有通用 servlet 映射的配置对您有用吗?
    • 对于 MovieController 它的 / 对于 UserListController 它的 /list/ 下面的链接是有效的。 localhost:8080/SpringMVC/movieController/movie/pklocalhost:8080/SpringMVC/movieController/movies/name **************for UserListController**************** 试过这个。不工作 localhost:8080/SpringMVC/用户列表控制器/员工列表
    • 请参考:stackoverflow.com/questions/21942486/… 您需要更改 web.xml 中的 servlet-mapping。请注意,在您的情况下,这不是关于两个不同的控制器,而是两个不同的 URL 映射,它们也可以始终位于同一个控制器中。
    猜你喜欢
    • 2011-05-30
    • 2022-09-26
    • 2017-12-31
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    相关资源
    最近更新 更多