当前位置: 首页 > 面试题库 >

Spring MVC:

谢铭
2023-03-14
问题内容

使用spring-servlet.xml文件配置Spring DispatcherServlet ,该文件是:

<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="net.viralpatel.spring3.controller" />

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

在此文件中,我使用context:component-scan标记表示Spring必须扫描我的文件以搜索注释,例如,当控制器类发现方法由@RequestMapping(“ / hello”)注释进行注释时,知道此方法可以处理以“ / hello”结尾的URL的HTTP请求。这很简单…

现在我的疑问与我可以在STS \ Eclipse中自动构建的Spring MVC模板项目有关。

当我在STS中创建一个新的Spring MVC项目时,我发现DispatcherServlet由名为servlet-context.xml的文件配置,该文件包含与先前示例文件类似的某些配置。

在此文件中,我仍然具有组件扫描标签:

<context:component-scan base-package="com.mycompany.maventestwebapp" />

但是我还有另一个标签(看起来有类似的任务),这个标签是:

<annotation-driven />

这两个标签有什么区别?
另一个“奇怪”的事情是,前面的示例(不使用注释驱动的标签)与使用Spring MVC Template项目的STS创建的项目非常相似,但是如果我从其配置中删除了注释驱动的标签,文件,该项目无法运行,并给我以下错误:HTTP状态404-

在stacktrace中,我有:

警告:org.springframework.web.servlet.PageNotFound-DispatcherServlet中,名称为“ appServlet”URI [/ maventestwebapp /]没有找到HTTP请求的映射

但为什么?前面的示例在没有注释驱动标签的情况下效果很好,并且此控制器类非常相似。实际上,只有一种方法可以处理针对“ /”路径的HTTP请求

这是我的控制器类的代码

package com.mycompany.maventestwebapp;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
*/
@Controller
public class HomeController {

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

/**
 * Simply selects the home view to render by returning its name.
 */
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
    logger.info("Welcome home! The client locale is {}.", locale);

    Date date = new Date();
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

    String formattedDate = dateFormat.format(date);

    model.addAttribute("serverTime", formattedDate );

    return "home";
}

有人可以帮助我了解这件事吗?


问题答案:

<mvc:annotation-driven />意味着你可以定义spring Bean依赖项,而无需实际在XML中指定一堆元素或实现接口或扩展基类。例如@Repository,告诉spring一个类是Dao,而无需扩展JpaDaoSupport或DaoSupport的其他子类。类似地@Controller告诉spring,指定的类包含将处理Http请求的方法,而无需实现Controller接口或扩展实现Controller的子类。

当spring启动时,它会读取其XML配置文件,并<bean在其中看到类似<bean class="com.example.Foo" />Foo的标记,并且在其中查找元素@Controller并知道该类是控制器并将其视为此类。默认情况下,Spring假定应管理的所有类均在beans.XML文件中明确定义。

使用组件扫描<context:component-scan base-package="com.mycompany.maventestwebapp" />告诉Spring,它应该在com.mycompany.maventestweapp下的所有类中搜索类路径,并查看每个类是否具有@Controller,或@Repository,或@Service@Component如果存在,则Spring将使用该类注册该类。 Bean工厂,就像你输入 XML配置文件一样。

在典型的spring MVC应用程序中,你会发现有两个spring配置文件,一个配置应用程序上下文的文件通常从Spring上下文侦听器开始。

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

而且,Spring MVC配置文件通常从Spring调度程序Servlet开始。例如。

<servlet>
        <servlet-name>main</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>main</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

Spring支持分层bean工厂,因此对于Spring MVC,调度程序servlet上下文是主要应用程序上下文的子级。如果在Servlet上下文中请求一个名为“ abc”的bean,它将首先在servlet上下文中查找,如果在servlet上下文中找不到它,它将在父上下文(即应用程序上下文)中查找。

通用bean(例如数据源,JPA配置,业务服务)在应用程序上下文中定义,而MVC特定的配置不与servlet关联的配置文件。

希望这可以帮助。



 类似资料:
  • 问题内容: Group.java 这是我的方法。 我认为还可以,但是有一些例外: HTTP状态500 –内部服务器错误h1 {font-family:Tahoma,Arial,sans-serif; color:white; background-color:#525D76; font-size:22px;} h2 {font-family:Tahoma,Arial,sans- 衬线;颜色:白色;

  • 问题内容: 我正在尝试建立 Spring MVC + Hibernate 项目,但是这让我发疯了。我还将考虑建议订购xml配置文件的建议。 我有以下文件: 我收到此stacktrace错误: 另外,如果有人可以给我一些提示以帮助我组织xml配置文件,我将非常高兴。我是.NET开发人员,所有这些Maven + xml配置对我来说都是新的东西。 谢谢 问题答案: 我的解决方案是将Datasource中

  • 问题内容: 我在同一个主题上看过几个qts。但是我没有发现此错误的任何线索。 我正在研究POC,并点击下面的链接。 http://spring.io/guides/gs/uploading- files/ 如以上教程中所述,在独立模式下(春季嵌入式Tomcat),它可以正常工作。但是我想将其部署为Web应用程序。因此,我创建了一个单独的SpringMVC项目并添加了以下控制器。 控制器文件 我已经

  • 问题内容: 如果我将spring应用程序映射为处理所有传入请求(),则对静态内容的请求将返回404。例如,即使当Spring拦截请求时资源存在,对“ myhost.com/css/global.css”的请求也将返回404。 替代方法是将SpringMVC映射到子目录(例如’/ home / ‘),但是在这种情况下,必须在应用程序内的所有链接中传递此目录。有没有一种方法可以将SpringMVC映射

  • 本文向大家介绍SpringMVC的简单传值(实现代码),包括了SpringMVC的简单传值(实现代码)的使用技巧和注意事项,需要的朋友参考一下 之前学习SpringMVC时感觉他的传值很神奇:简便,快捷,高效。 今天写几个简单的传值与大家分享,希望能对大家有帮助。 一、 从后往前传: (1) 把想要传递的东西放在addObject(String,Object)里,值是Object类型,什么都可以放

  • 本文向大家介绍springMvc请求的跳转和传值的方法,包括了springMvc请求的跳转和传值的方法的使用技巧和注意事项,需要的朋友参考一下 forword跳转页面的三种方式: 1.使用serlvet 2.使用Model对象 3.使用ModelAndView 当然也可以通过new 一个ModelAndView对象来实现 forword跳转到Controller中的方法: 跳转到相同类中的方法 跳

  • 本文向大家介绍使用注解开发SpringMVC详细配置教程,包括了使用注解开发SpringMVC详细配置教程的使用技巧和注意事项,需要的朋友参考一下 1、使用注解开发SpringMVC 1、新建一个普通的maven项目,添加web支持 2、在pom.xml中导入相关依赖 SpringMVC相关 Servlet jsp 为了防止资源导出失败,我们加入以下代码 3、配置web.xml 注意web.xml

  • 本文向大家介绍SpringMVC请求的路径变量里面写正则表达式的方法,包括了SpringMVC请求的路径变量里面写正则表达式的方法的使用技巧和注意事项,需要的朋友参考一下     Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallbac