Spring Boot 的Web开发

news2024/11/24 6:27:21

Spring Boot 的Web开发

 

 

 

一、 静态资源映射规则

 总结:

只要静态资源放在类路径下: called /static (or /public or /resources or /METAINF/resources

访问 : 当前项目根路径/ + 静态资源名

二、 enjoy模板引擎

        Enjoy模板引擎是一个轻量级的 Java 模板引擎,主要用于生成动态 HTML 内容。它的设计目标是简化 Java Web 应用中的页面渲染过程,同时保持高效和灵活。Enjoy模板引擎使用一种简单的语法,适用于 Java 开发者,用于创建和渲染模板。

(1)将页面保存在templates目录下

<!DOCTYPE html>
<html lang="cn" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>

    <h1>springMVC控制器方法参数作用:接受用户请求中的数据</h1>
    <hr/>

    <h3>基本类型和 String 类型作为参数</h3>
    <a href="/one/show1?msg1=9527">发送请求1</a>
    <a href="/one/show2?msg1=jdk&msg2=9527">发送请求2</a>

    <h3>POJO 类型作为参数</h3>
    <a href="/one/show3?eid=7&ename=钟无艳&esex=女">发送请求3</a>

    <form action="/one/show4" method="post">
        员工编号:<input type="text" name="eid" ><br/>
        员工姓名:<input type="text" name="ename" ><br/>
        员工性别:<input type="text" name="esex" ><br/>
        部门编号:<input type="text" name="dept.did" ><br/>
        部门名称:<input type="text" name="dept.dname" ><br/>
        <input type="submit" value="发送请求4"/>
    </form>

    <form action="/one/map" method="post">
        员工编号:<input type="text" name="eids"><br/>
        员工姓名:<input type="text" name="enames"><br/>
        员工性别:<input type="text" name="esexs"><br/>
        <input type="submit" value="发送请求4(map)"/>
    </form>


    <h3>POJO 类中包含集合类型参数</h3>
    <form action="/one/show5" method="post">
        部门编号:<input type="text" name="did" ><br/>
        部门名称:<input type="text" name="dname" ><br/>
        员工编号1:<input type="text" name="mylist[0].eid" ><br/>
        员工姓名1:<input type="text" name="mylist[0].ename" ><br/>
        员工性别1:<input type="text" name="mylist[0].esex" ><br/>
        员工编号2:<input type="text" name="mylist[1].eid" ><br/>
        员工姓名2:<input type="text" name="mylist[1].ename" ><br/>
        员工性别2:<input type="text" name="mylist[1].esex" ><br/>

        员工编号3:<input type="text" name="myMap['one'].eid" ><br/>
        员工姓名3:<input type="text" name="myMap['one'].ename" ><br/>
        员工性别3:<input type="text" name="myMap['one'].esex" ><br/>
        员工编号4:<input type="text" name="myMap['two'].eid" ><br/>
        员工姓名4:<input type="text" name="myMap['two'].ename" ><br/>
        员工性别4:<input type="text" name="myMap['two'].esex" ><br/>
        <input type="submit" value="发送请求5"/>
    </form>

    <a href="/one/show6?nums=123&nums=456&nums=789">发送请求6</a>

    <h3>使用 ServletAPI 对象作为方法参数</h3>
    <a href="/one/show7">发送请求7</a>

</body>
</html>
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>spring成功页面</h1>
</body>
</html>

(2)添加坐标

  <dependency>
            <groupId>com.jfinal</groupId>
            <artifactId>enjoy</artifactId>
            <version>5.0.3</version>
        </dependency>

(3)开启配置

在代码中配置 Enjoy 模板引擎,例如设置模板目录和引擎名称。一般来说,可以在应用程序的启动类中进行配置:

package com.apesource.springboot_web_02.config;

import com.jfinal.template.Engine;
import com.jfinal.template.ext.spring.JFinalViewResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @version 1.0
 * @Author 王老师
 * @since 2023/4/11
 */
@Configuration
public class SpringBootConfig {

    @Bean(name = "jfinalViewResolver")
    public JFinalViewResolver getJFinalViewResolver() {

        // 创建用于整合 spring boot 的 ViewResolver 扩展对象
        JFinalViewResolver jfr = new JFinalViewResolver();

        // 对 spring boot 进行配置
        jfr.setSuffix(".html");
        jfr.setContentType("text/html;charset=UTF-8");
        jfr.setOrder(0);

        // 设置在模板中可通过 #(session.value) 访问 session 中的数据
        jfr.setSessionInView(true);

        // 获取 engine 对象,对 enjoy 模板引擎进行配置,配置方式与前面章节完全一样
        Engine engine  = JFinalViewResolver.engine;

        // 热加载配置能对后续配置产生影响,需要放在最前面
        engine.setDevMode(true);

        // 使用 ClassPathSourceFactory 从 class path 与 jar 包中加载模板文件
        engine.setToClassPathSourceFactory();

        // 在使用 ClassPathSourceFactory 时要使用 setBaseTemplatePath
        // 代替 jfr.setPrefix("/view/")
        engine.setBaseTemplatePath("/templates/");


        // 更多配置与前面章节完全一样
        // engine.addDirective(...)
        // engine.addSharedMethod(...);

        return jfr;
    }
}

(4)编写代码

三、 springMVC

(1)请求处理

在 Spring MVC 中,请求处理一般由控制器(Controller)来完成。你可以通过 @RequestMapping 注解定义请求的 URL 映射。

@Controller
@RequestMapping("/one")
public class OneController {

    /**
     * 进入one.html页面
     * */
    @RequestMapping("/show")
    public String show(){
        return "one";
    }
}

(2)参数绑定

Spring MVC 允许你将请求参数绑定到方法的参数中,例如 Java 对象、基本数据类型或集合。

@Controller
@RequestMapping("/one")
public class OneController {

    /**
     * 进入one.html页面
     * */
    @RequestMapping("/show")
    public String show(){
        return "one";
    }

    /***********************基本类型和 String 类型作为参数*********************************/
    @RequestMapping("/show1")
    public String show1(String msg1){
        System.out.println("=====接受到用户发送数据为:"+msg1+"=======");
        return "success";
    }

    @RequestMapping("/show2")
    public String show2(String msg1,int msg2){
        System.out.println("=====接受到用户发送数据为:"+msg1+"=======");
        System.out.println("=====接受到用户发送数据为:"+msg2+"=======");
        return "success";
    }

}
2.POJO类型参数:
                 包括实体类,以及关联的实体类
3.数组和集合类型参数:
                  包括 List 结构和 Map 结构的集合(包括数组)
 4.使用 ServletAPI 对象作为方法参数
          HttpServletRequest
         HttpServletResponse
        HttpSession
          java.security.Principal
          Locale
          InputStream
          OutputStream
          Reader
          Writer
  二.使用要求
     1.发送请求中携带数据的key与方法参数的name必须一致
     2.数据类型合法
/***********************POJO 类型作为参数*********************************/
    //单一对象
    @RequestMapping("/show3")
    public String show3(Emp emp){
        System.out.println("=====接受到用户发送数据为:"+emp+"=======");
        return "success";
    }
    //对象嵌套
    @RequestMapping("/show4")
    public String show4(Emp emp){
        System.out.println("=====接受到用户发送数据为:"+emp+"=======");
        return "success";
    }

    //@RequestParam
    @RequestMapping("/map")
    public String map(@RequestParam Map map){
        System.out.println(map);
        return "success";
    }


    /*********************POJO 类中包含集合类型参数*********************************/
    @RequestMapping("/show5")
    public String show5(Dep dep){
        System.out.println("=====接受到用户发送数据为:"+dep+"=======");
        return "success";
    }


    @RequestMapping("/show6")
    public String show8(int[] nums){
        System.out.println("=====接受到用户发送数据为:"+ Arrays.toString(nums) +"=======");
        return "success";
    }


    /*********************使用 ServletAPI 对象作为方法参数*********************************/
    @RequestMapping("/show7")
    public String show7(HttpServletRequest request, HttpServletResponse response){


//        request.setCharacterEncoding("UTF-8");
//        response.setCharacterEncoding("UTF-8");
        System.out.println(request);
        System.out.println(response);
        request.getParameter("msg1");

        HttpSession session =     request.getSession();
        System.out.println(session);
        session.setAttribute("","");

        try {
            response.sendRedirect("重定向");
        } catch (IOException e) {
            e.printStackTrace();
        }

        ServletContext applaction =  session.getServletContext();

        return "success";
    }

(3)常用注解

在 Spring MVC 中,有一些常用注解可以帮助简化开发过程:

  • @Controller:标记一个类为控制器。
  • @RequestMapping:映射 HTTP 请求到特定方法。
  • @GetMapping@PostMapping:分别用于处理 GET 和 POST 请求的快捷方式。
  • @RequestParam:将请求参数绑定到方法参数。
  • @PathVariable:从 URI 模板中提取变量并绑定到方法参数。
  • @RequestBody:将请求体的内容绑定到对象。
  • @ResponseBody:将方法返回的对象直接写入 HTTP 响应体。
  • @ModelAttribute:将请求参数绑定到模型对象。

一.@RequestParam
      作用:
          把请求中指定名称的参数给控制器中的形参赋值。
          如果页面标签名称和方法参数名称不一致,可以使用此注解实现
      属性:
          name属性:设置参数名称
          defaultValue属性:设置默认值
          required属性:设置是否为必传

/**
     * @RequestParam("名称必须与页面标签或者url地址key名称一致")
     * */
    @RequestMapping("/show1")
    public String show1(@RequestParam(name="msg1") String msg){
        System.out.println("=====接受到用户发送数据为:"+msg+"=======");
        return "success";
    }

    @RequestMapping("/show2")
    public String show2(@RequestParam("msg1") String msg, @RequestParam("msg2") int num){
        System.out.println("=====接受到用户发送数据为:"+msg+"=======");
        System.out.println("=====接受到用户发送数据为:"+num+"=======");
        return "success";
    }


    @RequestMapping("/show3")
    public String show4(@RequestParam(name = "uname",defaultValue = "暂无用户") String name){
        System.out.println("账号:"+name);
        return "success";
    }

 二.@RequestBody
      作用:
          用于获取"请求体"内容。直接使用得到是 key=value&key=value...
          结构的数据,并可以转换为对象
      属性:
          required:是否必须有请求体。默认值是:true。

/**
     * 前后端分离
     * @RequestBody可以将json ===》 javaBean
     * 注意:
     *  1.前端不能使用GET方式提交数据,GET方式无请求体
     * {
     * 	"eid":101,
     * 	"ename":"詹姆斯邦德",
     * 	"esex":"绅士"
     * }
     *
     * * */
    @RequestMapping("/show4")
    public String show4(@RequestBody Emp emp){
        System.out.println("=========="+emp+"==========");
        return "success";
    }

 三.@PathVaribale
      作用:
          用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},
          这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之
          后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志
      属性:
          value:用于指定 url 中占位符名称。
          required:是否必须提供占位符。

@PostMapping("/show5/{uname}/{pwd}")
    public String show5(@PathVariable("uname") String msg1, @PathVariable("pwd") String msg2){
        System.out.println(msg1);
        System.out.println(msg2);
        return "success";
    }

    @PostMapping("/show6/{uname}/{pwd}")
    public String show6(@PathVariable String uname, @PathVariable String pwd){
        System.out.println(uname);
        System.out.println(pwd);
        return "success";
    }

  Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
  主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,
  更易于实现缓存机制等。

  Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
       GET:用于获取资源
       POST:用于新建资源
       PUT:用于更新资源
       DELETE:用于删除资源
例如:
新增   POST    http://localhost:8080/user/用户名/用户密码/用户性别
查询   GET     http://localhost:8080/user/用户ID
删除   delete  http://localhost:8080/user/用户ID
修改   put     http://localhost:8080/user/用户ID/用户名/用户密码/用户性别

localhost:8080/login?uname=王老师&upwd=123
localhost:8080/login/王老师/123

(4)数据传递

在 Spring MVC 中,你可以通过模型对象来传递数据到视图。通常用 Model 或 ModelAndView 类。

 1.页面跳转重定向
  • redirect:表示浏览器执行重定向,会改变浏览器地址栏的URL。

  • forward:表示请求转发,URL不改变,还是原来的URL。

  • 返回的字符串值(如"index""success_String")通常会对应于Spring MVC的视图解析器配置,决定最终渲染的视图。

根据需要的行为选择使用重定向或转发,合适的设计将有助于提升用户体验和应用性能。

package com.xn.springboot_web_04.controller;

import com.xn.springboot_web_04.pojo.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * 返回值为:字符串
 * */
@Controller
@RequestMapping("/string")
public class StringController_01 {

    /**
     * 进入首页
     * */
    @RequestMapping("/show")
    public String show(){
        return "index";
    }

    /*
    * 充当试图的逻辑名称,默认页面跳转为请求转发方式
    * */
    @RequestMapping("/show1")
    public String show1(){
        System.out.println("=========show1=========");
        return "success_String";
    }


      /*
      * 作充当一次请求转发或重定向
      * */
    @RequestMapping("/show2")
    public String show2(){
        System.out.println("=========show2=========");
        return "redirect:show1";
    }

    @RequestMapping("/show3")
    public String show3(){
        System.out.println("=========show3=========");
        return "forward:show1";
    }


    @RequestMapping("/show4")
    public String show4(HttpServletRequest request){
        System.out.println("=========show4=========");
        //1.查询数据库(模拟)
        Emp emp = new Emp(1,"张毅老师","男");
        //2.获取session
        request.getSession().setAttribute("emp",emp);
        return "success_String";
    }

}
 2、 json格式转换

@RestController 是一个在 Spring Framework 中常用的注解,主要用于简化 RESTful Web 服务的开发。它结合了 @Controller 和 @ResponseBody 的作用。以下是 @RestController 的一些关键点和特点:

1. 意义与用途

  • @RestController 注解用于定义一个控制器,处理 HTTP 请求并返回 JSON/XML 格式的响应体。这在构建 RESTful API 时非常有用。

  • 当一个类被标注为 @RestController,这个类中的每个方法默认为返回 JSON 或 XML 响应,而不是渲染视图。

@Controller
@RequestMapping("/json")
public class JsonController_02 {

    /**
     *
     * @ResponseBody   对象====>json
     *  位置:1.类
     *      2.方法
     *
     *
     * @RequestBody    json====>对象
     * 位置:方法参数
     *
     * @RestController   =  @Controller  +  @ResponseBody
     *
     * */

    @RequestMapping("/show1")
    @ResponseBody
    public List<Emp> show1(){
        //1模拟数据库
        Emp emp1 = new Emp(1,"张毅老师","男");
        Emp emp2 = new Emp(2,"张毅老师","男");
        Emp emp3 = new Emp(3,"张毅老师","男");
        List<Emp> list = new ArrayList<>();
        list.add(emp1);
        list.add(emp2);
        list.add(emp3);
        return list;
    }

    @RequestMapping("/show2")
    @ResponseBody
    public String show2(){
        return "helloWorld";
    }

}

自动响应
  • 方法返回的对象会自动转换为 JSON(或 XML,取决于请求的 Accept 头)并写入 HTTP 响应体中,而不需要显式使用 @ResponseBody 注解。

(5)文件上传

方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)
 <!-- 文件上传 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
@Controller
public class UserController {

    //进入测试页面
    @RequestMapping("/show")
    public String show(){
        return "index";
    }

    //文件上传
    @RequestMapping("/fileupload")
    public String fileupload(String uname, MultipartFile upic, HttpServletRequest request){
        System.out.println("用户名:"+uname);
        System.out.println(upic);
        System.out.println(upic.getOriginalFilename());
        System.out.println(upic.getName());
    }
}
 方式2.文件服务器(七牛云)
 <!-- 导入七牛云需要坐标 -->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.2.25</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.14.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>happy-dns-java</artifactId>
            <version>0.1.6</version>
            <scope>test</scope>
        </dependency>
        <!-- 文件上传 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
@Controller
public class UserController {

    //进入测试页面
    @RequestMapping("/show")
    public String show(){
        return "index";
    }

    //文件上传
    @RequestMapping("/fileupload")
    public String fileupload(String uname, MultipartFile upic, HttpServletRequest request){
        System.out.println("用户名:"+uname);
        System.out.println(upic);
        System.out.println(upic.getOriginalFilename());
        System.out.println(upic.getName());


        //方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)
        //方式2.文件服务器(七牛云)
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        String accessKey = "Lo5tVZ7DcrNNVMWCaq4wPosNdrAbRv5aKGldQ__l";
        String secretKey = "N2wIAm84WQXAz63RVI82AFa81j03afQnmg4ekZMz";
        String bucket = "xiaobainn";
        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = "2024/2.jpg";
        String name = null;

        try {
            byte[] uploadBytes = upic.getBytes();
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);

            try {
                Response response = uploadManager.put(uploadBytes, key, upToken);
                //解析上传成功的结果
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                System.out.println(putRet.key);//获取文件名
                System.out.println(putRet.hash);//获取文件hash值
                name = putRet.key;
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (Exception ex) {
            //ignore
        }
        request.getSession().setAttribute("picname",name);

        return "success";
    }
}

 

六、注册Servlet三大组件 Servlet/Filter/Listener

而由于 Spring Boot 默认是以 jar 包的方式运行嵌入式Servlet容器来启动应用,没有web.xml文件, Spring提供以下Bean来注册三大组件

ServletRegistrationBean                 注册自定义

Servlet FilterRegistrationBean        注册自定义Filter

ServletListenerRegistrationBean    注册自定义Listener

@WebFilter(urlPatterns = {"/*"})
public class MyFilter implements Filter{


    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        System.out.println("============请求过滤");

        request.setCharacterEncoding("utf-8");

        //分水岭
        chain.doFilter(request, response);


        response.setCharacterEncoding("utf-8");

        System.out.println("============响应过滤");
    }

}
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {

        System.out.println("进入servlet");
        resp.getWriter().println("<h1>hello world</h1>");
    };

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);

    }
}

@WebListener
public class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContextListener.super.contextInitialized(sce);
        System.out.println("-------------MyListener inited !");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContextListener.super.contextDestroyed(sce);
        System.out.println("----------------MyListener Destroy !");
    }
}

如果使用传统

@WebFilter...实现注册也可以

条件:

        1.一定是自定义组件

        2.启动类添加@ServletComponentScan

七、切换为其他嵌入式Servlet容器

SpringBoot 默认针对Servlet容器提供以下支持:

Tomcat(默认使用)

Jetty :支持长连接项目(如:聊天页面)[ˈdʒeti]

Undertow : 不支持 JSP , 但是并发性能高,是高性能非阻塞的容器[ˈʌndətəʊ]

默认Tomcat容器

 切换 Jetty 容器

package com.apesource.springboot04web04;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan
public class SpringBoot04Web04Application {

	public static void main(String[] args) {
		SpringApplication.run(SpringBoot04Web04Application.class, args);
	}

}

 使用外置Servlet容器Tomcat9.x

嵌入式Servlet容器:运行启动类就可启动,或将项目打成可执行的 jar 包

        优点:简单、快捷;

        缺点:默认不支持JSP、优化定制比较复杂使用定制器, 还需要知道 每个功能 的底层原理

外置Servlet容器:配置 Tomcat, 将项目部署到Tomcat中运行

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

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

相关文章

50ETF期权交易小技巧分享:期权的交易规律

今天带你了解50ETF期权交易小技巧分享&#xff1a;期权的交易规律。50ETF期权是一种以实物华夏上证50ETF基金为标的物的金融衍生品&#xff0c;它允许投资者在未来某个特定时间以特定价格买入或卖出一定数量的50ETF基金。 50ETF期权交易规律 1、短线思维&#xff0c;最长1周时…

Python数据分析:数据可视化(Matplotlib、Seaborn)

数据可视化是数据分析中不可或缺的一部分&#xff0c;通过将数据以图形的方式展示出来&#xff0c;可以更直观地理解数据的分布和趋势。在Python中&#xff0c;Matplotlib和Seaborn是两个非常流行和强大的数据可视化库。本文将详细介绍这两个库的使用方法&#xff0c;并附上一个…

SAP MIGO屏幕增强的具体实施步骤介绍(SE19:MB_MIGO_BADI) <转载>

原文链接&#xff1a;https://mp.weixin.qq.com/s/cDoKsc3nBPMa0GRTtQawHw 在SAP/ERP项目实施中经常会遇到MIGO屏幕增强的需求&#xff0c;就是要在MIGO标准屏幕的抬头或行项目中添加一个客制化页签&#xff0c;在增强页签下增加一些字段供用户录入一些额外信息&#xff0c;比…

C语言 | Leetcode C语言题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; int* countBits(int n, int* returnSize) {int* bits malloc(sizeof(int) * (n 1));*returnSize n 1;bits[0] 0;for (int i 1; i < n; i) {bits[i] bits[i & (i - 1)] 1;}return bits; }

公钥基础设施PKI

数字证书的生成方式&#xff1a; 第一步&#xff0c;密钥生成。有两种方法&#xff0c;一是主体可以用某个软件生成的公钥/私钥对&#xff0c;主体要使生成的私钥保密&#xff0c;然后把公钥和其他信息与身份证明发送给注册机构。二是注册机构也可以为主体生成密钥对&#xff…

前端工程师如何快速入门鸿蒙开发?

在当今科技飞速发展的时代&#xff0c;前端工程师们面临着不断拓展技能边界的挑战。随着鸿蒙操作系统的崛起&#xff0c;掌握鸿蒙开发成为了前端工程师们提升自身竞争力的重要途径。那么&#xff0c;前端工程师如何才能快速入门鸿蒙开发呢? 一、了解鸿蒙开发的基础知识 前端工…

mybatis xml 动态sql相关语法

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace"com.xiaKangan.mapper.EmpMapper&qu…

定期修改密码竟然导致好几任运维小哥离职

某云服务商为政企客户提供私有云服务&#xff0c;每朵云里交换机、服务器、防火墙等网络/安全设备可多达数百台&#xff0c;而该企业仅有二、三十名运维人员&#xff0c;每人要负责2-3朵云的运维管理工作。当前&#xff0c;设备管理存在一些重大安全隐患&#xff0c;主要体现在…

微服务架构的未来发展趋势

文章目录 摘要引言当前发展趋势ServerlessService MeshAIOps 未来可能出现的挑战代码示例微服务架构示例 QA环节小结未来展望参考资料 摘要 微服务架构在软件开发中已经成为主流&#xff0c;但随着市场需求和技术环境的快速变化&#xff0c;微服务架构也在不断演进。本文将分析…

在线教育新突破:Codigger 视频会议的实战案例

在当今数字化时代&#xff0c;在线教育如同一颗璀璨的新星&#xff0c;迅速崛起并照亮了知识传播的新路径。然而&#xff0c;随着竞争的加剧&#xff0c;如何提升教学质量和增强互动性&#xff0c;成为了在线教育机构亟待解决的难题。这时候&#xff0c;视频会议的出现就如同一…

【python】Matplotlib+LaTeX绘图 字符加粗 || 代码合集

【start&#xff1a;240814】 文章目录 动机Matplotlib库调用报错 LaTeX 模式安装使用配置属性&#xff1a;text.latex.preamble属性简介amsmathtextcomp 非LaTeX 模式配置属性&#xff1a;mpl.rcParams[...] 字符加粗&#xff08;label&#xff09;非LaTeX模式&#xff08;关闭…

英飞凌高压侧智能电源开关:BSP762T中文资料书

描述&#xff1a; 集成垂直功率FET的高压侧电源开关&#xff0c;提供嵌入式保护和诊断功能。 特性 - 过载保护 - 电流限制 - 短路保护 - 带重启功能的热关断 - 过压保护&#xff08;包括负载转储&#xff09; - 电感负载快速消磁 - 电池反向保护&#xff0c;带外部电阻 - CMOS兼…

【手撕数据结构】Topk问题

目录 题目思路代码 题目 TOP-K问题&#xff1a;即求数据结合中前K个最⼤的元素或者最⼩的元素&#xff0c;⼀般情况下数据量都⽐较⼤。 ⽐如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 对于Top-K问题&#xff0c;能想到的最简单直接的⽅式就是排序…

智联云采 SRM2.0 runtimeLog/download 任意文件读取漏洞复现

0x01 产品简介 智联云采是一款针对企业供应链管理难题及智能化转型升级需求而设计的解决方案&#xff0c;针对企业供应链管理难题&#xff0c;及智能化转型升级需求&#xff0c;智联云采依托人工智能、物联网、大数据、云等技术&#xff0c;通过软硬件系统化方案&#xff0c;帮…

Python 中的 SHAP 简介

本文中有多篇计划文章&#xff0c;后期会补充相关链接。鉴于公众号内无法后期修改文章&#xff0c;请关注原文链接。 如何创建和解释 SHAP 图&#xff1a;瀑布图、力图、平均 SHAP 图、蜂群图和依赖图 可直接在橱窗里购买&#xff0c;或者到文末领取优惠后购买&#xff1a; SHA…

iOS替代商店AltStore PAL获得EPIC的资助 即日起取消1.5欧元的年度订阅费

知名游戏开发商 EPIC 日前宣布通过 EPIC MegaGrant 计划向 iOS 替代商店 AltStore PAL 进行捐赠&#xff0c;该商店是在欧盟市场经过苹果批准的合规的第三方应用商店。 按苹果规定第三方替代商店需要缴纳核心技术费并且没有豁免条款&#xff0c;因此该商店每被一名用户安装&am…

RIP学习笔记

1.RIP简介 Rip&#xff1a;routing information protocol&#xff0c;路由信息协议。属于动态路由协议的一种。 RIP是应用较早、使用较普遍的内部网关协议(InteriorGatewayProtocol,简称IGP)&#xff0c;适用于小型同类网络&#xff0c;是典型的距离向量(distance-vector)协议…

OKR 与 KPI 的区别

OKR出现后&#xff0c;大家经常会拿KPI与之一起比较&#xff0c;结果两级分化&#xff1a;爱KPI的一如既往KPI&#xff0c;把OKR说的一无是处。爱OKR的&#xff0c;搞起了“去KPI”化。Tita作为OKR应用软件的服务商&#xff0c;我们也必须对OKR和KPI有充分的理解。对此我认真做…

Ubuntu离线安装docker

查看操作系统版本&#xff1a; rootzyh-VMware-Virtual-Platform:~/install# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04 LTS Release: 24.04 Codename: noble rootzyh-VMware-Virtual-Platform:~/install#…

微服务架构设计中的常见的10种设计模式

微服务架构设计的概念 微服务架构&#xff08;Microservices Architecture&#xff09;是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务&#xff0c;每个服务都运行在其独立的进程中&#xff0c;服务之间通过轻量级的通信机制&#xff08…