有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果没有@EnableMVC,该代码如何工作?

我有以下代码:

package biz.tugay.springJuly18.config;
/* User: koray@tugay.biz Date: 18/07/15 Time: 15:09 */

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

@SuppressWarnings(value = "unused")
public class MyWebAppInnit extends AbstractAnnotationConfigDispatcherServletInitializer {

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

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

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

}

还有ServletConfig。阶级

package biz.tugay.springJuly18.config;
/* User: koray@tugay.biz Date: 18/07/15 Time: 15:10 */

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan(basePackages = "biz.tugay.springJuly18.web")
public class ServletConfigClass {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver =
                new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

}

最后是控制器:

package biz.tugay.springJuly18.web;
/* User: koray@tugay.biz Date: 18/07/15 Time: 12:53 */

import biz.tugay.springJuly18.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyWeb {

    @Autowired
    private MyService myService;

    @RequestMapping("/test")
    public ModelAndView helloWorld() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("message", myService.sayHello());
        mv.setViewName("koko");
        return mv;
    }

}

当我将它部署到Tomcat并转到/test时,我将被重定向到koko。jsp。那么,在没有启用WebMVC的情况下,为什么这项功能可以正常工作呢

根据这个答案here不应该吗

这里是RootConfig。java

package biz.tugay.springJuly18.config;
/* User: koray@tugay.biz Date: 18/07/15 Time: 15:10 */

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "biz.tugay.springJuly18.service")
public class RootConfigClass {
}

共 (1) 个答案

  1. # 1 楼答案

    DispatcherServlet有两个字段

    /** List of HandlerMappings used by this servlet */
    private List<HandlerMapping> handlerMappings;
    
    /** List of HandlerAdapters used by this servlet */
    private List<HandlerAdapter> handlerAdapters;
    

    其值决定如何处理请求(以及其他事项)。当容器初始化DispatcherServlet时,这些字段被初始化并填充值。这些值来自您指定的上下文配置。如果您的上下文配置没有提供至少一个适当类型的值,DispatcherServlet将使用一些默认值

    这些默认值包含在名为DispatcherServlet.properties的文件中,该文件与DispatcherServlet位于同一个包中

    对于HandlerMapping,值(类名)为

    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
        org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
        org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    

    ^{}州的javadoc

    Implementation of the HandlerAdapter interface that maps handler methods based on HTTP paths, HTTP methods and request parameters expressed through the RequestMapping annotation.

    换句话说,这个实现还使用带有@RequestMapping注释的方法

    然而,AnnotationMethodHandlerAdapter是不推荐的

    in Spring 3.2 in favor of RequestMappingHandlerAdapter

    @EnabledWebMvc而是注册一个^{},这要复杂得多