簡體   English   中英

基於Spring MVC Java的配置-未檢測到servlet調度程序

[英]Spring MVC Java based configuration - Not detecting servlet dispatcher

我正在編寫一個Spring MVC Web應用程序。 我正在嘗試使用基於Java的配置來配置Spring,但是Spring無法在不添加其他XML配置的情況下檢測到我的控制器。

我的前端控制器類如下所示:

package no.magnus.controller; 
public class FrontController extends 
   AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {MvcConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
}

我的MVC配置類:

package no.magnus.config;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"no.magnus"})
public class MvcConfig implements WebMvcConfigurer {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setSuffix(".jsp");
        return vr;
    }
}

一個簡單的家庭控制器:

package no.magnus.controller;
@Controller
public class HomeController {

    @RequestMapping("/home")
    public ModelAndView index() {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }
}

嘗試訪問URL http:// localhost:8080 / home,我收到404錯誤。 如果我將基於XML的配置添加到web.xml以及xml servlet配置中,則會檢測到主控制器並返回index.jsp。

子集web.xml:

<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
  </init-param>
 </servlet>
 <servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>

dispatcher-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ctx="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    <ctx:annotation-config/>
    <ctx:component-scan base-package="no.magnus"/>

</beans>

http:// localhost:8080 / home index.jsp成功返回!

我的期望是Spring MVC將能夠從Java代碼檢測Spring MVC配置,從而使上述XML配置變得多余。 請澄清一下我的理解是否正確。 '

謝謝!

編輯1:應用克里斯建議的代碼更改。 目前有新期刊。 僅使用Java配置仍不會返回index.jsp。 在此處輸入圖片說明

├───java
│   └───no
│       └───magnus
│           ├───config
│           │       MvcConfig.java
│           │
│           └───controller
│                   FrontController.java
│                   HomeController.java
│
└───webapp
    │   result.jsp
    │
    └───WEB-INF       
        │   web.xml
        │
        └───jsp
                index.jsp

http:// localhost:8080 / home不會調用HomeControllerindex() Method(/ home-Mapping)-在發布的url中, home是您的應用程序的名稱,您需要映射以"/"進行索引。 jsp。

請將您的FrontController更改為:

package no.magnus.config; 
public class FrontController extends 
   AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // from
        // return new Class[] {MvcConfig.class};
        // to
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // from
        // return null;
        // to
        return new Class[] {MvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
}

您的MvcConfig應該如下所示:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;


@EnableWebMvc
@Configuration
// to also scan subpackages for components
@ComponentScan("no.magnus.**")
public class MvcConfig
        implements
            WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
        WebMvcConfigurer.super.configureDefaultServletHandling(configurer);
    }

    @Override
    public void configureViewResolvers(final ViewResolverRegistry registry) {
        registry.viewResolver(this.jspViewResolver());
        WebMvcConfigurer.super.configureViewResolvers(registry);
    }

    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        final InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setOrder(1);
        // jsp-location!!! - please change it to where your jsp's are located
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

並且您的HomeController應該如下所示:

package no.magnus.controller;
@Controller("HomeController")
public class HomeController {

    // for the very first start
    // RequestMapping can be replaced with GetMapping
    @GetMapping("/")
    public ModelAndView index() {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM