你真的了解SpringMVC吗?(上)

简介: 你真的了解SpringMVC吗?(上)

介绍MVC



MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分

M:Model,模型层,指工程中的JavaBean,作用是处理数据


JavaBean分为两类:


  • 一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
  • 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。


V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器


MVC的工作流程:


用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller 调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果 找到相应的View视图,渲染数据后最终响应给浏览器


三层架构分为:


表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台 servlet


SpringMVC的特点


  • Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
  • 基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一 处理
  • 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
  • 代码清新简洁,大幅度提升开发效率 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
  • 性能卓著,尤其适合现代大型、超大型互联网项目要求


SpringMVC处理请求案例



  1. 首先创建web工程,可以直接选择webapp进行创建,也可以自己手动创建
  2. 配置web.xml文件 (注意这里的servlet-name必须要与WE-INF下的XXX-servlet.xml文件中的XXX名称相同)


1.配置SpringMVC-servlet.xml文件 (注意文件中的视图前缀下的文件名/WEB-INF/templates/就是在templates下创建的文件)

<?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: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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--    扫描控制层组件-->
       <context:component-scan base-package="com_Ray.springMVC.controller"></context:component-scan>
    <!-- 配置Thymeleaf视图解析器
        作用:解析视图 ,使用之后就可以使用springmvc为我们提供的方式来进行视图渲染,并实现页面跳转
    -->
    <bean id="viewResolver"
          class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!-- 视图前缀 -->
                        <property name="prefix" value="/WEB-INF/templates/"/>
<!--                逻辑视图:/WEB-INF/templates/(前缀)  index - .html(后缀)
                            == 物理视图(全地址) - 视图前缀 - 视图后缀
                    物理视图(需要访问的网页)-->
                        <!-- 视图后缀 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>


  1. 创建Controller控制层的相关代码,用于接受请求和进行请求转发和跳转
  2. 模块名+Controller 类其中方法名加 @RequestMapping(“/”)标签就是作为请求映射的标签,其中(“/”): 表示的是绝对路径为http://localhost:8080/SpringMVC/ 上下文的这个请求 返回值return作用就是跳转至需要跳转的页面,内容:“逻辑视图名称”
  3. pom.xml中的配置


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <parent>
        <artifactId>java_workSpace_SSM</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>war</packaging>
    <name>SpringMVC</name>
    <artifactId>SpringMVC</artifactId>
    <build>
        <plugins>
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
                <version>6.1.7</version>
                <configuration>
                    <connectors>
                        <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                            <port>8888</port>
                            <maxIdleTime>30000</maxIdleTime>
                        </connector>
                    </connectors>
                    <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}
                    </webAppSourceDirectory>
                    <contextPath>/</contextPath>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <!-- SpringMVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- 日志 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- ServletAPI -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- Spring5和Thymeleaf整合包 -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
            <version>3.0.12.RELEASE</version>
        </dependency>
    </dependencies>
</project>


如果想要将配置文件放在类路径下的resources下,那么就可以这样设置

<!--a
    - SpringMVC 的前端控制器DispatcherServlet
    - Servlet that dispatches requests to the Spring managed block servlets
    -->
  <servlet>
<!--    这里的servlet-name一定要与WEB_INF下的配置文件XXX-servlet.xml中的XXX名字相同-->
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <!--初始化的作用:将我们的配置文件放到resources路径下-->
          <param-name>ContextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
      </init-param>
  </servlet>
  <!-- URL space mappings ============================================= -->
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern><!--表示所有的请求都需要进行过滤 (被前端控制器处理)  *.do :表示后缀处理-->
  </servlet-mapping>


总结简单的运行原理及过程


  1. 浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被 前端控制器 DispatcherServlet 处理。
  2. 前端控制器会 读取SpringMVC的核心配置文件 ,通过 扫描组件 找到控制器, 将请求地址和控制器中@RequestMapping注解的 value属性值进行匹配
  3. 若匹配成功,该注解所标识的控制器方法就是处理请求的方法。
  4. 处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会 被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视 图所对应页面


具体如何处理一个请求★★★★★:


  1. @RequestMapping注解功能: 从注解名称上我们可以看到,@RequestMapping注解的作用就是 将请求和处理请求的控制器方法关联 起来,建立映射关系。 SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
  2. @RequestMapping注解位置★★★(类与方法) :


@RequestMapping 标识一个类 :设置映射请求的请求路径的 初始信息**

@RequestMapping 标识一个方法 :设置映射请求请求路径的 具体信息**


如果说两个都设置了RequestMApping , 那么就是在 访问方法上的请求时需要加上类上的RequestMapping的地址


@Controller
@RequestMapping("/test/")
public class EmployeeController {
    @Autowired
    private EmployeeDao employeeDao;
    //查询所有的员工信息
//请求地址问 : /test/employee
    @GetMapping("/employee")
    public String selectAll(Model model){
        Collection<Employee> employeeAll = employeeDao.getAll();
        model.addAttribute("employeeAll",employeeAll);
        return "emp_list";
    }
}


@RequestMapping注解的value属性:(可以设置多个) : 为数组属性,即为浏览器所发送请求的请求路径匹配的value属性中的任何一个值(只要一个满足就可以)

//查询所有的员工信息
@GetMapping({"/test/employee","test/hello","..."})
public String selectAll(Model model){
    Collection<Employee> employeeAll = employeeDao.getAll();
    model.addAttribute("employeeAll",employeeAll);
    return "emp_list";
}


@RequestMapping注解的method属性( 也是数组 ): 表示请求方式() mathod={RequestMethod.POST ,RequestMethod.GET } 作用: 通过请求方式匹配请求


注: 1、对于处理指定请求方式的控制器方法,SpringMVC中提供了


@RequestMapping的派生注解

处理get请求的映射–>@GetMapping

处理post请求的映射–>@PostMapping

处理put请求的映射–>@PutMapping

处理delete请求的映射–>@DeleteMapping


2、常用的请求方式有get,post,put,delete 但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符 串(put或delete),则按照默认的请求方式get处理 若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter


1.@RequestMapping注解的param属性作用 :

通过请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性到的设置


注解的params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数 和请求映射的匹配关系


对于params属性的设置: 如果params属性设置了值,那么请求参数就必须加上对应的值 (否则报400错误) 下面是两种方式 :


一定不能携带password


1.@RequestMapping注解的header属性(用法和param用法一模一样):


SpringMVC支持ant风格的路径


?:表示任意的单个字符


? 就会被解析成和前后字符相同的字符 ,但是不能匹配特殊字符(比如 ? )


*:表示任意的0个或多个字符


以下两种都可以 (但是不能为 / )


******* :表示任意层数的任意目录 注意:在使用时,* 只能使用//xxx的方式** ( //中间不能出现其他字符** )


SpringMVC中支持路径中的占位符


原始方式: /deleteUser?id=1


rest方式: /user/delete/1****


其中的admin/1 都是参数 : 需要进行赋值


目录
相关文章
|
Java Spring
81.【SpringMVC】(二)
81.【SpringMVC】
113 0
|
前端开发 JavaScript Java
|
前端开发 Java 网络架构
|
缓存 前端开发 Java
|
7月前
|
前端开发 Java 数据格式
|
7月前
|
JSON 前端开发 Java
|
7月前
|
JSON 前端开发 JavaScript
|
JSON 前端开发 Java
springMVC(2)
SpringMVC_JSR303数据校验
62 0
|
前端开发 Java Spring
你真的了解SpringMVC吗?(下)
你真的了解SpringMVC吗?(下)
70 0
|
8月前
|
前端开发 Java API