带有错误的Spring控制器,用于将输出返回到视图

时间:2014-04-06 03:24:07

标签: java spring spring-mvc

在我的spring应用程序中的控制器的一些方法中,我有一些方法将String值返回给视图,如下例所示:

@RequestMapping(value="cadastra_campo", method=RequestMethod.GET)
public String cadastra_campo(@ModelAttribute("username") String username, @RequestParam("nome") String campo) {
    if(key.temAutorizacao(key.getUsuarioByUsername(username).getId())) {
        if(key.cadastra(campo))
            return "yes";
        else
            return "not";
    }
    else {
        return "no_permit";
    }
}

但是,通过浏览器的控制台监视视图收到的值,我意识到他们所有人都试图找到像/jst/yes.jsp这样的页面。

这个输出在视图中由jquery函数读取:

$("#incluir_campo").on("click", function () {
    $.ajax({
        type: "GET",
        url: "<c:out value="${pageContext.request.contextPath}/key/cadastra_campo"/>",
        data: {nome: $("input[name=nome_campo]").val() }
    }).done(function(data){
        if(data=="yes") {
            var newRow = $("<tr>");

            cols = 'td> <input type="text" name="${item_key.nome}" value="${item_key.nome}"> </td>';
            cols += '<td> <button type="button" id="excluir_campo_${item_campo.id}" class="btn btn-link">Excluir</button> </td>';

            newRow.append(cols);
            $("table.campos").append(newRow);
            $("input[name=nome_campo]").reset();
        }
        else {
            alert("erro ao incluir campo");
        }
    }).fail(function(){
        alert("falha ao incluir campo");
    });
});

我使用java配置代替文件web.xml和spring-servlet.xml,通过这个类:

WebAppInitializer.java

@Order(value=1)
public class WebAppInitializer implements WebApplicationInitializer {

    @SuppressWarnings("resource")
    @Override
    public void onStartup(ServletContext container) {
      // Create the 'root' Spring application context
      AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
      rootContext.register(WebAppConfig.class);

      // Manage the lifecycle of the root application context
      //container.addListener(new ContextLoaderListener(rootContext));

      // Create the dispatcher servlet's Spring application context
      AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
      dispatcherContext.register(DispatcherConfig.class);

      // Register and map the dispatcher servlet
      ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/");
    }

}

WebAppConfig.java

@EnableWebMvc
@EnableTransactionManagement(mode=AdviceMode.PROXY, proxyTargetClass=true)
@ComponentScan(value="com.horariolivre")
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/bootstrap/**").addResourceLocations("/bootstrap/").setCachePeriod(31556926);
        registry.addResourceHandler("/extras/**").addResourceLocations("/extras/").setCachePeriod(31556926);
        registry.addResourceHandler("/jquery/**").addResourceLocations("/jquery/").setCachePeriod(31556926);
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

有人知道如何为我的视图正确接收一个String值,而不是尝试到达一个jsp页面?

1 个答案:

答案 0 :(得分:2)

如果您未在ViewResolver可用的上下文配置中提供DispatcherServlet,则它将使用默认值。该默认值为InternalResourceViewResolver

@RequestMapping处理程序方法返回String时,Spring使用ViewNameMethodReturnValueHandler来处理它。它会将返回的String值设置为请求的视图名称。在线下,Spring的DispatcherServlet将使用InternalResourceViewResolver根据提供的名称解析视图。这将是一个JSP。然后它将转发到该JSP。

如果要将处理程序方法的String返回值作为HTTP响应的主体返回,请使用@ResponseBody注释该方法。 Spring将使用RequestResponseBodyMethodProcessor将值写入HttpServletResponse OutputStream