Spring企业实战学习

Posted 阿怪123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring企业实战学习相关的知识,希望对你有一定的参考价值。

1 SpringMVC框架

         整个框架主要是围绕一个DispatcherServlet来进行设计的

         该Servlet会将请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等

         其中,处理器是应用中注解了 @Controller 和 @RequestMapping的类和方法

 

DispatcherServlet

         DispatcherServlet其实就是一个Servlet(继承自HttpServlet基类)。同时,需要在web.xml文件中把需要处理的请求映射到URL上去,一般情况下,web.xml需要配置 DispatcherServlet 和路径映射的声明

         例如:

                   <web-app>

                            <servlet>

                                     <servlet-name>example</servlet-name>

                                     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

                                     <load-on-startup>1</load-on-startup>

                            </servlet>

                            <servlet-mapping>

                                     <servlet-name>example</servlet-name>

                                     <url-pattern>/example/*</url-pattern>

                            </servlet-mapping>

                   </web-app>

                   以上代码,所有路径以 /example 开头的请求都被会名字为 example 的 DispatcherServlet处理。

         在Servlet3.0的环境下,还能使用编程的方式配置Servlet容器(暂不表)

 

         DispatcherServlet的初始化过程,SpringMVC会在web应用的WEB-INF目录下查找一个名为 [servlet-name]-servlet.xml的配置文件,并创建其中所定义的bean

         如果全局上下文中存在相同名字的bean,则它们会被新定义的同名bean覆盖

                   <web-app>

                            <servlet>

                                     <servlet-name>golfing</servlet-name>

                                     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

                                     <load-on-startup>1</load-on-startup>

                            </servlet>

                            <servlet-mapping>

                                     <servlet-name>golfing</servlet-name>

                                     <url-pattern>/golfing/*</url-pattern>

                            </servlet-mapping>

                   </web-app>

                   有了以上的 Servlet的配置文件,还需要在应用的/WEB/INF路径下创建一个 golfing-servlet.xml文件,该文件定义了所有SpringMVC相关的组件(例如bean)

 

         Spring当中的 ApplicationContext 实例都是有范围(scope)的。在SrpingMVC当中,每一个 DispatcherServlet 都有一个自己的 WebApplicationContext 上下文对象,它继承了root的 WebApplicationContext对象中的所有bean,如果这个集成的bean在具体的 Servlet实例中被重载,在每个Servlet实例中可以定义其scope下的新的bean。

         如果应用当中只需要一个 DispatcherServlet 时,此时只需要配置一个根 context对象就行了。要配置一个唯一的context对象,直接在初始化参数中 配置一个空的 contextConfigLocation即可 

         web.xml

                   <web-app>

                       <context-param>

                           <param-name>contextConfigLocation</param-name>

                           <param-value>/WEB-INF/root-context.xml</param-value>

                       </context-param>

                       <servlet>

                           <servlet-name>dispatcher</servlet-name>

                           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

                           <init-param>

                               <param-name>contextConfigLocation</param-name>

                               <param-value></param-value>

                           </init-param>

                           <load-on-startup>1</load-on-startup>

                       </servlet>

                       <servlet-mapping>

                           <servlet-name>dispatcher</servlet-name>

                           <url-pattern>/*</url-pattern>

                       </servlet-mapping>

                       <listener>

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

                       </listener>

                   </web-app>

 

                   WebApplicationContext 继承自 ApplicationContext ,它提供了一些web应用经常需要用到的特性

 

定制 DispatcherServlet 的配置,具体做法是,在 web.xml 文件中,Servlet 的声明元素上添加一些 Servlet 的初始化参数(通过 init-param 元素)。可选参数列表如下:

         contextClass

                  任意实现了 ApplicationContext 的类,这个类会初始化 Servlet 所需要的上下文对象。默认情况下,框架会使用 XmlWebApplicationContext对象

         contextConfigLocation

                   用于指定上下文配置文件路径的字符串,这个值会被传入给 contextClass 指定的上下文对象。该字符串内可以包含多个字符串,字符串之间以逗号分割,以此支持多个上下文的配置。在多个上下文中重复定义的bean,以最后加在的bean定义为准

         namespace

                   WebApplicationContext 的命名空间。默认是 [servlet-name]-servlet

 

2 WebApplicationContext (应用上下文)中特殊的bean类型

         bean的类型

                   HandlerMapping

                            处理器映射。根据规则将进入容器的请求映射到具体的处理器。最常见的一个实现是支持你在控制器上添加注解,配置请求路径。当然,也存在其他实现

                   HandlerAdapter

                            处理器适配器。党拿到所对应的处理器后,适配器将负责去调用该处理器,这使得DispathcerServlet无需关心具体的调用细节。例如,要调用的是一个机遇注解配置的控制器,那么调用前还需要从注解中解析相关配置信息。因此,HandlerAdapter具体的工作就是对 DispatcherServlet 屏蔽这些细节

                   HandlerExceptionResolver

                            处理器异常映射。主要负责将捕获的异常映射到不同的视图上去

                   ViewResolver

                            视图解析器。负责将逻辑视图名(String)映射到一个具体实际的view上去

                   LocaleResolver & LocaleContextResolver

                            地区解析器 和 地区上下文解析器。它们负责解析客户端所在的地区信息甚至时区信息,为国际化的视图定制提供支持。

                   ThemeResolver

                            主题解析器。负责解析web当中可用的主题,比如一些个性化定制的布局

                   MulipartResolver

                            解析multi-part的传输请求,比如支持通过html表单进行的文件上传等。

                   FlashMapManager

 

 

3 DispatcherServlet 的处理流程

         请求经过DispatcherServlet时,DispatcherServlet会按照如下次序对请求进行处理:

                   a 首先,搜索本 DispatcherServlet 对应的应用上下文对象 WebApplicationContext,并将它作为一个属性绑定到该请求,以方便以后的控制器和其他组件能够使用它,属性的键名默认为

                   DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE

                   b 将时区(locale)解析器绑定到请求上,以便其他组件在处理请求(渲染视图、准备数据等)时可以获取到时区的相关信息,若不需要,可忽略此项

                   c 将主题(theme)解析器绑定到请求上,同理

                   d 如果你配置了multipart文件处理器,那么框架将查找该文件是不是multipart(分为多个部分连续上传)的。若是,则将该请求包装成一个 MultipartHttpServletRequest 对象,以便处理链中的其他组件对它做进一步的处理。

                   e 为请求寻找一个合适的处理器,如果处理器被找到,则整个执行莲(前处理器,后处理器,控制器等)都会被执行,以完成相应模型的准备或视图的渲染

                   f 如果返回得到了一个模型model,那么此时直接将该model渲染成相应的视图view,若没有任何返回模型。则不会渲染,并默认请求的处理已经由请求链处理完毕。

         如果在处理的过程中跑出了异常,,那么上下文 WebApplicationContext 对象中所定义的异常处理器将会负责捕获这些异常。通过配置你自己的异常处理器,你可以定制自己处理异常的方式。

 

4 控制器的实现

         控制器是应用程序逻辑的处理入口,Spring对控制器的定义相对宽松,实现控制器很自由

         例如可以在控制器上添加

         @RequestMapping   @RequestParam   @ModelAttribute

 

         @Controller

         public class HelloWorldController {

             @RequestMapping("/helloWorld")

             public String helloWorld(Model model) {

                 model.addAttribute("message", "Hello World!");

                 return "helloWorld";

             }

         }

 

5 @Controller关键字

         使用@Controller关键字,表明了该类是一个作为控制器而存在的角色,Spring此时不要求你去集成任何控制器基类,也不需要去实现Servlet的那套API,当然如果需要也可以去实现

 

         @Controller注解被认为是这个类的原型,表明这个类所承担的角色。分派器(DispatcherServlet)会扫描所有注解了@Controller的类,检测其中通过@RequestMapping注解配置的方法

 

         <?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="org.springframework.samples.petclinic.web"/>

             <!-- ... -->

         </beans>

 

      5.1 @RequestMapping关键字

         该关键字主要用来将请求 URL 映射到整个类上或者某个特定的方法上

         通常,一个类的注解将某个链接映射到一个具体的控制器上,而其中的方法的映射则是更加细化了处理,即可以根据特定的HTTP请求方法(GET/POST等)、查看HTTP请求中是否携带特定参数等条件,将请求映射到匹配的方法上

 

         @Controller

         @RequestMapping("/appointments")

         public class AppointmentsController {

             private final AppointmentBook appointmentBook;

             @Autowired

             public AppointmentsController(AppointmentBook appointmentBook) {

                 this.appointmentBook = appointmentBook;

             } @

                     RequestMapping(method = RequestMethod.GET)

             public Map<String, Appointment> get() {

                 return appointmentBook.getAppointmentsForToday();

             } @

                     RequestMapping(path = "/{day}", method = RequestMethod.GET)

             public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DA

                     TE) Date day, Model model) {

                 return appointmentBook.getAppointmentsForDay(day);

             } @

                     RequestMapping(path = "/new", method = RequestMethod.GET)

             public AppointmentForm getNewForm() {

                 return new AppointmentForm();

             } @

                     RequestMapping(method = RequestMethod.POST)

             public String add(@Valid AppointmentForm appointment, BindingResult result) {

                 if (result.hasErrors()) {

                     return "appointments/new";

                 } a

                 ppointmentBook.addAppointment(appointment);

                 return "redirect:/appointments";

             }

         }

         类级别的@RequestMapping不是必须的,若不配置的前提下,则其中方法的映射都是绝对路径,而不是相对路径

 

以上是关于Spring企业实战学习的主要内容,如果未能解决你的问题,请参考以下文章

Spring 5企业级开发实战

Spring Boot企业应用程序开发。《弹簧靴企业级应用开发实战》

基于Spring Boot框架企业级应用系统开发全面实战

送书活动!Spring+MyBatis企业应用实战

Spring+MYBatis企业应用实战pdf高清版免费下载

80W美团架构师整理分享出了Spring5企业级开发实战文档