关闭页面特效

SpringMVC

1|0SpringMVC


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

View:视图 jsp html

Controller:控制器 servlet

2|0介绍


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

3|0执行流程


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响应用户。

4|0示例


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

5|0spring和springMVC容器关系


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

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

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

6|0请求与响应


6|1请求映射路径


名称:@RequestMapping

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

参数:method,params

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

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

7|0post请求乱码问题


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>

8|0请求参数与方法入参不同


@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"; }

9|0对象中嵌套数据传值


对象.属性

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

10|0数组的传值


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

11|0集合的传值


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

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

12|0JSON的传值


如果浏览器发送过来的是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/> <!--自动创建处理器映射器,处理器适配器,类型转换(浏览器发送过来的字符串可以转换成各种数据类型)-->

12|1特殊传参


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")

13|0响应


13|1@ResponseBody


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

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

14|0restFul风格


14|1介绍


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

优点:

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

14|2RESTful的实现


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

14|3入门案例


做法:在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 "查询全部操作"; } }

14|4@PathVariable


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

image-20230608103049272

14|5@RequestBody、@RequestParam、@PathVariable区别和应用


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

14|6注解合并


@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}")

__EOF__

作  者YXH
出  处https://www.cnblogs.com/YxinHaaa/p/17461683.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   YxinHaaa  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
0
0
关注
跳至底部
点击右上角即可分享
微信分享提示