当前位置: 首页 > 知识库问答 >
问题:

Spring MVC 中的控制器映射问题

邢璞
2023-03-14

有类似的主题,但它们都使用html" target="_blank">xml配置文件。我之所以写这个问题,是因为我使用了注释。

我在运行应用程序时遇到问题:

  • 在尝试设置Spring servlet时,获取WARNorg.springframework.web.servlet.PageNotes-未找到HTTP请求与URI的映射
  • 尝试在服务器上运行时出现错误404

以下是我的代码(跳过包和导入):

1)初始化器

public class WebInitializer implements WebApplicationInitializer{

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = 
            new AnnotationConfigWebApplicationContext();
        ctx.register(AppConfig.class);

        ctx.setServletContext(servletContext);

        ServletRegistration.Dynamic servlet = 
            servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
            servlet.addMapping("/");
            servlet.setLoadOnStartup(1);
        }
    }

2)应用配置

@Configuration
@ComponentScan("ua.kiev.prog")
@EnableWebMvc
public class AppConfig {
    @Bean
    public EntityManager entityManager() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("AdvJPA");
        return emf.createEntityManager();
    }

    @Bean
    public AdvDAO advDAO() {
        return new AdvDAOImpl();
    }

    @Bean
    public UrlBasedViewResolver setupViewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        resolver.setOrder(1);
        return resolver;
    }

    @Bean
    public CommonsMultipartResolver multipartResolver() {
        return new CommonsMultipartResolver();
    }
}

3)控制器

@Controller
@RequestMapping("/Advertisement")
public class MainController {

    @Autowired
    private AdvDAO advDAO;

    @RequestMapping("/")
    public ModelAndView listAdvs() {
        return new ModelAndView("index", "advs", advDAO.list());
    }

    @RequestMapping(value = "/add_page", method = RequestMethod.POST)
    public String addPage(Model model) {
        return "add_page";
    }

    @RequestMapping(value = "/search", method = RequestMethod.POST)
    public ModelAndView search(@RequestParam(value="pattern") String pattern) {
        return new ModelAndView("index", "advs", advDAO.list(pattern));
    }

// more code goes here
}

控制器映射到 /Advertisement,所以应用程序应该在URL上可用localhost:8080/Advertisement/但它不是。当我将注释中的映射更改为 "/" - 时,它在localhost:8080/Advertisement/.上可用。怎么会呢?当我将其更改回“/广告”时——同样的问题准确(错误404和异常“未找到带有URI的HTTP请求的映射…”)

那么,我在代码中犯了什么错误?或者问题出在Eclipse/TomCAT/Maven中?

来源 - https://github.com/KostyantynPanchenko/prog.kiev.ua.lesson09.adv

共有2个答案

董高逸
2023-03-14

您如何运行应用程序?至少在tomcat中,每个部署的应用程序都从特定的上下文路径提供服务。上下文路径由基本文件名确定,这里更详细。

因此,如果您正在部署广告。war所有对应用程序的请求都将从localhost:8080/Advertiement/提供,即使您将DispatcherServlet和Controller声明为/

冯曾笑
2023-03-14

您应该更改映射

@Controller
@RequestMapping("/")
public class MainController {

    @Autowired
    private AdvDAO advDAO;

    @RequestMapping("/Advertisement")
    public ModelAndView listAdvs() {
        return new ModelAndView("index", "advs", advDAO.list());
    }

映射器使用注释中的值来匹配请求 URL 的错误,并且它无法匹配最后一个斜杠。请注意,它不应该发生在上面的代码中。

 类似资料:
  • http://some-amazon-link:8080/the-war-name/login 现在我正在纠结如何在Spring MVC项目中添加“/the-war-name/”以及在哪里添加“/the-war-name/”。 它在 null

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?

  • 我一直在尝试使用: 使用此链接: 但我有一个错误: 当我换成: 是工作。我能做些什么来和日期一起工作? 谢啦

  • ControllerClassNameHandlerMapping类是HandlerMapping接口的一个实现,它是通过一个约定来解析请求URL及处理该请求的@Controller控制器实例之间的映射关系。 请看下面一个简单的控制器实现。请注意留意该类的 名称: public class **ViewShoppingCartController** implements Controller {