【问题标题】:"no mapping found" error java spring MVC with no xml configuration“找不到映射”错误 java spring MVC 没有 xml 配置
【发布时间】:2016-04-19 13:42:35
【问题描述】:

我是 Spring + MVC 的新手。 我找到了一个脚本,我可以运行这个脚本的某些部分。 这个脚本在java端配置没有xml的spring mvc。 我把所有的罐子放到WEB-INF/lib中。

ControllerConfiguration .java

package org.java.springmvc.bootstrap;

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.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "org.java.springmvc.controller")
public class ControllerConfiguration {

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

}

WebAppInitializer.java

package org.java.springmvc.bootstrap;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(final ServletContext servletContext) throws ServletException {
        final AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
        root.setServletContext(servletContext);
        root.scan("org.java.springmvc.bootstrap");
        root.refresh();

        final Dynamic servlet = servletContext.addServlet("spring", new DispatcherServlet(root));
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/*");
    }

}

HomeController.java

package org.java.springmvc.controller;

import java.io.IOException;
import java.io.Writer;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

    @RequestMapping(value = "/")
    public void home(final Writer writer) 
            throws IOException  {
        writer.append("<h2>Welcome, XML Free Spring MVC!</h2>");
    }

    @RequestMapping(value = "/giris")
    public void giris(final Writer writer) 
            throws IOException  {
            writer.append("Giris");
    } 

}

FilmController.java

package org.java.springmvc.controller;

import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.java.springmvc.model.Film;
import org.java.springmvc.model.Film.FilmTurleri;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/film")
public class FilmController {

    @RequestMapping(value = "filmler")
    public void filmler(final Writer writer) 
            throws IOException  {
        writer.append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-9\"><title>...Filmler...</title>");
        writer.append("<script type=\"text/javascript\" src=\"/js/touch/sencha-touch-all.js\"></script>");
        writer.append("<script type=\"text/javascript\" src=\"/js/film/filmler.js\"></script>");
        writer.append("</head><body></body></html>");

    } 

    @RequestMapping (value = "/filmleriGetir", method = RequestMethod.GET)
    public @ResponseBody Map<String, List<Film>> FilmleriGetir() {
        List<Film> movies = new ArrayList<Film>();

        // For testing...
        movies.add(new Film(0, "Birinci Film", "Birinci Yönetmen", 2015, FilmTurleri.Aksiyon));
        movies.add(new Film(0, "İkinci Film", "İkinci Yönetmen", 2015, FilmTurleri.Komedi));
        movies.add(new Film(0, "Üçüncü Film", "Üçüncü Yönetmen", 2015, FilmTurleri.Aile));

        Map<String, List<Film>> resp = new HashMap<String, List<Film>>();
        resp.put("filmListesi", movies);
        return resp;
    }

}

Film.java

package org.java.springmvc.model;

public class Film {

    public int Id;
    public String FilmAdi, Yonetmen;
    public int CikisTarihi;
    public FilmTurleri Turu;

    public enum FilmTurleri {
        Aksiyon, Komedi, Aile, Korku, Savas;
    }

    public Film(){

    }

    public Film(int id, String title, String director, int yearOfRelease, FilmTurleri tur)
    {
        super();
        this.Id = id;
        this.FilmAdi = title;
        this.Yonetmen = director;
        this.CikisTarihi = yearOfRelease;
        this.Turu = tur;
    }
    //getter, settings method
}

我有两个问题:

  1. 如果我写“http://localhost:8080/SpringMVC/”,页面就会显示。 但如果我写“http://localhost:8080/SpringMVC/movies/index”我会收到这个警告:

“警告:在 DispatcherServlet 中找不到带有 URI [/SpringMVC/WEB-INF/views/index.jsp] 的 HTTP 请求的映射,名称为 'spring'”

  1. 如果我在 WebContent 下添加 JSP 页面(Giris.jsp),我无法显示该页面。所有页面都必须有映射吗?如何显示简单的jsp页面?

警告:在名称为“spring”的 DispatcherServlet 中找不到带有 URI [/SpringMVC/Giris.jsp] 的 HTTP 请求的映射

编辑: 我改变了一点。 我的项目结构是这样的:

我收到此错误:

加载资源失败:

http://localhost:8080/js/film/filmler.js

http://localhost:8080/js/touch/sencha-touch-all.js

我想到了这样的逻辑:

- there will be a jsp file including "*.js" files. (filmler.jsp)

- there are some methods returning json object in those *.js files. (FilmleriGetir method)

对这个逻辑有什么建议吗?

问候。

【问题讨论】:

  • 能把你项目的文件结构加进去吗?

标签: java spring model-view-controller web sencha-touch-2


【解决方案1】:
  1. 在MovieController.java中,需要添加'/' :

@RequestMapping("/movies")

  1. 您正在使用servlet.addMapping("/*");,这意味着您的org.springframework.web.servlet.DispatcherServlet 即Spring 将拦截每个请求 来到您的应用程序。现在,您在任何控制器中都没有任何 RequestMappingGiris.jsp,因此 Spring 抛出错误为:No mapping found for HTTP request with URI [/SpringMVC/Giris.jsp]

为了显示 Giris.jsp 页面,您需要:

A] 使用RequestMapping 为“Giris.jsp”添加条目/创建新控制器,并将视图设置为“Giris”

例如:

   @Controller
public class MyController {

    @RequestMapping(value = "/Giris.jsp")
    public void home(final Writer writer) 
            throws IOException  {
            return 'Giris';
    }    
}

最好将 RequestMapping 用作 /giris 而不是 /Giris.jsp,因为它暴露了底层技术是 JSP。

B] 将 Giris.jsp 文件放在/WEB-INF/views/ 文件夹下。

了解InternalResourceViewResolver 的工作原理。参考您的ControllerConfiguration,当控制器的视图名称返回为“Giris”时,InternalResourceViewResolver 添加您定义的前缀和后缀,并显示该页面。因此,如果视图名称为“Giris”,则会呈现页面 '/WEB-INF/views/'+ 'Giris' + '.jsp'


  • 根据java naming convention,JSP(文件)名称应始终以小写字母开头。所以使用giris.jsp 而不是Giris.jsp


编辑(修改问题):

加载资源失败:http://localhost:8080/js/film/filmler.js

请理解,由于DispatcherServlet 映射到/*,因此到达您的网络应用程序的每个请求都由DispatcherServlet 处理,即Spring

每当您的应用程序遇到 url http://localhost:8080/js/film/filmler.js,它就知道 DispatcherServlet 将处理该 url。 DispatcherServlet 检查 url(在控制器中)是否有任何 RequestMapping

现在,当你添加 url

http://localhost:8080/js/film/filmler.js

没有可以处理此类 url 的 RequestMapping,所以你得到了一个 url。

加载js文件或图片文件等资源,使用mvc:resources

例如: 对于 js 文件: 把你所有的js文件放到/WEB-INF/js/目录下。

为你的配置中的 js 文件添加 mvc:resource 映射:

 <mvc:resources mapping="/js/**" location="/WEB-INF/js/" />

现在您将能够访问您的 js 文件。如果 Spring 遇到 /js/film/filmler.js 等 url,它会从 mvc:resource 映射中知道该到哪里查找该文件。

Goof mvc:教程资源。

【讨论】:

  • 1. “/”有效,谢谢。如果我调试应用程序,索引方法中的断点正在触发。但在方法完成后,我收到此错误:org.springframework.web.servlet.PageNotFound noHandlerFound 警告:在 DispatcherServlet 中找不到带有 URI [/SpringMVC/index] 的 HTTP 请求的映射,名称为“spring”
  • 您应该将 index.jsp 文件放置为 `/WEB-INF/views/index.jsp'。
  • 编辑:我改变了一点。我收到此错误:无法加载资源:localhost:8080/js/film/filmler.jslocalhost:8080/js/touch/sencha-touch-all.js 我认为这样的逻辑: - 将有一个包含“* .js”文件的 jsp 文件。 (filmler.jsp) - 在这些 *.js 文件中有一些方法返回 json 对象。 (FilmeriGetir 方法)对这个逻辑有什么建议吗?问候。
  • 已编辑我的答案以包含您在访问 js 文件时遇到的问题的解决方案。
  • 我找到了一种动态添加资源的方法。我把我的js文件放在WEB-INF下。但我仍然得到错误。 @Configuration @EnableWebMvc public class WebConfigurationContext extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/js/"); } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2020-09-29
  • 2020-04-12
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多