SpringMVC

SpringMVC

Model:模型 业务逻辑层+数据访问层

View:视图 jsp html

Controller:控制器 servlet

介绍

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,SpringMVC 已经成为目前最主流的 MVC 框架之一, 从 Spring3.0 的发布, 就已全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。

springmvc 它让一个普通的Java类 上面加点注解 就可以实现和servlet一样的效果

springmvc优化了servlet

普通的Java类 加上注解 就变成了和servlet一样的功能 起了新名字就叫controller

优点

  1. 使用简单,开发便捷(相比于Servlet)
  2. 灵活性强

image-20230606150126423

执行流程

1686055907558

SpringMVC流程:
01、用户发送出请求到前端控制器DispatcherServlet。
02、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
03、HandlerMapping找到具体的控制器(可查找xml配置或注解配置),生成处理器对象的执行链(如果有),再一起返回给DispatcherServlet。
04、DispatcherServlet调用HandlerAdapter(处理器适配器)。
05、HandlerAdapter经过适配调用具体的处理器(controller)。
06、Controller执行完成返回ModelAndView对象。
07、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
08、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
09、ViewReslover解析后返回具体View(视图)。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。

示例

1.导入依赖

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.9.RELEASE</version>
</dependency>

2.controller

package com.yxh.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SpringTestController {
    @RequestMapping("aa")
    public String getSuccess(){
        return "success";
    }
}

3.四大组件配置

springmvc.xml

<?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
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.yxh.controller"/>

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

4.在web.xml中配置核心控制器

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>springTest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springTest</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

5.成功页面配置

webapp/pages/success.jsp

spring和springMVC容器关系

controller对象可以访问 业务逻辑层对象

业务逻辑层对象不可以访问controller层对象

原因是:业务罗基层和数据访问层对象都在spring父容器,controller对象在子容器中控,子容器中的对象可以访问父容器中的对象

请求与响应

请求映射路径

名称:@RequestMapping

作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

参数:method,params

method规定浏览器发送的请求的类型 ,请求不匹配报405

params规定浏览器发送请求必须携带参数params,不携带报400提示

post请求乱码问题

web.xml中配置(需要配置在servlet之前 )

<filter>
    <filter-name>tt</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value><!--指定编码格式-->
    </init-param>
    <init-param>
      <param-name>forceRequestEncoding</param-name>
      <param-value>true</param-value><!--强制编码-->
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>tt</filter-name>
    <url-pattern>/*</url-pattern><!--拦截路径-->
  </filter-mapping>

请求参数与方法入参不同

 @RequestMapping("aa")
//value:设置入参名称;
//required:参数是否为必须的,true为必须,false为不必须
//defaultValue:请求未带此参数时的默认值
    public String getSuccess(@RequestParam(value = "name1",required = false,defaultValue = "pwd111") String name, String pwd){
        System.out.println(name +  "        "+pwd);
        return "success";
    }

对象中嵌套数据传值

对象.属性

//如何给User对象中的嵌套的对象传值
@Data
public  class User implements Serializable{
	private String uname;
	private String upwd;
	private String sex;
	private String address;
	
	private Dog dog;
}

数组的传值

@RequestMapping("/cc1")
public String cc(String[] nums){
	Arrays.stream(nums).forEach(System.out::println);
	return "success";
}

集合的传值

@RequestMapping("/cc2")
public String cc(@ReuqestParam List<String> kk){
	kk.stream().forEach(System.out::println);
	return "success";
}

对象中传值数组或集合,请求参数和实体类中参数一样即可

JSON的传值

如果浏览器发送过来的是json格式的字符串

1.参数添加@RequestBody

2.需要导入依赖(把json格式的字符串转换成java中的对象或者数组)

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>

3.springmvc.xml配置文件中删除原来的处理器映射器和处理器适配器

<mvc:annotation-driven/>
<!--自动创建处理器映射器,处理器适配器,类型转换(浏览器发送过来的字符串可以转换成各种数据类型)-->

特殊传参

json对象传参无法和实体类属性对应:使用Map接收

json对象数组传参无法和实体类属性对应:使用List<Map>接收

传参为Date类型(springMVC只能将yyyy/MM/dd字符串转为日期类型)
如果浏览器发送过来的日期格式是yyyy-MM-dd需要使用注解@DataTimeFormat
(@DateTimeFormat(pattern="yyyy-MM-dd"))

实体类中属性为Date类型需要在实体类属性上指定格式@DateTimeFormat(pattern="yyyy-MM-dd")

响应

@ResponseBody

方式:响应为对象和对象集合时,在方法上添加

作用:将controller返回的java对象格式转换为 JSON对象

restFul风格

介绍

作用:简化url的书写格式,同一个url处理不同的请求

优点:

  • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
  • 书写简化
  1. GET用来获取资源
  2. POST用来新建资源
  3. PUT用来更新资源
  4. DELETE用来删除资源

RESTful的实现

  1. 访问地址是一样的
  2. 参数是通过/分隔的,如果有多个参数,使用多个/
请求地址(URI) 请求含义 请求方式
/user json 新增用户 POST
/user/1 删除编号1的用户 DELETE
/user/1/Jack/18 json 修改编号1的用户 PUT
/user/1 获取编号1的用户 GET

入门案例

做法:在Controller中定义方法时设定"http请求动作(请求方式)"和"设定请求参数(路径变量)"

package com.tyhxzy.controller;

import com.tyhxzy.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping(produces = "application/json;charset=utf-8")
public class UserController {

    /*
        添加请求方式: post
            method = RequestMethod.POST    限制请求方式为post
     */
    @RequestMapping(value = "/user",method = RequestMethod.POST)
    @ResponseBody
    public String add(@RequestBody User user){
        System.out.println("添加操作.."+user);
        return "添加";
    }


    /*
    修改请求方式: Put
        method = RequestMethod.PUT    限制请求方式为post
 */
    @RequestMapping(value = "/user",method = RequestMethod.PUT)
    @ResponseBody
    public String update(@RequestBody User user){
        System.out.println("更新操作.."+user);
        return "更新";
    }


    /*
   删除请求方式: Delete
       method = RequestMethod.Delete    限制请求方式为Delete

    {id} : {name} 参数占位符

    http://localhost:8080/user/10
    @PathVariable: 该注解的作用就是获取访问路径上的数据给到变量 ,占位符的名字与变量名字一样,可以省略名字不写
   */
    @RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable("id") Integer id){
        System.out.println("删除操作.."+id);
        return "删除";
    }


    /*
   修改请求方式: Get
       method = RequestMethod.Get    限制请求方式为get
    */
    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    @ResponseBody
    public String findById(@PathVariable("id") Integer id){
        System.out.println("查询操作.."+id);
        return "根据一个id查询";
    }

    /*
 修改请求方式: Get
     method = RequestMethod.Get    限制请求方式为get
  */
    @RequestMapping(value = "/user",method = RequestMethod.GET)
    @ResponseBody
    public String findAll(){
        System.out.println("查询全部操作..");
        return "查询全部操作";
    }
}

@PathVariable

  • 名称:@PathVariable
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参定义前面
  • 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

image-20230608103049272

@RequestBody、@RequestParam、@PathVariable区别和应用

  • 区别
    @RequestParam用于接收url地址传参或表单传参
    @RequestBody用于接收json数据
    @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
  • 应用
    后期开发中,发送请求参数超过1个,以json格式为主,@RequestBody应用较广
    如果发送非json格式数据,选用@RequestParam接收请求参数
    采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

注解合并

@Controller+@ResponseBody = @RestController

//@RequestMapping(value = "/hh/{id}",method = RequestMethod.GET)
@GetMapping("/hh/{id}")

//@RequestMapping(value = "/hh",method = RequestMethod.POST)
@PostMapping("/hh")
    
//@RequestMapping(value = "/hh",method = RequestMethod.PUT)
@PutMapping("/hh")
    
//@RequestMapping(value = "/hh/{id}",method = RequestMethod.DELETE)
@DeleteMapping("/hh/{id}")
posted @ 2023-06-06 20:42  YxinHaaa  阅读(5)  评论(0编辑  收藏  举报