springMVC讲解(上)

news2024/11/25 12:32:43

SpringMvc

1,简介

springmvc是spring的一个后续产品,是spring的一个子项目,是spring为表示层所开发的一整套完备的解决方案,在表示层框架经历了struct、webWork、struct2等诸多产品的历代更迭之后,目前业界普遍选择了springmvc作为Java视图层开发的首先选择。springmvc是基于servlet的。

三层分别为,视图层(表示层)、业务逻辑层、数据访问层。
1,2 springmvc的特点
  • spring的家族产品,与ioc容器等基础设施无缝对接
  • 基于原生的servlet,通过了功能强大的前端控制器dispatcherServlet,对于请求和响应应进行统一处理。
  • 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案。
  • 代码清晰简洁,大幅度提升开发效率
  • 内部组件化程度高,可拔插式组件即插即用,想要什么功能配置相应的组件即可。
  • 性能卓越,尤其适合现代大型,超大型互联网项目要求。
1,3 初始案例

创建maven项目后,配置web.xml。注册springmvc的前端控制器DispatcherServlet

  • 默认配置方式

    此配置作用下springmvc的配置文件默认位于WEB-INF下,默认名称为-servlet.xml,例如,以下配置所对应的springmvc的配置文件位于WEB-INF下,文件名为springmvc-servlet.xml.

    <!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <!--
            设置springMVC的核心控制器所能处理的请求的请求路径
            /所匹配的请求可以是/login或.html或.js或.css方式的请求路径
            但是/不能匹配.jsp请求路径的请求
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
  • 建立controller层

@Controller
public class HelloController {

    //  通过@RequestMapping注解,可以通过请求路径匹配要处理的具体的请求
    //  /表示的当前工程的上下文路径
    @RequestMapping("/index")
    public String index(){
        return "index";
    }

    @RequestMapping("/target")
    public String toTarget(){
        return "target";
    }
    @RequestMapping("/test01")
    public String test(){
        return "test01";
    }
}
  • 建立页面
    在这里插入图片描述
  • 创建tomcat发布项目运行项目。
    http://localhost:8008/springMVC/index
    在这里插入图片描述

在这里插入图片描述

2,常用注解讲解

2.1,@RequestMapping注解

首先我们要知道这个注解的作用是将请求和处理请求的控制器方法关联起来,建立映射关系。
SpringMVC接收到指定的请求,就会来找到映射关系中对应的控制器方法来处理这个请求。

2.2,@RequestMapping注解的位置

@RequestMapping标识一个类,设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法,设置映射请求路径的具体信息。

    @RequestMapping("/index")
    public String index(){
        return "index";
    }

@RequestMapping注解的Value属性,@RequestMapping注解的value属性通过请求的请求地址匹配请求映射,value属性是一个字符串类型的数组,是可以存放多个字符串类型的,表示该请求映射能够匹配多个请求路径所对应的请求,就是说可以通过多个路径映射到一个地方,value属性是必须要进行设计的,至少通过请求地址匹配请求映射。(这里通过target和target1都可以访问到目标页面)

    @RequestMapping("/target,“target1")
    public String toTarget(){
        return "target";
    }

2.3,@RequestMapping注解的method属性

是指明请求方式(get或post方式)匹配请求映射,也是一个RequestMapping类型的数组,表示该请求映射能够匹配多种请求方式的请求。若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,这浏览器保存405错误

    @RequestMapping(value = "/index" ,method = RequestMethod.GET)
    public String index(){
        return "index";
    }

对于处理指定的请求方式,springmvc中也提供了@RequestMapping注解的派生注解,来进行处理特定的请求方式。

  • 处理get请求有Getmapping方式
  • 处理put请求有Putmapping方式
  • 处理post请求有Postmapping方式
  • 处理delete请求有Deletemapping方式
    但是目前浏览器只支持get和post方式,如果在form表单中提交时,为method设置了其他的请求方式的字符串,则按照默认的请求方式get处理。若要发送put和delete请求,则需要通过spring提供的过滤器hiddenHttpMethodFilter

2.4,@RequestMapping注解的params属性

@RequestMapping注解的params属性通过请求的请求参数匹配请求映射,其中param属性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系。
“param”要求请求映射所匹配的请求必须携带param请求参数
“!param”要求请求映射所匹配的请求不能携带param请求参数
“param=value”要求请求参数所携带的请求必须满足参数值等于value值
“param!=value”要求请求所携带的参数不能等于value值

    @RequestMapping(value = "/index" ,method = RequestMethod.GET
    ,params = {"name","password!=123456"})
    public String index(){
        return "index";
    }

这里要求请求参数必须携带两个参数,且第二个参数中password不能等于123456

2.5,@RequestMapping注解的headers属性

@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射,是一个字符串类型的数组,可以通过四种表达式来设置请求头信息和请求映射的匹配关系。
和param上面的四种表达式一样。
若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404错误,即资源未找到。

3,springmvc中的ant风格的路径

?表示匹配单个字符
*表示匹配任意的0个或一个字符
**表示任意的一次或多层目录

4,springmvc中支持路径中的占位符

原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
springmvc路径中的占位符常用与RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}来表示传输的数据,在通过@pathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。

    @RequestMapping(value = "/index" ,method = RequestMethod.GET
    ,params = {"name","password!=123456"})
    public String index(@PathVariable("id")String id,@PathVariable("name")String name){
        return "index";
    }

5,springmvc获取请求参数

  • 将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。
    @RequestMapping("/testParam")
    public String testParam(HttpServletRequest request){
        String username=request.getParameter("username");
        String password=request.getParameter("password");
    }

若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器发放的形参中设置字符串数组或者字符串类型的形参来接收此请求参数。若使用字符串数组类型的形参,此参数的数组中包含了每一个数据。若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果。

  • @RequestParam注解
    @RequestParam注解是将请求参数和控制器方法的形参创建映射关系,一共有三个属性:
    • value:指定为形参赋值的请求参数的参数名,
    • required:设置是否必须传输次请求参数,默认为true,若设置为true时,则当前请求必须传输value所指定请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400.所设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null。
    • defaultValue:不管required属性值为true还是false,当value所指定的请求参数没有传输或传输的值为“”时,则使用默认值为形参赋值。
  • @RequestHeader注解是将请求头信息和控制器方法的形参创建映射关系,一共有三个属性:value、required、defaultParam
  • @CookieValue注解
  • 通过POJO获取请求参数
可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性一致,那么请求参数就会为此属性赋值。
<form th:action="@{/testpojo}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br>
    年龄:<input type="text" name="age"><br>
    邮箱:<input type="text" name="email"><br>
    <input type="submit">
</form>
@RequestMapping("/testpojo")
public String testPOJO(User user){
    System.out.println(user);
    return "success";
}
//最终结果-->User{id=null, username='张三', password='123', age=23, sex='男', email='123@qq.com'}

6,域对象共享数据

6.1,通过servletAPI向request域对象中添加数据来共享数据域

  • 首先创建域对象
    @RequestMapping("/servletApi")
    public String test(HttpServletRequest request){
        request.setAttribute("testRequestScope","helloffy");
        return "success";
    }
  • 然后在页面获取数据
<p th:text="${testRequestScope}"></p>

6.2,使用modelandview向request域对象共享数据

首先我们要知道modelandview是包含两个部分分别是model实体和view页面两个部分,是既包含数据又包含页面的对象。就是模型和视图。
为modelandview中设置参数和获取参数方法。

    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("testRequestScope","hello");
//        处理模型数据,即向请求域request共享数据
        modelAndView.setViewName("success");
        return modelAndView;
    }
视图层
<p th:text="${testRequestScope}"></p>

成功获取参数信息
在这里插入图片描述
这里也可以使用另外一种方法为页面赋值

    public String testModelAndView1(Model model){
        model.addAttribute("testRequestScope","hello");
        return "success";
    }
    

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

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

相关文章

JAVA就业课程,面试题大全

面试整体流程1.1 简单的自我介绍我是xxxx,工作xxx年.我先后在xxxx公司、yyyy公司工作。先后做个xxxx项目、yyyy项目。1.2 你简单介绍一下xxxx项目为了解决xxxx问题&#xff0c;开发了一套xxxx系统&#xff0c;该系统主要有那些部分组成。简单介绍项目的整体架构。参与某个模块的…

【Python学习】输入和输出

前言 往期文章 【Python学习】列表和元组 【Python学习】字典和集合 【Python学习】条件和循环 在很多时候&#xff0c;你会想要让你的程序与用户&#xff08;可能是你自己&#xff09;交互。你会从用户那里得到输入&#xff0c;然后打印一些结果。我们可以使用iinput和pr…

MATLAB趣味绘图-内接正六边形旋转

MATLAB趣味绘图-内接正六边形旋转 观察一下内部的正六边形大概在外部的正六边形边的四等分点的位置&#xff0c;通过数学平面几何知识可得边和角度的迭代关系式为&#xff1a; an134an−1θnθn−1arctan⁡36a_n \frac{\sqrt{13}}{4} a_{n-1} \\ \theta_n \theta_{n-1}\arcta…

金融行业数据库场景下,SmartX 超融合表现如何|性能验证与落地实践

在金融行业&#xff0c;数据库是一项至关重要的 IT 基础设施。作为交易和数据的主要载体&#xff0c;数据库往往需要在短时间内处理大量的业务数据&#xff0c;其可靠性、稳定性和性能将直接影响业务系统的运行状态。而在进行数据库基础架构选型时&#xff0c;一些客户对于超融…

C++学习笔记——类和对象

1.面向对象的三大特性&#xff1a;封装、继承、多态 2.对象有其属性和行为 3.具有相同性质的对象&#xff0c;可被抽象为类 1.封装 1.封装是C面向对象三大特性之一 2.封装的意义&#xff1a; &#xff08;1&#xff09;将属性&#xff08;变量&#xff09;和行为&#xff…

python学习 --- 字典基础

目录 一、什么是字典&#xff1f; 1、字典示意图-无序说明 2、字典实现原理 二、字典的创建 1、使用花括号 2、使用内置函数dict() 三、字典常用操作 1、字典中元素的获取 2、key的判断&#xff08;存在与否&#xff09; 3、字典元素的删除 4、字典元素的新增 5、获…

计讯物联智慧水务解决方案:用“智水”捍卫生命之泉

项目背景 水是生命的源泉&#xff0c;是城市的灵魂&#xff0c;是农业的命脉&#xff0c;是工业的基石。2022年以来&#xff0c;基于国家政策的引导、科技革新的驱动与供排水需求增长&#xff0c;智慧水务的发展突飞猛进&#xff0c;从信息化到数字化&#xff0c;再到智能化&a…

若依 ruoyi vue el-switch 列表开关状态显示有误 全部关闭的问题

后台使用int类型传状态status的值但是前端列表展示的开关状态是未开启&#xff0c;实际上&#xff0c;后台传的都是开启的状态结果应该是这样确定后台传的status值 在 el-switch 标签中是否使用了正确的值判断&#xff0c;比如 后台用的是字符串、布尔 或者是 数值类型&#xf…

android判断文件是否存在跳转不同activity

android studio版本&#xff1a;2021.2.1Patch 2例程名称&#xff1a;ActivityJump完成日期&#xff1a;2023.1.17一直在完善一个小东西&#xff0c;也是不断的在学习。之前做的那个桌面日历天气&#xff08;老旧安卓手机发挥余热做桌面时钟摆件使用&#xff09;&#xff0c;有…

java 数列排序

试题 基础练习 数列排序提交此题 评测记录 资源限制内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s问题描述给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200输入格式…

【渗透测试】信息搜集总结

前言零零散散的发布过很多文章了&#xff0c;但是也没有完整的总结一下&#xff0c;今天就从信息搜集入手&#xff0c;系统的总结一下。一方面可以巩固自己的基础&#xff0c;作为自己的字典随用随查&#xff0c;另一方面希望对大家的学习和工作起到帮助作用。按照这个过程基本…

求两点间的距离-C语言实现

任务描述 已知两点A(x1,y1),B(x2,y2),求其间的距离。 输入 一行四个浮点数,x1,y1,x2,y2 输出 两点间的距离,要求不要输出多余的零。 本关知识 两点间的距离公式 pow函数 在C语言中,提供了用于求x的y次幂的函数,函数原型为: double pow(double x, double y…

啊啊啊小红书爆款标题技巧被我找到了!

我通过平日里对小红书的了解和积累&#xff0c;再加上这一阵子对小红书爆款笔记的研究&#xff0c;终于在这么多笔记当中发现了小红书爆款笔记标题的撰写规律&#xff01; 我们在撰写小红书的时候恨不得篇篇都是爆文&#xff0c;那么今天就来讲一下小红书那些爆款笔记标题的撰写…

75、DiffRF: Rendering-Guided 3D Radiance Field Diffusion

简介 主页&#xff1a;https://sirwyver.github.io/DiffRF/ 对应用于三维亮度场的概率扩散过程进行去噪。在3D监控和体积渲染的指导下&#xff0c;模型能够无条件地合成高保真3D资产(左)。 蒙面补全的新应用(右)&#xff0c;即从不完整的对象中恢复形状和外观的任务(在右上方…

超实用的百度百科人物词条创建攻略分享,纯干货

自媒体时代&#xff0c;人们越来越有IP意识&#xff0c;打造个人IP就是在为自己创造更多价值。 个人IP的打造是一个提升知名度的过程&#xff0c;怎么才能快速提升&#xff1f;创建一个百度百科词条不失为一个好的选择。 现在用户有问题就会在百度上搜索一下&#xff0c;当用户…

java实现模拟调用接口

本文总结如何用fiddler和postman调试接口&#xff0c;并用java模拟调用接口。fiddler用法当页面点击事件后&#xff0c;在fiddler出现一个请求&#xff0c;单击左侧请求&#xff0c;在右侧的raw的tab标签&#xff0c;出现该请求的详细内容。其实一个请求需要两类参数&#xff0…

Linux常用命令——umask命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) umask 用来设置限制新建文件权限的掩码 补充说明 umask命令用来设置限制新建文件权限的掩码。当新文件被创建时&#xff0c;其最初的权限由文件创建掩码决定。用户每次注册进入系统时&#xff0c;umask命令都被…

大数据技术架构(组件)——Hive:流程剖析1

1.1、流程剖析大致流程&#xff1a;1、客户端连接到HS2(HiveServer2&#xff0c;目前大多数通过beeline形式连接&#xff0c;Hive Cli模式相对较重&#xff0c;且直接略过授权访问元数据),建立会话2、提交sql&#xff0c;通过Driver进行编译、解析、优化逻辑计划&#xff0c;生…

OCR识别

阿里云和百度云识别&#xff0c;京东智能识别。 图片识别需求 1&#xff0c;拿到一个文件&#xff0c;2&#xff0c;变成InputStream 3&#xff0c;base64编码将流解析下载&#xff0c; 4 调用方法识别 1.身份证 2&#xff0c;行驶证 3&#xff0c;驾驶证 FileUtils file…

Elasticsearch:通过例子快速入门

Elasticsearch 是业界最流行的开源企业搜索引擎&#xff0c;应用广泛。 在我们的手机里的 App 背后的搜索引擎好多都是 Elasticsearch&#xff0c;比如我们熟知的抖音&#xff0c;滴滴&#xff0c;美团&#xff0c;携程&#xff0c;点评&#xff0c;银行 app&#xff0c;保险&a…