当前位置: 首页 > news >正文

二、SpringMVC注解式开发

1. @RequestMapping注解

此注解就是来映射服务器访问的路径

  1. 可加在方法上,是为此方法注册一个可以访问的名称(路径)

  2. 可以加在类上,相当于是包名(虚拟路径),区分不同类中相同的action的名称

  3. 可区分get请求和post请求

    package com.powernode.controller;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;@Controller
    public class ReqAction {@RequestMapping(value = "/req.action", method = RequestMethod.GET)public String req(){System.out.println("处理get请求");return "main";}@RequestMapping(value = "/req.action", method = RequestMethod.POST)public String req1(){System.out.println("处理post请求");return "main";}
    }
    

SpringMVC优化

在这里插入图片描述

2.五种数据提交的方式

1.单个数据提交

在form表单中,对应的name即是Controller的参数

<h2>1.单个数据提交</h2>
<form action="${pageContext.request.contextPath}/one.action">姓名:<input name="myname"><br>年龄:<input name="age"><br><input type="submit" value="提交">
</form>
@RequestMapping("/one.action")
public String one(String myname, int age){System.out.println("myname=" + myname + ",age=" + (age + 100));//myname=张三,age=122return "main";
}

2.对象封装数据提交

在提交请求中,保证请求参数的名称与实体类中成员变量的名称一致,则可以自动创建对象,则可以自动提交数据,自动类型转换,自动封装数据到对象中.

<h2>2.对象封装数据提交</h2>
<form action="${pageContext.request.contextPath}/two.action">姓名:<input name="name"><br>年龄:<input name="age"><br><input type="submit" value="提交">
</form>
public class User {private String name;private int age;// 省略构造方法,set、get、toString方法
@RequestMapping("/two.action")
public String two(User user){System.out.println(user);//User{name='张三', age=25}return "main";
}

3.动态占位符提交

仅限于超链接或地址拦提交数据.一杠一值,一杠一大括号,斜杆+值提交,用斜杆+大括号接收数据,使用注解@PathVariable来解析. 用来解析路径中的请求参数

<h2>3.动态占位符提交</h2>
<a href="${pageContext.request.contextPath}/three/张三/22.action">动态提交</a>
@RequestMapping("/three/{name}/{uage}.action")
public String three(@PathVariable String name,@PathVariable("uage") int age){System.out.println("name=" + name + ",age=" + (age + 100));//name=张三,age=122return "main";
}

4.映射名称不一致

提交请求参数与action方法的形参的名称不一致,使用注解@RequestParam来解析 用来解决名称不一致的问题

<h2>4.参数名称不一致解决方案</h2>
<form action="${pageContext.request.contextPath}/four.action">姓名:<input name="name"><br>年龄:<input name="age"><br><input type="submit" value="提交">
</form>
@RequestMapping("/four.action")
public String four(@RequestParam("name") String uname,@RequestParam("age") int uage){System.out.println("uname=" + uname + ",uage=" + (uage + 100));//uname=张三,uage=122return "main";
}

5.手工提取数据

<h2>5.手工提取数据</h2>
<form action="${pageContext.request.contextPath}/five.action">姓名:<input name="name"><br>年龄:<input name="age"><br><input type="submit" value="提交">
</form>
@RequestMapping("/five.action")
public String five(HttpServletRequest request){String name = request.getParameter("name");int age = Integer.parseInt(request.getParameter("age"));System.out.println("name=" + name + ",age=" + (age + 100));//name=张三,age=122return "main";
}

3.action方法的返回值

  1. String:客户端资源的地址,自动拼接前缀和后缀.还可以屏蔽自动拼接字符串,可以指定返回的路径.
  2. Object:返回json格式的对象.自动将对象或集合转为json.使用的jackson工具进行转换,必须要添加jackson依赖.一般用于ajax请求.
  3. void:无返回值,一般用于ajax请求.
  4. 基本数据类型,用于ajax请求.
  5. ModelAndView:返回数据和视图对象,现在用的很少.

完成ajax请求访问服务器,返回学生集合.

  1. 添加jackson依赖

    <!--jackson依赖-->
    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
    </dependency>
    
  2. 在webapp目录下新建js目录,添加jQuery函数库
    jquery-3.3.1.js

  3. 编写index.jsp页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>ajax</title><%--导入jQuery的函数库--%><script src="js/jquery-3.3.1.js"></script>
    </head>
    <body>
    <br>
    <a href="javascript:showStu()">访问服务器返回学生集合</a><br>
    <div id="mydiv">等待服务器返回数据</div>
    </body>
    <script type="text/javascript">function showStu() {// 使用jQuery封装的ajax()方法发送请求$.ajax({url:"${pageContext.request.contextPath}/list.action",type:"get",dataType:"json",success:function (stuList) {var s = "";$.each(stuList,function (i,stu){s += stu.name + "----" + stu.age + "<br>";});// 回显数据$("#mydiv").html(s)}});}
    </script>
    </html>
    
  4. 在springmvc.xml文件中添加注解驱动<mvc:annotationdriven/>,用来解析@ResponseBody注解

    <?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/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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--包扫描--><context:component-scan base-package="com.powernode.controller"/><!--添加注解驱动 处理ajax请求--><mvc:annotation-driven></mvc:annotation-driven>
    </beans>
    
  5. 在action上添加注解@ResponseBody,用来处理ajax请求

    package com.powernode.controller;import com.powernode.pojo.Student;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import java.util.ArrayList;
    import java.util.List;@Controller
    public class StudentListAction {@RequestMapping("/list.action")// 解析ajax请求@ResponseBodypublic List<Student> list(){List<Student> list = new ArrayList<>();Student stu1 = new Student("张三",22);Student stu2 = new Student("李四",23);Student stu3 = new Student("王五",24);list.add(stu1);list.add(stu2);list.add(stu3);// SpringMVC框架负责将集合转为json数组return list;}
    }
    

4.四种跳转方式

本质还是两种跳转:请求转发和重定向,衍生出四种是请求转发页面,转发action,重定向页面,重定向action
请求转发:是基于服务端的跳转,因此显示的URL还是xx.action
重定向:是基于客户端的跳转,等同于重新访问一个网址,所以URL为正常
在这里插入图片描述

<a href="${pageContext.request.contextPath}/one.action">1.请求转发页面</a><br>
<a href="${pageContext.request.contextPath}/two.action">2.请求转发action</a><br>
<a href="${pageContext.request.contextPath}/three.action">3.重定向页面</a><br>
<a href="${pageContext.request.contextPath}/four.action">4.重定向action</a><br>
package com.powernode.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class JumpAction {@RequestMapping("/one.action")public String one(){System.out.println("请求转发页面跳转");return "main";// 默认使用视图解析器拼接前缀后缀进行页面跳转}@RequestMapping("/two.action")public String two(){System.out.println("请求转发action跳转");// forward: 可以屏蔽前缀和后缀的拼接,实现请求转发跳转return "forward:/other.action";}@RequestMapping("/three.action")public String three(){System.out.println("重定向页面");// redirect: 可以屏蔽前缀和后缀的拼接,实现重定向跳转return "redirect:/admin/main.jsp";}@RequestMapping("/four.action")public String four(){System.out.println("重定向action");return "redirect:/other.action";}
}

5.SpringMVC默认的参数类型

不需要去创建,直接拿来使用即可.

  1. HttpServletRequest
  2. HttpServletResponse
  3. HttpSession
  4. Model
  5. Map
  6. ModelMap
<a href="${pageContext.request.contextPath}/data.action?name=zzz">访问服务器,进行数据携带跳转</a>
@Controller
public class DataAction {@RequestMapping("/data.action")public String data(HttpServletRequest request,HttpServletResponse response,HttpSession session,Model model,Map map,ModelMap modelMap){// 做一个数据,传到main.jsp页面User user = new User("张三", 22);// 传递数据request.setAttribute("requestUser", user);session.setAttribute("sessionUser", user);model.addAttribute("modelUser", user);map.put("mapUser", user);modelMap.addAttribute("modelMapUser", user);return "main";// 请求转发方式跳转}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>main</title>
</head>
<body>
<h2>main 显示数据</h2>
requestUser:${requestUser}<br>
sessionUser:${sessionUser}<br>
modelUser:${modelUser}<br>
mapUser:${mapUser}<br>
modelMapUser:${modelMapUser}<br>
从index.jsp页面传过来的数据${param.name}
</body>
</html>

注意:Map,Model,ModelMap和request一样,都使用请求作用域进行数据传递.所以服务器端的跳转必须是请求转发.

6.日期处理

  1. 日期的提交处理

    • 单个日期处理
      使用注解@DateTimeFormat,此注解必须搭配springmvc.xml文件中的<mvc:annotationdriven标签>
      <form action="${pageContext.request.contextPath}/mydate.action">日期:<input type="date" name="mydate"><br><input type="submit" value="提交">
      </form>
      
      @RequestMapping("/mydate.action")
      public String mydate(@DateTimeFormat(pattern = "yyyy-MM-dd") Date mydate){System.out.println(mydate);return "main";
      }
      
    • 类中全局日期处理
      注册一个注解,用来解析本类中所有的日期类型,自动转换
      @InitBinder
      public void initBinder(WebDataBinder dataBinder){dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
      }
      @RequestMapping("/mydate.action")
      public String mydate(Date mydate){System.out.println(mydate);return "main";
      }
      
  2. 日期的显示处理
    在页面上显示好看的日期,必须使用JSTL.
    步骤:

    1. 添加依赖jstl
      tomcat10

      <!--jstl依赖--><dependency><groupId>org.glassfish.web</groupId><artifactId>jakarta.servlet.jsp.jstl</artifactId><version>2.0.0</version></dependency>
      
    2. 在页面上导入标签库
      如果是单个日期对象,直接转为格式化的字符串进行显示.
      如果是list中的实体类对象的成员变量是日期类型,则必须使用jstl进行显示.

      <%--导入jstl核心标签库--%>
      <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <%--导入jstl格式化标签库--%>
      <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
      
    3. 使用标签显示数据

      <h2>学生集合</h2>
      <table width="800px" border="1"><tr><th>姓名</th><th>生日</th></tr><c:forEach items="${list}" var="stu"><tr><td>${stu.name}</td><td>${stu.birthday}-----<fmt:formatDate value="${stu.birthday}" pattern="yyyy-MM-dd"></fmt:formatDate></td></tr></c:forEach>
      </table>
      

7.<mvc:annotation-driven/>标签的使用

<mvc:annotation-driven/>会自动注册两个bean,分别为DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。是springmvc为@controller分发请求所必须的。除了注册了这两个bean,还提供了很多支持。

  1. 支持使用ConversionService 实例对表单参数进行类型转换;
  2. 支持使用 @NumberFormat 、@DateTimeFormat;
  3. 注解完成数据类型的格式化;
  4. 支持使用 @RequestBody 和 @ResponseBody 注解;
  5. 静态资源的分流也使用这个标签;

8.资源在WEB-INF目录下

此目录下的动态资源,不可直接访问,只能通过请求转发的方式进行访问

package com.powernode.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class WebInfAction {@RequestMapping("showIndex.action")public String showIndex(){System.out.println("访问index.jsp");return "index";}@RequestMapping("showMain.action")public String showMain(){System.out.println("访问main.jsp");return "main";}
}

相关文章:

二、SpringMVC注解式开发

1. RequestMapping注解 此注解就是来映射服务器访问的路径 可加在方法上,是为此方法注册一个可以访问的名称(路径) 可以加在类上,相当于是包名(虚拟路径),区分不同类中相同的action的名称 可区分get请求和post请求 package com.powernode.controller;import org.springframe…...

Java容器面试知识点总结

容器 java容器有哪些&#xff1f; String&#xff0c;数组以及Java.util 下面的集合类 List&#xff1a;存放有序&#xff0c;列表存储&#xff0c;元素可重复 ArrayList LinkedList Vector Set:无序&#xff0c;元素不可重复 HashSet TreeSet Map: 无序&#xff0c;元素可重复…...

增长:2023 IT运维发展趋势前瞻

根据IDC和智研咨询数据等平台公开数据显示&#xff0c;从2018年至2022年&#xff0c;全球ITOM行业市场规模以8.58%的年均复合增长率高速增长。其中&#xff0c;中国ITOM市场在2020-2023年的年复合增长率为10.7%&#xff0c;到2023年市场规模将达到165.7亿元。012022中国IT运维解…...

自己定义typescript的类型声明文件xx.d.ts

****内容预警***菜鸟新手内容&#xff0c;大佬请绕道&#xff0c;不对的请指出我们在使用typescript的使用&#xff0c;如果安装一个包没有相应的类型声明文件&#xff0c;ts的类型检查就会报错&#xff0c;所以我们经常会安装npm包对应的types类型声明包&#xff0c;比如uuid …...

数据分析方法及名词解释总结_(面试2)

1、用户画像 1.1、什么是用户画像&#xff1f;如何构建用户画像&#xff1f; - 知乎提到用户画像&#xff0c; 很多人都可能存在的错误认知&#xff0c;即把用户画像简单理解成用户各种特征&#xff0c;比如说姓名、性别、…https://www.zhihu.com/question/372802348/answer/2…...

【FLY】Java知识点总结

目录认识Java概念图名词解释历史版本基础知识编程规范关键字数据类型运算符数组Stringequals与流程控制引用数据结构常用数据结构HashMapLinkedHashMapWeakHashMapIdentityHashMapEnumMapTreeMapCopyOnWriteArrayList面向对象类反射注解IO异常线程EffectiveJava8JVM运行时数据区…...

SpringMVC-0307

三、RequestMapping注解1、RequestMapping注解的功能从注解名称上我们可以看到&#xff0c;RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来&#xff0c;建立映射关系。SpringMVC 接收到指定的请求&#xff0c;就会来找到在映射关系中对应的控制器方法来处理…...

华为OD机试 - 九宫格按键输入(C 语言解题)【独家】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:九宫格按…...

Oracle 11g RAC群集部署

Oracle 11g RAC群集部署 1.环境介绍&#xff1a; 操作系统&#xff1a;Oracle Enterprise Linux 6.5 Oracle数据库&#xff1a;Oracle 11.2.0.4 集群软件&#xff1a;Oracle Grid Infrastructure 11.2.0.4 2.所需介质&#xff1a; p13390677_112040_Linux-x86-64_1of7 p133…...

【C++、C++11】列表初始化、右值引用

文章目录&#x1f4d6; 前言1. 统一的列表初始化1.1 { } 花括号初始化&#xff1a;1.2 std::initializer_list&#xff1a;2. 右值引用2.1 什么是左值和右值&#xff1a;2.2 右值的分类&#xff1a;2.3 左值引用和右值引用的比较2.3 右值的使用场景&#xff1a;2.4 新的类功能&…...

CMU15-445 Project.3总结

在线测试 Project #3 - Query Execution 以下是Project #3的网址&#xff0c;2022FALL的Project #3是实现一个查询执行&#xff0c;实现一系列算子&#xff0c;用于实现数据库内的SQL计算。项目中的 Query Execution 主要分为三个任务&#xff1a; Access Method Executors…...

002+limou+HTML——(2)HTML文档

000、前言 一般来说一个静态网页拥有四种元素&#xff1a;文字、图片、超链接、音频和视频&#xff08;注意&#xff0c;即使在web网页中植入Javascript语言&#xff0c;也不一定是动态网页&#xff0c;真正的动态网页判断标准&#xff1a;是否和服务器产生交互&#xff09; …...

红外传感器模块与 Arduino 连接

红外传感器模块与 Arduino 连接 原文地址 Arduino 红外传感器接口 红外**接近传感器或红外传感器它发射红外光以感知周围环境&#xff0c;并可用于检测物体的运动。由于这是一个无源传感器&#xff0c;它只能测量红外辐射。如果您曾经尝试过设计避障机器人或任何其他基于接近…...

NC xml配置文件不能生产java文件

在NC开发过程中&#xff0c;新增、或修改了xml文件&#xff0c;在开发工具eclipse中生成或重新生成Java文件&#xff0c;发现生成不了相对应的Java文件。如下图&#xff0c;选中xml文件后&#xff0c;右键点击SpringXml to Java 这种情况其实一般都是xml配置文件有问题&#…...

华为OD机试 - 五键键盘(C 语言解题)【独家】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:五键键盘…...

Kubernetes Service简介

Service 之前我们了解了Pod的基本用法&#xff0c;我们也了解到Pod的生命是有限的&#xff0c;死亡过后不会复活了。我们后面学习到的RC和Deployment可以用来动态的创建和销毁Pod。尽管每个Pod都有自己的IP地址&#xff0c;但是如果Pod重新启动了的话那么他的IP很有可能也就变…...

【c++类与对象 】

目录&#xff1a;前言一、基础引入1.类的定义2.类的权限3.类的封装4.类的实例化5.计算类对象的大小结构体内存对齐规则空类的大小二、this指针this引入this指针的特性经典例题三、类的六个默认成员函数1、构造 && 析构构造函数析构函数2、拷贝 && 赋值拷贝构造…...

【C++】内联函数auto范围for循环nullptr

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、内联函数1.1 内联函数概念1.2…...

运维效率狂飙,都在告警管理上

随着数字化进程的加速&#xff0c;企业IT设备和系统越来越多&#xff0c;告警和流程中断风险也随之增加。每套系统和工具发出的警报&#xff0c;听起来像是一场喧嚣的聚会&#xff0c;各自谈论不同的话题。更糟糕的是&#xff0c;安全和运维团队正在逐渐丧失对告警的敏感度&…...

【每日随笔】中国当前社会阶层 ( 技术无关 | 随便写写 )

文章目录一、阶层划分根据收入划分的阶层根据分工逻辑划分根据权利划分二、根据社会地位和掌握的资源划分的阶层三、赚钱的方式四、如何进入高阶层看了一个有意思的视频 , 讲的是中国当前的社会阶层 , 感觉好有道理 , 搜索了一些资料 ; 参考资料 : 关于中国的社会阶层社会在分…...

【13种css选择器】学css选择器,这一篇就够了

举例形象让你学会&#xff0c;不搞官方话css所有的选择器相邻兄弟选择器后续兄弟选择器后代选择器子代选择器并集选择器(多重选择器)属性选择器伪类选择器伪元素选择器class选择器&#xff08;类选择器&#xff09;id选择器*选择器&#xff08;通配符选择器&#xff09;标签选择…...

1-1 微服务架构概述

文章目录微服务架构概述1-1. 系统进化理论概述集中式系统&#xff1a;分布式系统1-2. 系统进化理论背景1-3. 什么是微服务架构1-4. 微服务架构的优缺点1-5. 为什么选择 Spring Cloud 构建微服务认识 Spring Cloud2-1. Spring Cloud 是什么2-2. Spring Cloud 的版本2-3 Spring C…...

uniapp传参

//子传父子页面&#xff1a;sumbit() {console.log(this.formData, 传过去的内容对象)let pages getCurrentPages();let prevPage pages[pages.length - 2]; //上一个页面prevPage.$vm.getParams(this.formData); //重点$vmuni.navigateBack();},父页面接收&#xff1a;metho…...

面试官:说说你对 TypeScript 中函数的理解?与 JavaScript 函数的区别?

一、是什么 函数是 JavaScript 应用程序的基础&#xff0c;帮助我们实现抽象层、模拟类、信息隐藏和模块 在 TypeScript 里&#xff0c;虽然已经支持类、命名空间和模块&#xff0c;但函数仍然是主要定义行为的方式&#xff0c;TypeScript 为 JavaScript 函数添加了额外的功能…...

【测试】HD-G2L-IO评估板测试结果表

1. 测试对象HD-G2L-IOT基于HD-G2L-CORE V2.0工业级核心板设计&#xff0c;双路千兆网口、双路CAN-bus、2路RS-232、2路RS-485、DSI、LCD、4G/5G、WiFi、CSI摄像头接口等&#xff0c;接口丰富&#xff0c;适用于工业现场应用需求&#xff0c;亦方便用户评估核心板及CPU的性能。H…...

[2.2.1]进程管理——调度的概念、层次

文章目录第二章 进程管理调度的概念、层次&#xff08;一&#xff09;调度的基本概念&#xff08;二&#xff09;调度的三个层次&#xff08;1&#xff09;高级调度&#xff08;2&#xff09;低级调度&#xff08;3&#xff09;中级调度补充知识&#xff1a;进程的挂起态与七状…...

【JavaScript UI库和框架】上海道宁与Webix为您提供用于跨平台Web应用程序开发的JS框架及UI小部件

Webix是Javascript库 一种软件产品 用于加速Web开发的 JavaScript UI库和框架 Webix用于跨平台Web应用程序开发的JS框架&#xff0c;为您提供102个UI小部件和功能丰富的CSS/HTML5 JavaScript控件 开发商介绍 Webix团队由由热衷于创建高质量网络产品的专业人士组成&#xff…...

【微信小程序】-- WXS 脚本(二十九)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

案例19-遇见问题的临时解决方案和最终解决方案

目录1、背景介绍2、两种解决方案的概念1、临时解决方案&#xff1a;2、最终解决方案&#xff1a;3、排查问题过程4、总结站在用户的角度思考作为软件开发者5、升华1、背景介绍 首先说明这是系统很早之前的时候的一个功能&#xff0c;当时和学习通还有很强的耦合关系。在学习通…...

自指(Self-reference)

文章目录1. 在逻辑、数学和计算方面2. 在生物学中3. 在艺术4. 在语言中5. 在流行文化中6. 在法律中自我参照&#xff08;Self-reference&#xff09;是一个涉及指代自己或自己的属性、特征或行为的概念。它可以发生在语言、逻辑、数学、哲学和其他领域。 在自然语言或形式语言…...