24.12.26 SpringMVCDay01

SpringMVC

也被称为SpringWeb

Spring提供的Web框架,是在Servlet基础上,构建的框架

SpringMVC看成是一个特殊的Servlet,由Spring来编写的Servlet

搭建

  • 引入依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency>
  • web.xlm
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置Servlet--><servlet><servlet-name>mvcServlet</servlet-name><!--SpringMVC的核心类,请求的入口--><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--读取的配置文件路径--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:mvc1.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>mvcServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--乱码--></web-app>
  • mvc配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--BeanNameUrlHandlerMapping   bean对象的名字  url  和 Controller的映射关系--><!--/hello--><!--处理器,映射器--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!--适配器--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--跳转的jsp页面,统一添加前缀--><property name="prefix" value="/WEB-INF/"/><!--后缀--><property name="suffix" value=".jsp"/></bean><!--自定义的Controller,需要通过什么路径才能访问到--><bean name="/hello" class="com.javasm.demo.HelloController"/>
</beans>
  • 测试Controller
public class HelloController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {//ModelAndView  视图 和页面 页面的数据,配置的是跳转到哪个页面,向这个页面传递什么参数ModelAndView mv = new ModelAndView();//跳转的页面  任何情况下,/都表示根路径///WEB-INF/  是受保护的文件夹,默认在webapp路径下的文件,都可以直接访问,受保护的文件夹,内部文件,不能直接访问//mv.setViewName("/WEB-INF/demo/hello.jsp");mv.setViewName("demo/hello");//携带数据mv.addObject("abc","Hello Web MVC");return mv;}
}

流程

启动流程

启动Tomcat → 加载web.xml文件 → 读取servlet标签的配置 → DispatcherServlet 初始化 → 读取mvc.xml配置文件 → 解析配置文件 → 在Spring容器中实例化Controller → 其他的配置类实例化

访问流程

浏览器发起请求 → Tomcat中 → servlet-mapping 配置了/,所有的请求,都进入DispatcherServlet中 → 能获取到访问路径/hello → 寻找执行的方法 → 找到HelloController,执行方法 → 返回ModelAndView → Model的值放到request作用域,view的值,决定跳转到哪个页面

DispacherServlet内部流程

实际运用的案例

<?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"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--    开启包扫描--><context:component-scan base-package="com.javasm"/><!--代替适配器等配置--><mvc:annotation-driven/><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--跳转的jsp页面,统一添加前缀--><property name="prefix" value="/WEB-INF/"/><!--后缀--><property name="suffix" value=".jsp"/></bean></beans>
//地址 和 类的映射,通过/demo访问到当前类
@Controller
@RequestMapping("/demo")
public class DemoController {//当前方法的访问路径   /demo/f1@RequestMapping("/f1")public ModelAndView f1(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("abc","f1方法");modelAndView.setViewName("demo/hello");return modelAndView;}@RequestMapping("/f2")public ModelAndView f2(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("abc","f2方法");//报404,没有这个页面modelAndView.setViewName("demo/f2");return modelAndView;}
}
  • 404

找到了Controller,但是没有找到页面

没有找到Controller

乱码配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置Servlet--><servlet><servlet-name>mvcServlet</servlet-name><!--SpringMVC的核心类,请求的入口--><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--读取的配置文件路径--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:mvc2.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>mvcServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--乱码--><filter><filter-name>luan</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></filter><filter-mapping><filter-name>luan</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>

静态资源文件

    <!--静态资源文件放过--><mvc:default-servlet-handler/>

接收参数

  • 普通参数
<%--action="/game/doAdd1"http://localhost:8080/game/doAdd1缺少了项目名,/表示根路径,浏览器理解的根路径,是从8080/开始的action="/mvc/game/doAdd1"--%><%--当前页面的路径http://localhost:8080/mvc/game/jumpaction="game/doAdd1"http://localhost:8080/mvc/game/game/doAdd1action="doAdd1"http://localhost:8080/mvc/game/doAdd1--%><%--浏览器,点击刷新按钮,默认是重新提交表单浏览器,url地址栏,选中,按回车,是再次通过get方法,访问这个url地址浏览器url地址栏,只能发送get请求浏览器点击后退的时候,并没有刷新页面,只是读取了电脑本地的缓存--%><hr/><h1>普通参数</h1><form action="doAdd1" method="post">   对应Controller文件下的@PostMapping("/doAdd1")<p><input type="text" name="gameId" placeholder="请输入游戏ID"/></p><p><input name="gameName" placeholder="请输入游戏名称"></p><p><input type="submit" value="提交"></p></form>
    //仅可以使用post方式访问@PostMapping("/doAdd1")public ModelAndView doAdd1(Integer gameId,String gameName){System.out.println(gameId+"----"+gameName);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");//对应在webapp文件下的WEB-INF文件里创建一个game的文件再创建一个success的jsp文件mv.addObject("game",gameName);return mv;}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title></head><body><h1>成功页面</h1><h2>${game}</h2></body></html>

  • 数组
    <h1>数组参数</h1><form action="/mvc/game/doAdd2" method="post"><p><input type="checkbox" name="hobbys" value="smoke">抽烟</p><p><input type="checkbox" name="hobbys" value="drink">喝酒</p><p><input type="checkbox" name="hobbys" value="run">跑路</p><p><input type="submit" value="提交"></p></form>
    @PostMapping("/doAdd2")public ModelAndView doAdd2(String[] hobbys){String hobbysStr = Arrays.toString(hobbys);System.out.println(hobbysStr);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");mv.addObject("game",hobbysStr);return mv;}
  • 对象
    @PostMapping("/doAdd3")public ModelAndView doAdd3(Game game){System.out.println(game);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");mv.addObject("game",game);return mv;}

  • 包装类
//包装类 VO@PostMapping("/doAdd4")public ModelAndView doAdd4(GameVo game){System.out.println(game);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");mv.addObject("game",game);return mv;}
@Data
public class GameVo {private Game game;private Company company;
}

  • List和map
<form action="doAdd5" method="post"><p><input type="text" name="playerList[0].lv" placeholder="等级"><input type="text" name="playerList[0].nickname" placeholder="昵称"></p><p><input type="text" name="playerList[1].lv" placeholder="等级"><input type="text" name="playerList[1].nickname" placeholder="昵称"></p><p><input type="text" name="playerList[2].lv" placeholder="等级"><input type="text" name="playerList[2].nickname" placeholder="昵称"></p><p>背包</p><p><input type="text" name="items[1001]"><input type="text" name="items[1002]"><input type="text" name="items[1003]"></p><p><input type="submit" value="提交"></p></form>
@Data
public class GameVo{private Game game;private Company company;List<String> heroList;List<Player> playerList   ;Map<Integer,String> items;
}@PostMapping("/doAdd5")public ModelAndView doAdd5(GameVo gameVo){System.out.println(gameVo);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");mv.addObject("game",gameVo);return mv;}
  • JSON字符串

引入依赖

    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.2</version></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.23</version></dependency>
    @PostMapping("/doAdd6")public ModelAndView doAdd6(@RequestBody Game game){System.out.println(game);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");mv.addObject("game",game);return mv;}

    @PostMapping("/doAdd7")public ModelAndView doAdd7(@RequestBody List<Player> playerList){System.out.println(playerList);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");mv.addObject("game",playerList);return mv;}@PostMapping("/doAdd8")public ModelAndView doAdd8(@RequestBody GameVo gameVo){System.out.println(gameVo);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");mv.addObject("game",gameVo);return mv;}
{"game":{"gid":1001,"name":"cogo","price":"12.2","type":{"typeName":"fps","typeId":"2000"}},"company":{"id":100,"name":"尚马"},"heroList":["天使","源氏","提莫"],"playerList":[{"lv":10,"nickname":"推车"},{"lv":22,"nickname":"泉水指挥官"}],"items":{"1001":"大宝剑","1002":"激光武器","1003":"核武器"}
}

解决乱码问题

  <filter><filter-name>luan</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></filter><filter-mapping><filter-name>luan</filter-name><url-pattern>/*</url-pattern></filter-mapping>

获取ServletAPI

    //获取ServletAPI@GetMapping("/test1")public ModelAndView test1(HttpServletRequest request, HttpServletResponse response){HttpSession session = request.getSession();session.setAttribute("user","小明");ModelAndView mv = new ModelAndView();mv.setViewName("game/success");return mv;}@AutowiredHttpServletRequest request;@AutowiredHttpServletResponse response;@AutowiredHttpSession session;@GetMapping("/test2")public ModelAndView test2(){Object user = session.getAttribute("user");System.out.println(user);ModelAndView mv = new ModelAndView();mv.setViewName("game/success");return mv;}

返回值

返回String

跳转的页面地址

    //单纯的页面跳转,不想传值@GetMapping("/jump")public String jump(){return "game/player";}

JSON数据

@Controller
@RequestMapping("/player")
public class PlayerController {//单纯的页面跳转,不想传值@GetMapping("/jump")public String jump(){return "game/player";}//只想返回一个字符串,不需要返回页面@ResponseBody@GetMapping("/success")public String success(){return "success";}@GetMapping("/queryById")@ResponseBodypublic Player getById(Integer id){Player player = new Player();player.setLv(id);player.setNickname("昵称-----");return player;}@ResponseBody@GetMapping("/list")public List<Player> list(){return new ArrayList<>();}
}
  • 整个类都返回json,没有页面
@RestController

默认,整个类,返回的都是json数据,就不能返回页面了

转发(url地址不变)&重定向(url地址改变)

    //测试转发,不能使用json数据返回@GetMapping("/test1")public String test1(){//转发return "forward:test2";}@ResponseBody@GetMapping("/test2")public String test2(){return "我是Test2";}//重定向测试也不能返回json@GetMapping("/test3")public String test3(){//重定向return "redirect:test2";}

ResonseEntity

    @ResponseBody@GetMapping("/query/id")public ResponseEntity<Player> query(){Player player = new Player();player.setNickname("不知道");ResponseEntity<Player> entity = new ResponseEntity<>(player, HttpStatus.INTERNAL_SERVER_ERROR);return entity;}

携带Header

    @ResponseBody@GetMapping("/query/id2")public ResponseEntity<Player> query2(){Player player = new Player();player.setNickname("不知道");//new header对象HttpHeaders httpHeaders = new HttpHeaders();//header中添加自定义属性httpHeaders.add("javasm","Hello Java ");ResponseEntity<Player> entity = new ResponseEntity<>(player,httpHeaders, HttpStatus.INTERNAL_SERVER_ERROR);return entity;}

简化

    @ResponseBody@GetMapping("/query3")public ResponseEntity<String> query3(){//默认状态 200return ResponseEntity.ok("Success!!!!!!!!!!!!!!!");}
    @ResponseBody@GetMapping("/query4")public ResponseEntity<String> query4(){return ResponseEntity.status(500).body("Success??????");}

Rest风格

@RestController=    @ResponseBody+@Controller
@RestController
@RequestMapping("/company")
public class CompanyController {//不能接收特殊字符,接收简单的参数@GetMapping("/query/{id}/{name}")public Company queryById(@PathVariable("id") Integer cid,@PathVariable String name){Company company = new Company();company.setId(cid);company.setName(name);return company;}@GetMapping(value = {"/query2","/query2/{id}"})public Company query2(@PathVariable(required = false) Integer id){Company company = new Company();company.setId(id);return company;}
}

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

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

相关文章

国产 HighGo 数据库企业版安装与配置指南

国产 HighGo 数据库企业版安装与配置指南 1. 下载安装包 访问 HighGo 官方网站&#xff08;https://www.highgo.com/&#xff09;&#xff0c;选择并下载企业版安装包。 2. 上传安装包到服务器 将下载的安装包上传至服务器&#xff0c;并执行以下命令&#xff1a; [rootmas…

Java程序设计,使用属性的选项库,轻松实现商品检索的复杂查询(上)

一、背景 本文我们以某商城的商品检索为例,说一说如何使用属性及选项,实现复杂的逻辑表达式的查询。 先贴图,总结出业务需求。 可以通过一系列属性及选项的组合,过滤出用户想要的商品列表。 1、属性 上文中的品牌、分类、屏幕尺寸、CPU型号、运行内存、机身内存、屏幕材…

机器学习(二)-简单线性回归

文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …

WHAT KAN I SAY?Kolmogorov-Arnold Network (KAN)网络结构介绍及实战(文末送书)

一、KAN网络介绍 1.1 Kolmogorov-Arnold Network (KAN)网络结构的提出 2024年4月&#xff0c;来自MIT、加州理工学院、东北大学等团队的研究&#xff0c;引爆了一整个科技圈&#xff1a;Yes We KAN&#xff01; 这种创新方法挑战了多层感知器(Multilayer Perceptron&#xff…

YOLO11改进-模块-引入星型运算Star Blocks

当前网络设计中&#xff0c;“星型运算”&#xff08;逐元素乘法&#xff09;的应用原理未被充分探究&#xff0c;潜力有待挖掘。为解决此问题&#xff0c;我们引入 Star Blocks&#xff0c;其内部由 DW - Conv、BN、ReLU 等模块经星型运算连接&#xff0c;各模块有特定参数。同…

3.银河麒麟V10 离线安装Nginx

1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖&#xff0c;前往 官网下载 pcre2依赖下载&#xff0c;前往Git下载 zlib依赖下载&#xff0c;前往Git下载 下载完成后完整的包如下&#xff1a; 如果网速下载不到请使用网盘下载 通过网盘分享的文件…

【理解机器学习中的过拟合与欠拟合】

在机器学习中&#xff0c;模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示&#xff0c;详细解析过拟合与欠拟合现象&#xff0c;并提出应对策略。主要内容如下&#xff1a; 什么是过拟合和欠拟合&#xff1f; 如何防止过拟合和欠拟…

【婚庆摄影小程序设计与实现】

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个潮…

12.26 学习卷积神经网路(CNN)

完全是基于下面这个博客来进行学习的&#xff0c;感谢&#xff01; ​​【深度学习基础】详解Pytorch搭建CNN卷积神经网络LeNet-5实现手写数字识别_pytorch cnn-CSDN博客 基于深度神经网络DNN实现的手写数字识别&#xff0c;将灰度图像转换后的二维数组展平到一维&#xff0c;…

Unity URP多光源支持,多光源阴影投射,多光源阴影接收(优化版)

目录 前言&#xff1a; 一、属性 二、SubShader 三、ForwardLitPass 定义Tags 声明变体 声明变量 定义结构体 顶点Shader 片元Shader 四、全代码 四、添加官方的LitShader代码 五、全代码 六、效果图 七、结语 前言&#xff1a; 哈喽啊&#xff0c;我又来啦。这…

如何使用React,透传各类组件能力/属性?

在23年的时候&#xff0c;我主要使用的框架还是Vue&#xff0c;当时写了一篇“如何二次封装一个Vue3组件库&#xff1f;”的文章&#xff0c;里面涉及了一些如何使用Vue透传组件能力的方法。在我24年接触React之后&#xff0c;我发现这种扩展组件能力的方式有一个专门的术语&am…

109.【C语言】数据结构之求二叉树的高度

目录 1.知识回顾&#xff1a;高度&#xff08;也称深度&#xff09; 2.分析 设计代码框架 返回左右子树高度较大的那个的写法一:if语句 返回左右子树高度较大的那个的写法二:三目操作符 3.代码 4.反思 问题 出问题的代码 改进后的代码 执行结果 1.知识回顾&#xf…

分析排名靠前的一些自媒体平台,如何运用这些平台?

众所周知&#xff0c;现在做网站越来越难了&#xff0c;主要的原因还是因为流量红利时代过去了。并且搜索引擎都在给自己的平台做闭环改造。搜索引擎的流量扶持太低了。如百度投资知乎&#xff0c;给知乎带来很多流量扶持&#xff0c;也为自身内容不足做一个填补。 而我们站长…

2024大模型在软件开发中的具体应用有哪些?(附实践资料合集)

大模型在软件开发中的具体应用非常广泛&#xff0c;以下是一些主要的应用领域&#xff1a; 自动化代码生成与智能编程助手&#xff1a; AI大模型能够根据开发者的自然语言描述自动生成代码&#xff0c;减少手动编写代码的工作量。例如&#xff0c;GitHub Copilot工具就是利用AI…

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机&#xff0c; vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式&#xff1b;nat模式&#xff1b;host模式 一、桥接模式 所谓桥接模式&#xff0c;也就是虚拟机与宿主机处于同一个网段&#xff0c; 宿主机…

3.系统学习-熵与决策树

熵与决策树 前言1.从数学开始信息量(Information Content / Shannon information)信息熵(Information Entropy)条件熵信息增益 决策树认识2.基于信息增益的ID3决策树3.C4.5决策树算法C4.5决策树算法的介绍决策树C4.5算法的不足与思考 4. CART 树基尼指数&#xff08;基尼不纯度…

SpringBoot + HttpSession 自定义生成sessionId

SpringBoot HttpSession 自定义生成sessionId 业务场景实现方案 业务场景 最近在做用户登录过程中&#xff0c;由于默认ID是通过UUID创建的&#xff0c;缺乏足够的安全性&#xff0c;决定要自定义生成 sessionId。 实现方案 正常的获取session方法如下&#xff1a; HttpSe…

破解海外业务困局:新加坡服务器托管与跨境组网策略

在当今全球化商业蓬勃发展的浪潮之下&#xff0c;众多企业将目光投向海外市场&#xff0c;力求拓展业务版图、抢占发展先机。而新加坡&#xff0c;凭借其卓越的地理位置、强劲的经济发展态势以及高度国际化的营商环境&#xff0c;已然成为企业海外布局的热门之选。此时&#xf…

数学课程评价系统:客户服务与教学支持

2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架是属于重量级…

攻防世界web第三题file_include

<?php highlight_file(__FILE__);include("./check.php");if(isset($_GET[filename])){$filename $_GET[filename];include($filename);} ?>惯例&#xff1a; 代码审查&#xff1a; 1.可以看到include(“./check.php”);猜测是同级目录下有一个check.php文…