网站首页> 博客> Spring MVC

Spring MVC

好文 1825
vapaus
vapaus 2020-03-28
收藏

Spring MVC的核心部分是控制器。在最简单的Spring MVC应用程序中,控制器是您需要在Java web部署描述符(即web.xml文件)中配置的惟一servletSpring MVC控制器通常被称为Dispatcher Servlet,它实现了Sun的核心Java EE设计模式之一,称为front controller。它充当Spring MVC框架的前端控制器,每个web请求都必须经过它,这样它才能管理整个请求处理过程。

web请求被发送到Spring MVC应用程序时,控制器首先接收该请求。然后,它组织在Springweb应用程序上下文中配置的不同组件或控制器本身中存在的注释,所有这些都是处理请求所需的。

要在Spring3.0中定义一个控制器类,必须用@controller注释标记一个类。与其他框架控制器或早期的Spring版本相比,带注释的控制器类不需要实现特定于框架的接口或扩展特定于框架的基类。

例如,在Spring3.0之前,一系列类(比如AbstractController)中的一个被用来给一个类赋予DispatcherServlet的行为。从Spring2.5开始,用于定义DispatcherServlet的带注释的类变得可用。从Spring3.0开始,这些为类提供DispatcherServlet行为的类系列已经被弃用,取而代之的是带注释的类。

@Controller注释类(即Controller类)接收到请求时,它会寻找适当的处理程序方法来处理该请求。这要求控制器类通过一个或多个处理程序映射将每个请求映射到处理程序方法。为了做到这一点,控制器类的方法被@RequestMapping注释修饰,使其成为处理程序方法。

这些处理程序方法的签名与您从任何标准类获得的签名一样是开放的。可以为处理程序方法指定任意名称并定义各种方法参数。同样,处理程序方法可以返回一系列值中的任何一个(例如,字符串或void),这取决于它实现的应用程序逻辑。

随着本书的深入,您将遇到各种方法参数,这些参数可以在使用@RequestMapping注释的处理程序方法中使用。下面只是一个有效参数类型的部分列表,只是给你一个概念。

HttpServletRequesthttpservlereresponse

任意类型的请求参数,用@RequestParam注释

任意类型的模型属性,用@ModelAttribute注释

传入请求中包含的Cookie值,用@CookieValue注释

MapModelMap,用于handler方法向模型添加属性

错误或绑定结果,用于处理程序方法访问命令对象的绑定和验证结果

SessionStatus,用于handler方法通知其会话处理完成

一旦控制器类选择了一个合适的处理程序方法,它就会用请求调用handle方法的逻辑。通常,控制器的逻辑调用后端服务来处理请求。此外,处理程序方法的逻辑可能会从众多的输入参数(例如,HttpServletRequestMapErrorsSessionStatus)中添加或删除信息,这些参数将构成正在进行的Spring MVC流的一部分。

处理程序方法处理完请求后,它将控件委托给一个视图,该视图表示为处理程序方法的返回值。为了提供一种灵活的方法,handler方法的返回值并不代表视图的实现(例如user.jspreport.pdf),而是一个逻辑视图(例如userreport)——注意缺少文件扩展名。

处理程序方法的返回值可以是表示逻辑视图名称的字符串,也可以是void,在这种情况下,默认逻辑视图名称是根据处理程序方法或控制器名称确定的。

为了将信息从控制器传递到视图,处理程序的方法返回逻辑视图名称字符串或void是不相关的,因为处理程序方法输入参数将对视图可用。

例如,如果处理程序方法将MapSessionStatus对象作为输入参数-在处理程序方法的逻辑中修改它们的内容,则处理程序方法返回的视图将可以访问这些相同的对象。

当控制器类接收到视图时,它通过视图解析器将逻辑视图名解析为特定的视图实现(例如user.jspreport.pdf)。视图解析器是在实现viewsolver接口的web应用程序上下文中配置的bean。它的职责是返回逻辑视图名称的特定视图实现(HTMLJSPPDF或其他)。

一旦controller类按照视图实现的设计将视图名解析为视图实现,它就会呈现由控制器的handler方法传递的对象(例如,HttpServletRequestMapErrorsSessionStatus)。视图的职责是向用户显示在处理程序方法的逻辑中添加的对象。

接下来,您需要创建一个Spring MVC应用程序布局。通常,使用Spring MVC开发的web应用程序的设置方式与标准java web应用程序相同,只是您必须添加一些特定于spring mvc的配置文件和所需的库。

Java EE规范定义了由web存档或WAR文件组成的javaweb应用程序的有效目录结构。例如,必须在web-INF根目录中提供web部署描述符(即web.xml)。这个web应用程序的类文件和JAR文件应该分别放在web INF/classesweb-INF/lib目录中。

WEB-INF目录外的文件可以通过URL直接访问,因此CSS文件和图像文件必须放在那里。使用Spring MVC时,JSP文件充当模板。它们由生成动态内容的框架读取,因此JSP文件应该放在WEB-INF目录中,以防止直接访问它们。但是,有些应用服务器不允许WEB应用程序在内部读取WEB-INF中的文件。在这种情况下,只能将它们放在WEB-INF目录之外。

创建配置文件

web部署描述符web.xmljavaweb应用程序的基本配置文件。在这个文件中,您定义了应用程序的servlet以及web请求如何映射到它们。对于Spring MVC应用程序,您只需定义一个DispatcherServlet实例,它充当Spring MVC的前端控制器,但如果需要,您可以定义多个实例。

在大型应用程序中,可以方便地使用多个DispatcherServlet实例。这允许将DispatcherServlet实例指定给特定的URL,从而使代码管理更容易,并允许单个团队成员在不妨碍彼此的情况下处理应用程序的逻辑。

在这个web部署描述符中,您定义了DispatcherServlet类型的servlet。这是Spring MVC中的核心servlet类,它接收web请求并将它们分派给适当的处理程序。将这个servlet的名称设置为court,并使用/(斜杠)映射所有url,斜杠表示根目录。注意,URL模式可以设置为更细粒度的模式。在更大的应用程序中,在不同的servlet之间委托模式可能更有意义,但为了简单起见,应用程序中的所有url都被委托给单个法院servlet

servlet名称的另一个用途是让DispatcherServlet决定为Spring MVC配置加载哪个文件。默认情况下,通过将servlet名称与-servlet.xml作为文件名相连接来查找文件。可以在contextConfigLocation servlet参数中显式指定配置文件。在前面的设置中,默认情况下,court servlet加载Spring MVC配置文件courtservlet.xml

在创建应用程序的控制器之前,必须为要扫描的类设置web应用程序,以查看是否存在@Controller@RequestMapping注释。只有这样,它们才能作为控制器运行。首先,要让Spring自动检测注释,必须通过元素启用Spring的组件扫描功能。

除此语句之外,由于Spring MVC@RequestMapping注释将URL请求映射到控制器类及其相应的处理程序方法,这需要在web应用程序上下文中添加语句。要使其工作,必须在web应用程序上下文中注册DefaultAnnotationHandlerMapping实例和AnnotationMethodHandlerAdapter实例。这些实例分别在类级别和方法级别处理@RequestMapping注释。

创建Spring MVC控制器

基于注释的控制器类可以是不实现特定接口或扩展特定基类的任意类。您可以使用@Controller注释对其进行注释。控制器中可以定义一个或多个处理程序方法来处理单个或多个操作。处理程序方法的签名足够灵活,可以接受一系列参数。

@RequestMapping注释可以应用于类级别或方法级别。第一种映射策略是将特定的URL模式映射到控制器类,然后将特定的HTTP方法映射到每个处理程序方法。

这个控制器创建一个java.util.Date对象来检索当前日期,然后将其作为属性添加到输入模型对象中,以便目标视图可以显示它。

因为你已经在com.apress.springrecipes.court上激活了注释扫描。

web包在court-servlet.xml文件中,部署时会检测到控制器类的注释。

@Controller注释将类定义为Spring MVC控制器。@RequestMapping注释更有趣,因为它包含属性,可以在类或处理程序方法级别声明。此类中使用的第一个值(“/welcome”-用于指定控制器可操作的URL,这意味着在/welcome URL上接收到的任何请求都由welcome controller类处理。

一旦请求由controller类处理,它就会将调用委托给在控制器中声明的默认HTTP GET处理程序方法。这种行为的原因是,对URL发出的每个初始请求都是HTTP GET类型的。因此,当控制器处理/welcome URL上的请求时,它随后将委托给默认的HTTP GET处理程序方法进行处理。

注释@RequestMappingmethod=RequestMethod.GET)用于将欢迎方法修饰为控制器的默认httpget处理程序方法。值得一提的是,如果没有声明默认的HTTP GET处理程序方法,则抛出ServletException。因此,Spring MVC控制器至少有一个URL路由和默认的HTTP GET处理程序方法的重要性。

因此,@Autowired注释不必使用XML注入属性,从而节省了您的时间。继续使用controller类语句,您可以找到@RequestMapping“/reservationQuery”)语句,该语句用于指示控制器将处理/reservationQuery URL上的任何请求。

如前所述,控制器然后查找默认的HTTP GET处理程序方法。由于public void setupForm()方法为此被分配了必要的@RequestMapping注释,因此它被称为next

与以前的默认HTTP GET处理程序方法不同,注意这个方法没有输入参数,没有逻辑,还有一个void返回值。这意味着两件事。由于没有输入参数和逻辑,视图只显示在实现模板(例如JSP)中硬编码的数据,因为控制器没有添加数据。通过使用void返回值,将使用基于请求URL的默认视图名称,因此由于请求URL/reservationQuery,因此假定返回视图名为reservationQuery

剩余的处理程序方法用@RequestMappingmethod=RequestMethod.POST)注释修饰。乍一看,只有类级/reservationQuery URL语句的两个处理程序方法可能会让人混淆,但它确实很简单。一种方法在对/reservationQuery URL发出HTTP GET请求时调用,另一种方法在对同一URL发出HTTP POST请求时调用。

web应用程序中的大多数请求都是HTTP GET类型的,其中HTTP POST类型的as请求通常是在用户提交HTML表单时发出的。因此,为了揭示应用程序的更多视图(我们稍后将对其进行描述),一个方法在最初加载HTML表单时调用(即HTTP GET),另一个方法在提交HTML表单时调用(即HTTP POST)。

仔细观察HTTP POST默认处理程序方法,注意这两个输入参数。首先是@RequestParam“courtName”)字符串courtName声明,用于提取名为courtName的请求参数。在这种情况下,HTTP POST请求以/reservationQuery的形式出现?courtName=,此声明使上述值在名为courtName的变量下的方法中可用。第二个是模型声明,用于定义一个对象,在该对象中将数据传递给返回的视图。

handler方法执行的逻辑包括使用控制器的reservationService使用courtName变量执行查询。从该查询获得的结果被分配给模型对象,稍后返回的视图可以使用该对象进行显示。

最后,注意该方法返回一个名为reservationQuery的视图。这个方法也可以返回void,就像默认的HTTP GET一样,并且由于请求URL而被分配给相同的reservationQuery默认视图。两种方法是相同的。

  • 没有任何评论
个评论
vapaus

vapaus (青铜)

9金币 (0)粉丝 (1)源码

(该家伙很懒,什么也没说!)

 

加入微信群,不定期分享源码和经验
签到活跃榜 连续签到送额外金币
最新博客
校园跑腿系统外卖系统软件平台大学生创业平台搭建 471
壹脉销客智能名片CRM系统小程序可二开源码交付部署 459
为啥没搞了 659
Nginx 的 5 大应用场景,太实用了! 936
CentOS 8-stream 安装Postgresql 详细教程 1104
JAVA智慧校园管理系统小程序源码 电子班牌 Sass 模式 1062
Java智慧校园系统源码 智慧校园源码 智慧学校源码 智慧校园管理系统源码 小程序+电子班牌 806
Java智慧校园系统源码 智慧校园源码 智慧学校源码 智慧校园管理系统源码 小程序+电子班牌 791
致远OA权限 1284
发博客会有金币吗 825