Spring_FrameWork_07(SpringMVC与SSM整合)

news2024/7/4 6:34:43

SpringMVC(一种基于java实现的轻量级web框架)
请求与响应
REST风格
SSM整合
拦截器

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}
@Configuration
@ComponentScan("com.example.controller")
public class SpringMvcConfig {



}
@Controller
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module','springmvc'}";
    }

}

创建一个SpringMvc(要注意tomcat和spring版本问题)
1.创建ServletContainersInitConfig配置类,他在tomcat启动时加载
2.创建SpringMvcConfig配置类来配置springmvc
3.创建UserController来配置Controller

启动服务器初始化过程

请添加图片描述
请添加图片描述
请添加图片描述
配置类spring和springmvc在一起

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
}

或者继承AbstractAnnotationConfigDispatcherServletInitializer接口可以更吉简单

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[0];
    }
}

请求和响应
请求映射路径
请求参数
日期类型参数传递
响应json数据
请添加图片描述

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module','user save'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user delete ...");
        return "{'module','user delete'}";
    }

}

请求映射路径
在控制器类最上方加入@RequestMapping(“/user”)注释表示类访问路径前缀
请求方式
1.get请求
2.post请求

在spring里不需要区分get和post,已经合二为一了

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("utf-8");
        return new Filter[]{filter};
    }

中文乱码处理,在ServletContainersInitConfig类中设置过滤器

参数种类
1.普通参数
2.POJO类型参数
3.嵌套POJO类型参数
4.数组类型参数
5.集合类型参数

    @RequestMapping("/commenParam")
    @ResponseBody
    public String save(@RequestParam("name") String username, int age){
        System.out.println("普通参数传递 username ==> "+username);
        System.out.println("普通参数传递 age ==> "+age);
        return "{'module','common param'}";
    }

@RequestParam(“name”)注解把对应html访问路径的参数与函数参数相对应

POJO参数(包含引用类型)

    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("pojoParam参数传递 user ==> "+user);
        return "{'module','pojo param'}";
    }

在这里插入图片描述
在这里插入图片描述

数组参数

    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println("arrayParam参数传递 likes ==> "+ Arrays.toString(likes));
        return "{'module','array param'}";
    }

在这里插入图片描述
数组只需要传入相同的名字就可以,不同名字无法接收

List集合

    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes){
        System.out.println("listParam参数传递 likes ==> "+ likes);
        return "{'module','list param'}";
    }

参数前面要加入@RequestParam注解

不加的话,因为默认是按照集合的属性,使用set方法注入进去,所以会出错,spring把集合当初实体类处理了,加入之后就会按照参数把数据传入

json传递参数
集合参数

    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println("list common参数传递 list ==> "+ likes);
        return "{'module','list common for json param'}";
    }

1.导入jackson坐标,因为spring没有处理json格式的方法
2.在springmvc配置类加入@EnableWebMvc注释
3.加入@RequestBody来把请求体的参数传入,否则list集合无法识别
在这里插入图片描述
pojo参数

    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println("pojo common参数传递 user ==> "+ user);
        return "{'module','pojo common for json param'}";
    }

在这里插入图片描述
POJO集合参数

    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list){
        System.out.println("list pojo common参数传递 user ==> "+ list);
        return "{'module','list pojo for json param'}";
    }

在这里插入图片描述
请添加图片描述
日期类型参数传递
日期类型数据基于系统格式不同也不相同
2088-08-18
2088/08/18
08/18/2088

    @RequestMapping("/dataParam")
    @ResponseBody
    public String dataParam(Date date,@DateTimeFormat(pattern = "yyyy-MM-dd") Date date1
            ,@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2){
        System.out.println("参数传递 date ==> "+ date);
        System.out.println("参数传递 date1 ==> "+ date1);
        System.out.println("参数传递 date2 ==> "+ date2);
        return "{'module','date param'}";
    }

在这里插入图片描述
date类型的参数除了斜线以外都需要添加@DateTimeFormat注解来解析日期格式,否则出错
@EnableWebMvc功能之一:根据类型匹配对应的类型转换器

响应

  • 响应页面
  • 响应数据
    - 文本数据
    - json数据

响应页面/跳转页面

    @RequestMapping("/toJumpPage")
    public String toJumpPage(){
        System.out.println("返回纯文本数据");
        return "index.jsp";
    }

响应文本(加入@ResponseBody注释即变为字符串)

    @RequestMapping("/toText")
    @ResponseBody
    public String toText(){
        System.out.println("返回纯文本数据");
        return "response text";
    }

响应POJO

    @RequestMapping("/toJsonPOJO")
    @ResponseBody
    public User toJsonPOJO(){
        System.out.println("返回json对象数据");
        User user = new User();
        user.setName("itcast");
        user.setAge(15);
        return user;
    }

响应POJOlist集合

    @RequestMapping("/toJsonList")
    @ResponseBody
    public List<User> toJsonList(){
        System.out.println("返回json对象数据");
        User user = new User();
        user.setName("itcast");
        user.setAge(15);
        List<User> users = new ArrayList<>();
        users.add(user);
        return users;
    }

@ResponseBody
作用:设置当前控制器返回值为响应体

Rest风格(Representational State Transfer)
表现形式状态转换
请添加图片描述
请添加图片描述

    @RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user delete ..."+id);
        return "{'module':'user delete'}";
    }

@PathVariable注解表示将路径中的路径变量与参数变量对应

    @RequestMapping(value = "/users",method = RequestMethod.POST)
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }

    @RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user delete ..."+id);
        return "{'module':'user delete'}";
    }

    @RequestMapping(value = "/users",method = RequestMethod.PUT)
    @ResponseBody
    public String update(){
        System.out.println("user update ...");
        return "{'module':'user update'}";
    }

    @RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
    @ResponseBody
    public String getById(@PathVariable Integer id){
        System.out.println("user getById ..."+id);
        return "{'module':'user getById'}";
    }

    @RequestMapping(value = "/users",method = RequestMethod.GET)
    @ResponseBody
    public String getAll(){
        System.out.println("user getAll ...");
        return "{'module':'user getAll'}";
    }

请添加图片描述

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }

    @DeleteMapping("/{id}")
    public String delete(@PathVariable Integer id){
        System.out.println("user delete ..."+id);
        return "{'module':'user delete'}";
    }

    @PutMapping
    public String update(){
        System.out.println("user update ...");
        return "{'module':'user update'}";
    }

    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("user getById ..."+id);
        return "{'module':'user getById'}";
    }

    @GetMapping
    public String getAll(){
        System.out.println("user getAll ...");
        return "{'module':'user getAll'}";
    }

}

请添加图片描述
@RestController注解代表@Controller+@ResponseBody

如果无法访问html和js等文件,加入SpringMvcSupport类来让springmvc对spring放行

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }
}

在这里插入图片描述

SSM整合
请添加图片描述

    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        Book book = bookService.getById(id);
        Integer code = book!=null ? Code.SELECT_OK:Code.SELECT_ERR;
        String msg = book!=null ? "":"数据查询失败请重试";
        return new Result(code,book,msg);
    }

在这里插入图片描述

异常处理器
出现异常的常见位置和常见诱因如下

  • 框架内部抛出的异常:因使用不合规导致
  • 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
  • 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常)
  • 表现层抛出的异常:因数据收集,校验等规则导致(例如:不匹配的数据类型间导致异常)
  • 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)

所有异常均抛出到表现层处理
使用aop处理,但spring有异常处理器

异常处理器
集中的统一的处理项目中的异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【工具】用AI辅助论文/博客的写作:Obsidian+Text Generator的详细安装教程

目录 前言 介绍 Obsidian Text-Generator 使用教程 安装Obsidian 安装Text Generator 插件安装 获取开放 AI API 密钥 插件选项配置 初体验 前言 对于作家、博主和学生来说&#xff0c;这是一个很好的工具&#xff0c;它通过使用最强大的语言模型之一&#xff1a;Ope…

[数据结构基础]链式二叉树的几个典型的基础oj问题

今年是农历腊月二十九&#xff0c;提前祝大家新春快乐。这是我壬寅虎年最后一篇文章&#xff0c;感谢大家的阅读。祝大家兔年吉祥&#xff0c;身体健康、阖家幸福、学业有成、事业如意、财源滚滚&#xff01; 前置说明 本文中所有用到的二叉树及二叉树节点&#xff0c;都是由…

Fabric中的txid exists问题

Fabric 默认配置中tls证书有效期为一年&#xff0c;相信挖了不少的坑&#xff0c;我前段时间写了篇文章介绍了下解决的思路&#xff0c;但是自己真解决起来还是没解决问题&#xff0c;这种分布式企业架构太复杂。 最近有遇到一个奇怪的问题&#xff0c;小伙伴写的存证数据&…

plt自定义水平线和垂直线、水平区域和垂直区域

一、添加x轴y轴垂直辅助线 1、函数 axvline函数&#xff1a;绘制垂直线。axhline函数&#xff1a;绘制水平线。 2、参数 plt.axvline(x0, ymin0, ymax1, c"g", ls"--", lw2, labelNone)。axhline类似 x&#xff1a;垂直线在x轴上的位置。浮点数&#xf…

AcWing1227.分巧克力——学习笔记

目录 题目 代码 AC结果 思路&#xff1a; 一、设置全局变量 二、获取数据 三、当前大小可得到的巧克力数是否满足每个小朋友至少分到一块 四、二分法找每个小朋友可得到的最大大小 题目 1227. 分巧克力 - AcWing题库https://www.acwing.com/problem/content/descripti…

Python---函数相关知识

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 函数前言函数的使用函数的语法格式函数的参数函…

Python脚本集成SQLite3数据库

文章目录一、Sqlite3数据库的基本使用1.数据库是什么2.数据库分类二、正式开始使用SQLite3&#xff08;Python&#xff09;1.基础sql命令2.Python连接SQLite3①查询②增加③更新一、Sqlite3数据库的基本使用 1.数据库是什么 借用百科上的话&#xff0c;数据库是“按照数据结构…

yolo v8 解决了 v5 的问题嘛?

文章大纲 yolo v8 简介网络结构yolo v8 准确率的提升yolo v8 的速度提升参考文献与学习路径yolo v8 简介 官网: https://ultralytics.com/yolov8https://github.com/triple-Mu/YOLOv8-TensorRT详细介绍: https://learnopencv.com/ultralytics-yolov8/网络结构 yolo v8 准确率…

I.MX6ULL裸机开发笔记3:SDK烧录镜像

目录 一、获取NXP官方SDK 二、Linux安装SDK 三、SDK中相关工具 四、烧录工具 一、获取NXP官方SDK 官方网站MCIMX6ULL-EVK_i.MX6ULL评估套件_NXP 半导体 二、Linux安装SDK ./XXX.run 这里如果提示sudo ./XXX.run 找不到命令&#xff0c;就可以用ls -l查看当前文件夹文件的…

VVDocumenter-Xcode github README.md 中英文翻译

最近在学习 Xcode 的使用&#xff0c;查到有一款用于生成注释文档的插件&#xff1a;VVDocumenter-Xcode 进入其 github 页面之后看 README&#xff0c;看到两句话&#xff1a; 1. Goodbye World&#xff1a; 再不更新了&#xff1f; 2. 从 Xcode 8 之后Apple官方提供了插件做…

Python爬虫---爬虫介绍,实战案例

目录标题1、爬虫介绍1.1 爬虫的合法性1.2 网络爬虫的尺寸1.3 robots.txt协议1.4 http&https协议1.5 requests模块1.5.1 request库的异常2、实战案例2.1 百度页面2.2 爬取京东商品页面2.3 爬取亚马逊商品页面-更改headers2.4 百度/360搜索关键词提交-params2.5 网络图片的爬…

Nacos 报Statement cancelled due to timeout or client request

1. 问题&#xff1a;nacos 启动报错&#xff0c;启动失败&#xff0c;全部报错下面贴出。 2. 结论&#xff1a;排查结果为服务器带宽不够&#xff0c;mysql 查询的数量量太大&#xff0c;传输时间损坏在网络io上&#xff01; 3. 下面开始回溯事故起因&#xff1a; 前期config…

2022年一年级入学小结

2022年即将过去&#xff0c;在这里&#xff0c;简单回顾一下Richard同学进入小学一学期后的成长经历和小结。先说说学校生活Richard很喜欢目前的学校&#xff0c;喜爱给他授课的每一位老师&#xff0c;也和老师和同学们相处得不错&#xff0c;自诩自己现在的”粉丝“蛮多。从我…

C++设计模式(6)——适配器模式

亦称&#xff1a; 封装器模式、Wrapper、Adapter 意图 适配器模式是一种结构型设计模式&#xff0c; 它能使接口不兼容的对象能够相互合作。 问题 假如你正在开发一款股票市场监测程序&#xff0c; 它会从不同来源下载 XML 格式的股票数据&#xff0c; 然后向用户呈现出美…

9.框架SpringMVC

一、基本概念 Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架&#xff0c;本质上相当于 Servlet。Spring MVC 使用 MVC 架构模式的思想&#xff0c;将 Web 应用进行职责解构&#xff0c;把一个复杂的 Web 应用划分成模型&#xff08;Model&#xff09…

HashMap的使用:put、remove和get方法原理

关联项目需求进行FeatureAB上报的时候&#xff0c;我们使用HashSet的add方法存key值&#xff0c;如果key已存在&#xff0c;则add失败&#xff0c;返回false&#xff0c;如果key不存在&#xff0c;add成功&#xff0c;返回true。看源码中HashSet的add(E e)方法实现&#xff1a;…

【Git】IDEA 集成 GitHub

8、IDEA 集成 GitHub 8.1、设置 GitHub 账号 如果出现 401 等情况连接不上的&#xff0c;是因为网络原因&#xff0c;可以使用以下方式连接&#xff1a; 然后去 GitHub 账户上设置 token。 点击生成 token。 复制红框中的字符串到 idea 中。 点击登录。 8.2、分享工程到 GitHu…

【甄选靶场】Vulnhub百个项目渗透——项目五十五:SP-LEOPOLD v1.2(beef联动msf,脏牛提权)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目五十五&#xff1a;SP-LEOPOLD v1.2&#xff08;beef联动msf&#xff0c;脏牛提权&#xff09; &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&am…

ZooKeeper-集群搭建

5)ZooKeeper 集群搭建 5.1)Zookeeper集群介绍 Leader选举&#xff1a; •Serverid&#xff1a;服务器ID 比如有三台服务器&#xff0c;编号分别是1,2,3。 编号越大在选择算法中的权重越大。 •Zxid&#xff1a;数据ID 服务器中存放的最大数据ID.值越大说明数据 越新&…

剑指offer—day1.用两个栈实现队列、包含min函数的栈

1.用两个栈实现队列 本题来源&#xff1a;力扣 剑指 Offer 09. 用两个栈实现队列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/题目描述 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两…