三 SpringMVC返回数据以及RESTFul设计标准

news2024/11/20 12:39:31

SpringMVC返回数据

一 控制页面跳转

1.1 快速使用

  1. 开发模式回顾在 Web 开发中,有两种主要的开发模式:前后端分离和混合开发。前后端分离模式:[重点]指将前端的界面和后端的业务逻辑通过接口分离开发的一种方式。开发人员使用不同的技术栈和框架,前端开发人员主要负责页面的呈现和用户交互,后端开发人员主要负责业务逻辑和数据存储。前后端通信通过 API 接口完成,数据格式一般使用 JSON 或 XML。前后端分离模式可以提高开发效率,同时也有助于代码重用和维护。混合开发模式:指将前端和后端的代码集成在同一个项目中,共享相同的技术栈和框架。这种模式在小型项目中比较常见,可以减少学习成本和部署难度。但是,在大型项目中,这种模式会导致代码耦合性很高,维护和升级难度较大。对于混合开发,我们就需要使用动态页面技术,动态展示Java的共享域数据!!
  2. jsp技术了解JSP(JavaServer Pages)是一种动态网页开发技术,它是由 Sun 公司提出的一种基于 Java 技术的 Web 页面制作技术,可以在 HTML 文件中嵌入 Java 代码,使得生成动态内容的编写更加简单。JSP 最主要的作用是生成动态页面。它允许将 Java 代码嵌入到 HTML 页面中,以便使用 Java 进行数据库查询、处理表单数据和生成 HTML 等动态内容。另外,JSP 还可以与 Servlet 结合使用,实现更加复杂的 Web 应用程序开发。JSP 的主要特点包括:
    1. 简单:JSP 通过将 Java 代码嵌入到 HTML 页面中,使得生成动态内容的编写更加简单。
    2. 高效:JSP 首次运行时会被转换为 Servlet,然后编译为字节码,从而可以启用 Just-in-Time(JIT)编译器,实现更高效的运行。
    3. 多样化:JSP 支持多种标准标签库,包括 JSTL(JavaServer Pages 标准标签库)、EL(表达式语言)等,可以帮助开发人员更加方便的处理常见的 Web 开发需求。
  3. 总之,JSP 是一种简单高效、多样化的动态网页开发技术,它可以方便地生成动态页面和与 Servlet 结合使用,是 Java Web 开发中常用的技术之一。
  4. 准备jsp页面和依赖pom.xml依赖
<!-- jsp需要依赖! jstl-->
<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>3.0.0</version>
</dependency>
jsp页面创建

建议位置:/WEB-INF/下,避免外部直接访问!

位置:/WEB-INF/views/home.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Title</title>
  </head>
  <body>
        <!-- 可以获取共享域的数据,动态展示! jsp== 后台vue -->
        ${msg}
  </body>
</html>
  1. 快速响应模版页面
    1. 配置jsp视图解析器
@EnableWebMvc  //json数据处理,必须使用此注解,因为他会加入json处理器
@Configuration
@ComponentScan(basePackages = "com.atguigu.controller") //TODO: 进行controller扫描

//WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
public class SpringMvcConfig implements WebMvcConfigurer {

    //配置jsp对应的视图解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        //快速配置jsp模板语言对应的
        registry.jsp("/WEB-INF/views/",".jsp");
    }
}
2. handler返回视图
/**
 *  跳转到提交文件页面  /save/jump
 *  
 *  如果要返回jsp页面!
 *     1.方法返回值改成字符串类型
 *     2.返回逻辑视图名即可    
 *         <property name="prefix" value="/WEB-INF/views/"/>
 *            + 逻辑视图名 +
 *         <property name="suffix" value=".jsp"/>
 */
@GetMapping("jump")
public String jumpJsp(Model model){
    System.out.println("FileController.jumpJsp");
    model.addAttribute("msg","request data!!");
    return "home";
}

1.2转发和重定向

  • 在 Spring MVC 中,Handler 方法返回值来实现快速转发,可以使用 redirect 或者 forward 关键字来实现重定向。
@Controller
@RequestMapping("/jsp")
public class indexController {

    /**
     *  返回jsp页面
     *   1. 返回字符串类型, 于视图解析器拼接
     *   2. 不能添加@ResponseBody会直接返回给浏览器,
     *
     */

    @RequestMapping("/data")
    public  String data(HttpServletRequest request){
        request.setAttribute("data","hnsqls");
        return "index";
    }

    /**转发
     * 1. 返回字符串  ------》请求资源的地址
     * 2.return “forward:/转发地址”
     *  */

    @RequestMapping("/forward")
    public  String forward(){
        return "forward:/jsp/data";
    }

    /** 重定向
     * 1. 返回字符串 ----------》请求的资源地址
     * 2. 返回字符 return “redirect:/重定向地址”
     *
     */

    @RequestMapping("/redirect")
    public  String redirect(){

        return "redirect: /jsp/data";
    }
    /** 地址路径问题
     * 不使用springmvc   原生的request,response
     * 转发是项目下的资源跳转,路径:项目下的地址,忽略根路径
     * 重定向可以是项目以外的地址,二次请求,路径 要写根地址
     *
     * 使用springmvc
     *  forward:路径 | redirect:路径  都不需要写根路径。
     *  转发和重定向写的地址都一样,springmvc会自动给重定向添加 根地址
     *
     */
}

二 返回JSON数据

  • json依赖
  • handlerAdopter 配置json转换器
  • @Controller + @ResponseBody = @RestController
/**
 * 返回json数据 , ---->前后端分离
 *  1.@ResponseBody  不找视图解析器,直接放入响应体返回
 *  2. 直接返回实体类,由handlerAdopter 处理为json对象(有json依赖,以及配置给了handlerAdopter)
 *  3. @Controller + @ResponseBody  = @RestController
 */
@Controller
@RequestMapping("/json")
public class JsonController  {
    @ResponseBody
    @RequestMapping("/user")
    public User user(){
        User user = new User();
        user.setAge(21);
        user.setName("hnsqls");
        return  user;
    }

    @ResponseBody
    @RequestMapping("/user2")
    public List<User> user2(){
        User user = new User();
        user.setAge(21);
        user.setName("hnsqls");
        List<User> users = new ArrayList<>();
        users.add(user);
        return  users;
    }

}

三 返回静态资源

  1. 静态资源概念

资源本身已经是可以直接拿到浏览器上使用的程度了,不需要在服务器端做任何运算、处理。典型的静态资源包括:

  • 纯HTML文件
  • 图片
  • CSS文件
  • JavaScript文件
  • ……
  1. 静态资源访问和问题解决

  • 访问静态资源

  • 问题分析
    • DispatcherServlet 的 url-pattern 配置的是“/”,表示拦截所有的请求,交给handlerAdopter处理。
    • 对于handlerAdopter来说去寻找对应的 @RequestMapping 才能找到处理请求的方法。
    • 现在 images/mi.jpg 请求没有对应的 @RequestMapping 所以返回 404
  • 原生的javaweb,有默认servlet专于处理静态资源。我们现在使用springmvc怎么处理呢?
  • 问题解决在配置类中开启默认的静态资源处理
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
@EnableWebMvc  //json数据处理,必须使用此注解,因为他会加入json处理器
@Configuration
@ComponentScan(basePackages = "com.atguigu.controller") //TODO: 进行controller扫描
//WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
public class SpringMvcConfig implements WebMvcConfigurer {

    //配置jsp对应的视图解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        //快速配置jsp模板语言对应的
        registry.jsp("/WEB-INF/views/",".jsp");
    }
    
    //开启静态资源处理 <mvc:default-servlet-handler/>
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

小结
当服务端接受到客户端的请求时,会经由handlerAdopter处理,去handlermapping中寻找对应请求的handler。如果找不到,就会由默认的servlet处理,寻找静态资源。

四 RESTFUL风格设计

  • 客户端于服务端以http进行通信,作为软件开发者,我们需要考虑以下几个方面
    • 1.如何设计url
    • 2.如何传参? 路径传参?url传参(param)?还是json传参
    • 3.以何种方式请求 GET|POST|DELETE|PUT …等。
  • RESTFUL就是标准的http编写风格。

4.1 RESTFUL风格特点

  1. 每一个URI代表1种资源(URI 是名词);
  2. 客户端使用GET、POST、PUT、DELETE 4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
  3. 资源的表现形式是XML或者JSON
  4. 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。

4.2 RESTFUL风格设计规范

  1. HTTP协议请求方式要求REST 风格主张在项目设计、开发过程中,具体的操作符合HTTP协议定义的请求方式的语义
操作请求方式
查询操作GET
保存操作POST
删除操作DELETE
更新操作PUT
  1. URL路径风格要求

REST风格下每个资源都应该有一个唯一的标识符,例如一个 URI(统一资源标识符)或者一个 URL(统一资源定位符)。资源的标识符应该能明确地说明该资源的信息,同时也应该是可被理解和解释的!
使用URL+请求方式确定具体的动作,他也是一种标准的HTTP协议请求!

操作传统风格REST 风格
保存/CRUD/saveEmpURL 地址:/CRUD/emp 请求方式:POST
删除/CRUD/removeEmp?empId=2URL 地址:/CRUD/emp/2 请求方式:DELETE
更新/CRUD/updateEmpURL 地址:/CRUD/emp 请求方式:PUT
查询/CRUD/editEmp?empId=2URL 地址:/CRUD/emp/2 请求方式:GET
  1. 传参要求
  2. 路径传参,要能标识唯一资源时使用
  3. 多个参数,可以使用param传参
  4. 请求体:使用json

4.3RESTFUL设计风格的好处

  1. 含蓄,安全使用问号键值对的方式给服务器传递数据太明显,容易被人利用来对系统进行破坏。使用 REST 风格携带数据不再需要明显的暴露数据的名称。
  2. 风格统一URL 地址整体格式统一,从前到后始终都使用斜杠划分各个单词,用简单一致的格式表达语义。
  3. 无状态在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态,极大的降低了系统设计的复杂度。
  4. 严谨,规范严格按照 HTTP1.1 协议中定义的请求方式本身的语义进行操作。
  5. 简洁,优雅过去做增删改查操作需要设计4个不同的URL,现在一个就够了。
操作传统风格REST 风格
保存/CRUD/saveEmpURL 地址:/CRUD/emp 请求方式:POST
删除/CRUD/removeEmp?empId=2URL 地址:/CRUD/emp/2 请求方式:DELETE
更新/CRUD/updateEmpURL 地址:/CRUD/emp 请求方式:PUT
查询/CRUD/editEmp?empId=2URL 地址:/CRUD/emp/2 请求方式:GET
  1. 丰富的语义通过 URL 地址就可以知道资源之间的关系。它能够把一句话中的很多单词用斜杠连起来,反过来说就是可以在 URL 地址中用一句话来充分表达语义。http://localhost:8080/shophttp://localhost:8080/shop/producthttp://localhost:8080/shop/product/cellPhonehttp://localhost:8080/shop/product/cellPhone/iPhone

五 RESTFul设计演示

  1. 需求分析
  • 数据结构: User {id 唯一标识,name 用户名,age 用户年龄}
  • 功能分析
    • 用户数据分页展示功能(条件:page 页数 默认1,size 每页数量 默认 10)
    • 保存用户功能
    • 根据用户id查询用户详情功能
    • 根据用户id更新用户数据功能
    • 根据用户id删除用户数据功能
    • 多条件模糊查询用户功能(条件:keyword 模糊关键字,page 页数 默认1,size 每页数量 默认 10)
  1. RESTFul风格接口设计
功能接口和请求方式请求参数返回值
分页查询GET /userpage=1&size=10{ 响应数据 }
用户添加POST /user{ user 数据 }{响应数据}
用户详情GET /user/1路径参数{响应数据}
用户更新PUT /user{ user 更新数据}{响应数据}
用户删除DELETE /user/1路径参数{响应数据}
条件模糊GET /user/searchpage=1&size=10&keywork=关键字{响应数据}
  1. 问题讨论为什么查询用户详情,就使用路径传递参数,多条件模糊查询,就使用请求参数传递?误区:restful风格下,不是所有请求参数都是路径传递!可以使用其他方式传递!在 RESTful API 的设计中,路径和请求参数和请求体都是用来向服务器传递信息的方式。
    • 对于查询用户详情,使用路径传递参数是因为这是一个单一资源的查询,即查询一条用户记录。使用路径参数可以明确指定所请求的资源,便于服务器定位并返回对应的资源,也符合 RESTful 风格的要求。
    • 而对于多条件模糊查询,使用请求参数传递参数是因为这是一个资源集合的查询,即查询多条用户记录。使用请求参数可以通过组合不同参数来限制查询结果,路径参数的组合和排列可能会很多,不如使用请求参数更加灵活和简洁。
  2. 此外,还有一些通用的原则可以遵循:
    • 路径参数应该用于指定资源的唯一标识或者 ID,而请求参数应该用于指定查询条件或者操作参数。
    • 请求参数应该限制在 10 个以内,过多的请求参数可能导致接口难以维护和使用。
    • 对于敏感信息,最好使用 POST 和请求体来传递参数。
  3. 实现
package com.ls.controller;


import com.ls.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping("/user")
@ResponseBody
public class UserController {
    /**用户数据分页展示功能(条件:page 页数 默认1,size 每页数量 默认 10)
     * 查询 GET
     * 资源不唯一 不用路径传擦, 用param传擦
     *  GET  /user?page=1&size=10
     */

    @GetMapping
    public List<User> findPageUser(@RequestParam(required = false,defaultValue = "1") int page,
                                   @RequestParam(required = false,defaultValue = "10") int size){
        System.out.println("page = " + page + ", size = " + size);
        //逻辑处理
        return null;
    }
    /**保存用户功能
     * POST  param|json(推荐)
     */
    @PostMapping
    public  User saveUser(@RequestBody User user){
        System.out.println("user = " + user);
        //处理逻辑
        return user;
    }

    /** 根据用户id查询用户详情功能
     *  GET /user/id  路径传参
     */

    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public User findUserById(@PathVariable int id){
        System.out.println("查询用户信息 + id = " + id);
        //处理逻辑
        return null;
    }

    /** 根据用户id更新用户数据功能
     * 更新  PUT
     * 单个标识   路径传参
     * PUT /user/id
     *
     */
    @PutMapping("/{id}")
    public User updateUserById(@PathVariable int id,@PathVariable User user){
        System.out.println("更新用户信息"+"id = " + id);
        //处理逻辑
        return null;
    }

    /**根据用户id删除用户数据功能
     * 删除 delete
     * id唯一标识  路径传参
     * DELETE /user/id
     */
    @DeleteMapping("/{id}")
    public int deleteUserById(@PathVariable int id){
        System.out.println("删除:id = " + id);
        //处理逻辑
        return 1;
    }

    /** 多条件模糊查询用户功能(条件:keyword 模糊关键字,page 页数 默认1,size 每页数量 默认 10)
     * 查询 GET
     * 标识不唯一   不适用路径传参,param传参
     * GET /user?keyword=xx&page=x&size=x
     * 需要注意的时,根据整篇标识,此时的Mapping不唯一  方式 + url
     * 需要改变url 如下/user?keyword=20&page=20&size=50
     *
     */
    @GetMapping("search")
    public List<User> findUser(String keyword,
                               @RequestParam(required = false,defaultValue = "1") int page,
                               @RequestParam(required = false,defaultValue = "10") int  size){
        System.out.println("模糊查询 keyword = " + keyword + ", page = " + page + ", size = " + size);
        //逻辑处理
        return null;
    }

}

总结
RESTFul只是一种标准的设置http的规则,不是强制要求,不过作为开发者以RESTFul风格设计url,更为合理,优雅。
先确定请求方式,查询–>GET,删除—>DELETE,这两种几乎都不需要使用请求体传擦,一般就根据查询或删除的资源时候唯一来选择param传参或路径传参。更新—>PUT,增加---->POST。在确定如何传参,如果资源唯一就路径传参,资源不唯一param传参,在需要传入隐私数据或复杂数据使用json传参。GET|DELETE|PUT|POST 请求方式,只是RESTFul风格标准这样编写http。

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

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

相关文章

OAuth2、JWT

文章目录 OAuth2JWT OAuth2 官网&#xff1a; https://oauth.net/2/ 在 RFC 6749 中说明 1、资源所有者 resource owner&#xff0c; 如 github 用户 2、客户端/第三方应用 client&#xff0c; 如 支持github 登录的 csdn 3、资源服务器 resource server&#xff0c; 如 4、授…

高级美肤解决方案,精细的磨皮处理效果

在数字化时代&#xff0c;高清视频和精致图片已成为企业展示形象、推广产品的重要媒介。然而&#xff0c;面对镜头时&#xff0c;肌肤的微小瑕疵往往成为影响整体美观的“绊脚石”。美摄科技针对这一问题&#xff0c;推出了一系列基于人脸识别技术的高级美肤解决方案&#xff0…

基于昇腾AI 使用AscendCL实现垃圾分类和视频物体分类应用

现如今&#xff0c;人工智能迅猛发展&#xff0c;AI赋能产业发展的速度正在加快&#xff0c;“AI”的需求蜂拥而来&#xff0c;但AI应用快速落地的过程中仍存在很大的挑战&#xff1a;向下需要适配的硬件&#xff0c;向上需要完善的技术支持&#xff0c;两者缺一不可。 基于此&…

Python中ArcPy按照分幅条带与成像日期拼接每个8天间隔内的遥感影像

本文介绍基于Python中的ArcPy模块&#xff0c;将大量遥感影像文件按照分幅条带编号与成像时间加以分组&#xff0c;并将同一分幅的遥感影像加以每个8天时间间隔内的镶嵌拼接的方法。 首先&#xff0c;来看一下本文具体的需求。我们现有一个文件夹&#xff0c;其中含有大量的.ti…

网工交换基础——Qinq技术

一、Qinq的概述 QinQ&#xff08;802.1Q-in-802.1Q&#xff09;&#xff0c;也叫做VLAN Stacking或Double VLAN&#xff0c;由IEEE 802.1ad标准定义&#xff0c;是一项扩展VLAN空间的技术&#xff0c;通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的目…

面试:JVM垃圾回收

一、三种垃圾回收算法 1、标记清除&#xff08;已废弃&#xff09; 找到根对象&#xff08;局部变量正在引用的对象、静态变量正在引用的对象&#xff09;&#xff1b;沿着根对象的引用链&#xff0c;查看当前的对象是否被根对象所引用&#xff0c;若被引用&#xff0c;则加上…

Oracle数据库的AI能力分析,释放企业数据价值

解锁Oracle数据库的AI潜力 Oracle数据库提供了一系列的AI能力&#xff0c;旨在帮助企业和开发者更高效地利用人工智能技术。以下是Oracle数据库AI能力的一些关键点&#xff1a;1. AI向量相似性搜索&#xff1a;Oracle Database 23c引入了AI Vector Search功能&#xff0c;该功…

2024/4/25 C++day3

#include <iostream> using namespace std; class Person //Person类 {string name; //两个私有属性变量name&#xff0c;ageint age;public: //一个公有属性指针变量&#xff0c;一个无参构造函数&#xff0c;一个有参构造函数&#xff0c;一个sho…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

msf抓取hashdump的思考

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 2. 我们通过hashdump 抓取出 所有用户的密文&#xff0c;分为两个模块&#xff0c;为什么&#xff1f; 这两个模块分别都代表…

架构师系列-消息中间件(九)- RocketMQ 进阶(三)-消费端消息保障

5.2 消费端保障 5.2.1 注意幂等性 应用程序在使用RocketMQ进行消息消费时必须支持幂等消费&#xff0c;即同一个消息被消费多次和消费一次的结果一样&#xff0c;这一点在使用RoketMQ或者分析RocketMQ源代码之前再怎么强调也不为过。 “至少一次送达”的消息交付策略&#xff…

不墨迹,向媒体投稿不讲攻略,直接上方法

作为一名单位信息宣传员,我曾深陷于向媒体投稿的泥沼之中,饱尝了费时费力、审核严苛、出稿缓慢的苦涩,承受着领导急切期盼与自我压力交织的煎熬。然而,当我有幸接触到智慧软文发布系统,这一切困境如同阴霾散去,取而代之的是便捷流畅的投稿流程,以及领导满意、团队轻松的工作氛围…

详解Qt中的鼠标事件

在Qt中&#xff0c;处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数&#xff0c;允许开发者捕获鼠标的各种动作&#xff0c;如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项&#xff0c;并附带C代码示例。 基础使用方法…

Node.js 22 发布,原生支持 WebSocket 客户端

昨日&#xff0c;Node.js 官方博客正式宣布 Node.js 22 的发布&#xff01;新版本亮点包括 require() ES 模块、WebSocket 客户端、V8 JavaScript 引擎的更新等&#xff01; Node.js 22 将在 10 月进入长期支持 (LTS)&#xff0c;但在此之前&#xff0c;它将是接下来六个月的 …

问题-MySQL将较大的SQL文件导入MySQL

迁移数据的时候&#xff0c;我们有时候会用sqlyog等数据库工具导入到新数据库。可能插入的SQL语句太大&#xff0c;出现导入一半失败的情况。明明代码没错&#xff0c;这让人摸不着头脑。 对于大文件导入&#xff0c;有几种方法&#xff1a; 方法1&#xff1a;使用命令行&…

总体设计(下)

启发规则 描绘软件结构的图形工具 面向数据流的设计方法

暴雨亮相CCBN2024 助力广电行业数智化转型

4月23日&#xff0c;第三十届中国国际广播电视信息网络展览会&#xff08;简称CCBN2024&#xff09;在北京开展&#xff0c;本次展览会由国家广播电视总局指导、广播电视科学研究院主办&#xff0c;作为国内广电视听领域首个综合性、专业化、引领性、国际化科技产业盛会&#x…

搭建强化学习的机械臂MuJoCo环境以及urdf转xml文件方法

一、背景 基于强化学习的机械臂应用日趋广泛&#xff0c;摆脱了基于模型到达固定点的束缚。基于强化学习算法&#xff0c;机械臂可以完成拧魔方、推抓任务&#xff08;Andy Zeng的经典论文&#xff09;&#xff0c;暂且想一下如果用传统方法完成此类复杂任务是何等困难。 强化…

Chisel 入门(2)运算符

Chisel 入门(2) 运算符 逻辑运算符 ChiselExplanationwidth!x逻辑非1x && y逻辑与1x||y逻辑或1 位操作运算符 ChiselExplanationwidthin Verilog~x位反w(x)~ signal_xx & y位与max(w(x), w(y))signal_x & signal_yx | y位或max(w(x), w(y))signal_x | sign…

操作系统:进程间通信 | System V IPC

目录 前言&#xff1a; 1.共享内存 1.1.什么是共享内存 1.2.共享内存使用接口 shmget函数 shmat函数 shmdt函数 shmctl函数 2.共享内存实现通信 2.1.代码实现 comm.hpp server,cpp client.cpp 2.2.共享内存的缺点 2.3.实现通信的同步化 2.4共享内存通信的优势 3.…