SpringMVC入门

发布于:2023-01-13 ⋅ 阅读:(492) ⋅ 点赞:(0)

SpringMVC

一,三层架构

                表现层:向用户展示数据                                                              SpringMVC

                业务逻辑层:处理用户的业务需求

                数据访问层:用于和数据库进行交互

二,SpringMVC架构

        1.SpringMVC介绍

          SpringMVC是Spring框架的一个模块,我们可以从Spring的整体结构中看得出来,如下图:

                它是属于表现层的一个框架,用于控制跳转和进行数据展示。

                SpringMVC的特点:

                        1)轻量级,简单易学

                        2)高效,基于请求响应的MVC框架

                        3)与Spring兼容性好,无缝结合

                        4)约定优于配置

        2.SpringMVC执行流程

                1)流程图

                

        2)架构原理

        ⑴用户发起请求到中央控制器(DispatcherServlet)

      ⑵中央控制器(DispatcherServlet),请求处理器映射器(HandlerMapping),查找处理器(Handler),可以根据xml配置、注解进行查找

        ⑶处理器映射器(HandlerMapping)向前端控制器返回处理器(Handler)

        ⑷中央控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)

        ⑸处理器适配器(HandlerAdapter)去执行处理器(Handler)

        ⑹处理器(Handler)执行完成给处理器适配器(HandlerAdapter)返回ModelAndView

       ⑺处理器适配器(HandlerAdapter)向中央控制器(DispatcherServlet)返回ModelAndView,ModelAndView是springmvc框架的一个底层对象,包括 Model和view

        ⑻中央控制器(DispatcherServlet)请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)

        ⑼视图解析器向中央控制器(DispatcherServlet)返回View

        ⑽中央控制器(DispatcherServlet)进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域

        ⑾中央控制器(DispatcherServlet)向用户响应结果

        3.组件说明

         ①DispatcherServlet:中央控制器

用户请求到达中央控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

          ②HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

          ③Handler:处理器

Handler 是继DispatcherServlet中央控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

          ④HandlerAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

          ⑤ViewResolver:视图解析器

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 

           ⑥View:视图

springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

        4.项目搭建

                ①创建maven项目

                 ②修改工件组(一般是公司的域名倒置)

                ③配置Maven

                 ④配置Tomcat

                ⑤在pom.xml里添加依赖

<!-- servlet3.1规范的坐标 -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>
<!--jsp坐标-->
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.1</version>
  <scope>provided</scope>
</dependency>
<!--spring的坐标-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.1.9.RELEASE</version>
</dependency>
<!--spring web的坐标-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.1.9.RELEASE</version>
</dependency>
<!--springmvc的坐标-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.1.9.RELEASE</version>
</dependency>

                ⑥在web.xml里配置SpringMVC的中央控制器

<!-- 配置SpringMVC中央控制器 -->
<servlet>
  <servlet-name>DispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:springmvc-config.xml</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>DispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

               ⑦创建springmvc-config.xml配置文件

                ⑧在springmvc-config.xml配置文件中声明组件扫描器

                <context:component-scan>会自动扫描标记@Controller的控制器类

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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
">

    <!--扫描组件,将加上@Controller注解的类作为SpringMVC的控制层-->
    <!--配置controller扫描包,多个包之间用,分隔-->
    <context:component-scan base-package="com.xinzhi"/>

                ⑨创建controller层,创建Controller类

        5.@Controller

        @Controller用于声明某类的实例是一个控制器

@Controller
public class UserController {
    
}

        SpringMVC使用扫描机制找到项目中所有基于@Controller注解的控制器类。所以,为了让控制器类被SpringMVC框架扫描到,我们需要在配置文件中声明组件扫描器

        6.@RequestMapping

         @RequestMapping用于将请求和处理请求的控制器方法,关联起来,建立映射关系。SpringMVC接收到指定的请求,就会 来找到在映射关系中对应的控制器方法来处理这个请求。

//此时的请求路径为:/test
@RequestMapping("/test")
public String test() {
    return "/WEB-INF/page/show1.jsp";
}

       

三,请求参数的绑定

        1.默认类型(ServletAPI对象作为参数)

                HttpServletRequest HttpServletResponse

        2.基本数据类型

                String int ....

                如果前端请求参数的名字和后端的参数名字一样,会自动映射匹配

                参数传递过程中都是String类型的,会自动进行类型转换,从String类型向其他类型转换

                如果前端请求参数的名字和后端的参数名字不一样,在后端参数前面加

                @RequsetParam(“请求参数的名字”)    就可以把前端的值和后端的参数映射

        3.对象类型

                前端请求参数的名字和对象的属性名一致,会自动映射匹配

        4.对象嵌套类型

                一个对象里面嵌套另一个对象

                前端请求参数的名字和子对象名.属性名一致,会自动映射匹配

        5.数组类型

                前端请求参数的名字和数组名一致,会自动映射匹配

        6.集合类型

                前端请求参数的名字和集合名一致

                后台请求参数前面加@RequestParam,会自动映射匹配

         注意: 请求参数为List<String> names

        SpringMVC默认将List作为对象处理,赋值前先创建对象,然后将names作为对象的属性进行处理。由于List是接口,无法创建对象,报无法找到构造方法异常;修复类型为可创建对象的ArrayList类型后,对象可以创建,但没有names属性,因此数据为空。此时需要告知SpringMVC的处理器names是一组数据,而不是一个单一数据。通过@RequestParam注解,将参数打包成参数数组后, SpringMVC才能识别该数据格式,并判定形参类型是否为数组或集合,并按数组或集合对象的形式操作数据。

        7.自定义数据类型

                1)在配置文件中自定义类型转换器

<!--声明转换器-->
<!--1.将自定义Converter注册为Bean,受SpringMVC管理-->
<bean id="dateConverter" class="com.xinzhi.converter.DateConverter"/>
<!--2.设定自定义Converter服务bean-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!--3.注入所有的自定义Converter,该设定使用的是同类型覆盖的思想-->
    <property name="converters">
        <!--4.set保障同类型转换器仅保留一个,去重规则以Converter<S,T>的泛型为准-->
        <set>
            <!--5.具体的类型转换器-->
            <ref bean="dateConverter"/>
        </set>
    </property>
</bean>
<!--引用转换器,使转换器生效-->
<mvc:annotation-driven conversion-service="conversionService"/>

​​​​​​                2)编写自定义类型转换类

                创建converter包,自定义类型转换类要求实现Converter<S,T>接口

                S为传入的字符串,T为转换目标的类型

//字符串转换为Date类型
@Override
public Date convert(String s) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd");
    Date date = null;
    try {
        date = simpleDateFormat.parse(s);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;
}

四,响应

        1.转发(默认)

                由服务器端进行的页面跳转

                特点:

                        ①浏览器地址栏路径不发生变化

                        ②只能转发到当前服务器内部资源中

                        ③转发是一次请求

                        ④请求域中数据不会丢失

                Controller返回值是String类型时,retrun “forward:index.jsp

        2.重定向

                由浏览器进行的页面跳转

                特点:

                        ①地址栏:显示新的地址

                        ②请求次数:2次

                        ③请求域中的数据会丢失,因为是2次请求

                Controller返回值是String类型时,retrun “redirect:index.jsp

五,视图解析器

        视图解析器使用SpringMVC框架默认的InternalResourceViewResolver

        这个视图解析器支持JSP视图解析

        在springmvc-config.xml配置文件中配置如下:

<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 配置逻辑视图的前缀 -->
    <property name="prefix" value="/WEB-INF/page/" />
    <!-- 配置逻辑视图的后缀 -->
    <property name="suffix" value=".jsp" />
</bean>

        最终jsp物理地址:前缀+逻辑视图名+后缀

六,页面跳转方式

        1.直接返回字符串

//直接返回字符串跳转
@RequestMapping("/product1")
public String product1(String productName,int price){
    return "show";
}

        2.使用ModerAndView返回页面(1)

//使用ModerAndView返回页面(1)
@RequestMapping("/product2")
public ModelAndView product2(String productName,int price){
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("productName",productName);
    modelAndView.addObject("price",price);
    modelAndView.setViewName("show");
    return modelAndView;
}

        3.使用ModerAndView返回页面(2)

//使用ModerAndView返回页面(2)
@RequestMapping("/product3")
public ModelAndView product3(String productName,int price,ModelAndView modelAndView){
    modelAndView.addObject("productName",productName);
    modelAndView.addObject("price",price);
    modelAndView.setViewName("show");
    return modelAndView;
}

        4.使用Model返回页面

//使用Model返回页面
@RequestMapping("/product4")
public String product4(String productName,int price,Model model){
    model.addAttribute("productName",productName);
    model.addAttribute("price",price);
    return "show";
}

        5.使用HttpServlerRequest返回页面

//使用HttpServlerRequest返回页面
@RequestMapping("/product5")
public String product5(String productName,int price,HttpServletRequest request){
    request.setAttribute("productName",productName);
    request.setAttribute("price",price);
    return "show";
}

七,拦截器

        1.介绍

        主要用于拦截用户请求并作相应的处理。例如,在购物网站中通过拦截器可以拦截未登录的用户,禁止其购买商品,或者使用它来验证已登录用户是否有相应的操作权限等,Spring MVC提供了拦截器功能,通过配置即可对请求进行拦截处理。

        ①拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用

        ②拦截器只会拦截访问的控制器方法的路径如果访问的是jsp/html/css/image/js是不会进行拦截的

        2.核心原理

         AOP思想

        3.自定义拦截器

                1)实现接口

                        创建一个interceptor包,创建一个拦截器类,实现 HandlerInterceotor接口

                2)配置拦截器

<!--关于拦截器的配置-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--/** 包括路径及其子路径-->
        <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
        <!--/admin/** 拦截的是/admin/下的所有-->
        <mvc:mapping path="/test**"/><!--拦截的是以test开头的请求的路径-->
        <!-- <mvc:exclude-mapping path=""/><!– 用于指定排除的 url–>-->
        <!--bean配置的就是拦截器-->
        <bean class="com.xinzhi.interceptor.UserInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

        4.拦截器的使用场景

①日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等

②权限检查:如登录检测,进入处理器检测是否登录,如果没有直接返回到登录页面

③性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录)

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到