day39_servlet

news2025/1/2 0:14:48

今日内容

零、复习昨日

一、接收请求

二、处理响应

三、综合案例

零、复习昨日

见晨考

一、接收请求

浏览器发出请求,经过web.xml映射匹配,找到Servlet对应的方法(doGet/doPost),接收请求数据,可以接收请求中的请求行,请求头,请求正文,具体流程如下

  1. 浏览器发出请求

    a/form/ajax

  2. 经过web.xml映射匹配

  3. web.xml(8行代码)

  4. servlet类中的doGet/doPost

    前端是get请求,就重写doGet

    前端是post请求,就重写doPost

    如何接收数据?通过HttpServletRequest对象处理

需求: html页面中写一个表单,发送请求,后台服务器接收所有请求数据

1.1 编写页面

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>演示表单发送请求,后台接收请求数据</h2>
<%--
    action路径,需要加上项目名
        /项目名/请求路径
    单选,复选框默认选中是 添加checked属性
    下来框默认选中是 option中添加selected属性
--%>
<form action="/day39/req" method="get">

    用户名<input type="text" name="username"><br>
    密码<input type="password" name="password"><br>
    邮箱<input type="email" name="email"><br>
    性别<input type="radio" name="sex" value="1" checked><input type="radio" name="sex"value="2"><br>
    爱好<input type="checkbox" name="hobby" value="coding" checked>敲代码
    <input type="checkbox" name="hobby" value="game"> 打游戏
    <input type="checkbox" name="hobby" value="ball">打球<br>
    生日<input type="date" name="birthday"><br>
    籍贯<select name="jiguan">
            <option value="henan" selected>河南</option>
            <option value="hebei">河北</option>
            <option value="shanxi">山西</option>
        </select><br>
    <input type="submit" value="提交">
</form>

</body>
</html>

1.2 编写Servlet

package com.qf.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Enumeration;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class MyReqRespServlet extends HttpServlet {

    /**
     *
     * HttpServletRequest req 来接收请求数据
     * HttpServletResponse resp 来处理响应
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // === 请求行 === [熟悉]
        String method = req.getMethod( );
        /**
         * URL: 资源定位符  http://localhost:8080/day39/req
         * URI: 资源标识符  /day39/req
         */
        StringBuffer url = req.getRequestURL( );
        String uri = req.getRequestURI( );
        String protocol = req.getProtocol( );

        System.out.println("method:"+method);
        System.out.println("url:"+url );
        System.out.println("uri:"+uri);
        System.out.println("protocol:"+protocol );

        // ==== 请求头 ====
        // 获得所有的请求头[了解]
        Enumeration<String> names = req.getHeaderNames( );
        while (names.hasMoreElements()) {
            String heard = names.nextElement( );
            String value = req.getHeader(heard);
            System.out.println(heard+"-->"+value );
        }

        /**
         * [重点] 获得请求正文
         * 无论是明文,暗文,邮箱,日期,单选,下拉框获取数据的方法都是
         * req.getParameter(name),参数是前端标签内name属性的值
         */
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        String sex = req.getParameter("sex");
        // int i = Integer.parseInt(sex);

        String birthday = req.getParameter("birthday");
        //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //Date date = sdf.parse(birthday);


        String jiguan = req.getParameter("jiguan");

        System.out.println("username = " +  username);
        System.out.println("password = " + password );
        System.out.println("email = " +  email);
        System.out.println("sex = " +  sex);
        System.out.println("birthday = " +  birthday);
        System.out.println("jiguan = " +  jiguan);

        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies ) );

    }
}

1.3 配置web.xml

<?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_3_1.xsd"
version="3.1">

    <servlet>
        <servlet-name>req</servlet-name>
        <servlet-class>com.qf.servlet.MyReqRespServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>req</servlet-name>
        <!--此处不需要写项目名,只需要写请求路径-->
        <url-pattern>/req</url-pattern>
    </servlet-mapping>
</web-app>

1.4 部署项目

1.5 启动测试

二、做出响应

做出响应是通过HttpServletResponse对象

  • 响应行
    • 状态码
  • 响应头
    • 响应信息,其中有一个cookie后续会用到,以及编码格式
  • 响应正文
    • 向浏览器展现的内容

        // 响应状态码
        // 200 是成功, 302 重定向 404 资源未找到 500 服务器错误
        // 一般不用设置,为自动响应
        // resp.setStatus(200);

        // 设置响应头
        // resp.setHeader("key","value");
        // 指定浏览器如何解析响应的内容,解决响应乱码
        resp.setContentType("text/html;charset=utf-8");


        // 向浏览器响应内容(响应正文)
        PrintWriter out = resp.getWriter( );
        out.write("<html>");
        out.write("     <head>");
        out.write("         <title>这是响应</title>");
        out.write("     </head>");
        out.write("     <body>");
        out.write("         <div style='background-color:red;width:500px;height:500px;font-size:50px'>");
        out.write("         这是响应,欢迎"+username);
        out.write("         </div>");
        out.write("     </body>");
        out.write("</html>");

三、乱码解决

请求乱码

 req.setCharacterEncoding("utf-8");

响应乱码

resp.setContentType("text/html;charset=utf-8");

四、 综合案例(Servlet + JDBC)

  • 要求:实现登录功能、展示所有用户功能

  • 以下仅展示关键代码

登录页面
	html/jsp
后台服务器代码
	web.xml
	servlet,接收数据
	jdbc+orm
	servlet,做出响应
mysql
	库,表

4.1 数据库

CREATE TABLE admin(
	username VARCHAR(20) PRIMARY KEY,
	PASSWORD VARCHAR(20) NOT NULL,
    phone varchar(11) NOT NULL,
    Address varchar(20) NOT NULL
)CHARSET=utf8;
INSERT INTO admin(username,PASSWORD,phone,address)
VALUES('gavin','123456','12345678901','北京市昌平区');
INSERT INTO admin(username,PASSWORD,phone,address)
VALUES('aaron','123456','12345678901','北京市昌平区');

实体类

public class Admin {

    private String username;
    private String password;
    private String phone;
    private String address;
    
    //  set get 构造 toString ...
}

4.2 pom依赖

   <!-- 引入servlet依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <!-- 引入jsp依赖 -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.1</version>
    </dependency> 
    <!-- mysql驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    <!-- 阿里巴巴数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.10</version>
    </dependency>

4.3 DBUtils

package com.qf.util;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class DBUtil {

    // 读取输入流中的数据放入properties对象
    private static Properties properties = new Properties( );

    // 声明Druid连接池
    private static DruidDataSource dataSource;


    /**
     * 静态代码块
     * 目的: 为了加载DBUtil类时就执行静态代码块内的代码
     *      就会加载驱动,且只保留一份
     */
    static {
        try {
            // 将db.properties文件变为输入流
            InputStream inputStream = DBUtil.class.getResourceAsStream("/db.properties");
            properties.load(inputStream);
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace( );
            System.out.println("加载驱动出错");
        }
    }


    /**
     * 返回数据库连接
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection( );
        } catch (Exception e) {
            e.printStackTrace( );
            System.out.println("获得连接出错");
        }
        return conn;
    }

    /**
     * 关闭所有连接
     */
    public static void closeAll(Connection conn, Statement s) {
        try {
            conn.close( );
            s.close( );
        } catch (SQLException e) {
            e.printStackTrace( );
        }
    }

    public static void closeAll(Connection conn, Statement s, ResultSet rs) {
        try {
            conn.close( );
            s.close( );
            rs.close( );
        } catch (SQLException e) {
            e.printStackTrace( );
        }
    }

    /**
     * 设计方法,自动完成查询结果的封装
     */
    public static <T> T selectOne(Class<T> target, String sql, Object... args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        T t = null; // 最终返回的目标类型
        try {
            conn = getConnection( );
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i+1,args[i]);
            }
            rs = ps.executeQuery( );
            // 根据目标类,获得所有属性
            Field[] fields = target.getDeclaredFields( );
            while(rs.next()) {
                t = target.newInstance( );
                // 遍历得到所有的属性,即就是数据库的字段
                for (Field field : fields) {
                    String name = field.getName( );
                    Object value = rs.getObject(name);
                    field.setAccessible(true);
                    if (value != null) {
                        field.set(t,value);
                    }
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll(conn,ps,rs);
        }
        return t;
    }

    public static <T> List<T> selectAll(Class<T> target, String sql, Object... args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        T t = null; // 最终返回的目标类型
        ArrayList<T> list = new ArrayList<>( );
        try {
            conn = getConnection( );
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i+1,args[i]);
            }
            rs = ps.executeQuery( );
            // 根据目标类,获得所有属性
            Field[] fields = target.getDeclaredFields( );
            while(rs.next()) {
                t = target.newInstance( );
                // 遍历得到所有的属性,即就是数据库的字段
                for (Field field : fields) {
                    String name = field.getName( );
                    Object value = rs.getObject(name);
                    field.setAccessible(true);
                    if (value != null) {
                        field.set(t,value);
                    }
                }
                list.add(t);
            }
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll(conn,ps,rs);
        }
        return list;
    }

    /**
     * 封装增删改的方法
     */
    public static int update(String sql,Object... args){
        Connection conn = null;
        PreparedStatement ps = null;
        int num = 0;
        try {
            conn = getConnection( );
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i+1,args[i]);
            }
            num = ps.executeUpdate( );
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll(conn,ps);
        }
        return num;
    }

}

加入数据库连接池

db.properties

# properties文件是一种特殊的文件格式,形如map
# 文件内容的写法: key=value
# 数据库驱动
driverClass=com.mysql.jdbc.Driver
# 连接url
url=jdbc:mysql://localhost:3306/java2307?useSSL=false
# 用户名
username=root
# 密码
password=123456
# ----- 加入druid的一些连接配置
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 60000毫秒/1000等于60秒 -->
maxWait=5000

4.4 登录页面

<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>登录</h2>
    <form action="/day39/login">
        用户名<input type="text" name="username"><br>
        密码 <input type="password" name="password"><br>
        <input type="submit" value="登录"><br>
    </form>
</body>
</html>

4.5 web.xml

<?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_3_1.xsd"
version="3.1">

    <!-- 设置项目启动访问的首页,默认是index.jsp -->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
    
    <servlet>
        <servlet-name>req</servlet-name>
        <servlet-class>com.qf.servlet.MyReqRespServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>req</servlet-name>
        <url-pattern>/req</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.qf.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
</web-app>

4.6 业务层service

业务层就处理项目业务逻辑的,业务逻辑包含哪些内容?

  • 除了servlet接收请求做出响应以及jdbc操作数据库的代码,其他全是业务逻辑

业务层代码编码

  • 需要创建包结构service
  • 创建业务层接口及实现类

AdminService

public interface AdminService {

    /**
     * 根据用户名密码查询用户
     * @param username
     * @param password
     * @return 查到返回的是用户对象
     *         查不到返回的null
     */
   Admin login(String username , String password);

    /**
     * 查询全部用户
     */
    List<Admin> findAll();

}

AdminServiceImpl

public class AdminServiceImpl implements AdminService{

    private AdminDao adminDao = new AdminDaoImpl();

    @Override
    public Admin login(String username, String password) {
        /**
         * 业务逻辑代码...
         */
        Admin admin = adminDao.login(username, password);
        return admin;
    }

    @Override
    public List<Admin> findAll() {
        List<Admin> list = adminDao.findAll( );
        return list;
    }
}

4.7 数据访问层dao

数据访问层 Data Access Object - DAO

项目需要创建dao层代码专门操作数据库

dao层编码

  • 创建dao包
  • 创建dao接口及实现类

AdminDao

public interface AdminDao {

    /**
     * 登录
     */
    Admin login(String username,String password);

    /**
     * 查询全部
     */
    List<Admin> findAll();

}

AdminDaoImpl

public class AdminDaoImpl implements AdminDao{

    @Override
    public Admin login(String username, String password) {
        Connection conn = DBUtil.getConnection( );
        PreparedStatement ps = null;
        ResultSet rs = null;
        Admin admin = null;
        try {
            ps = conn.prepareStatement("select * from admin where username = ? and password = ?");
            ps.setString(1,username);
            ps.setString(2,password);

            rs = ps.executeQuery( );
            while (rs.next()) {
                // 从数据库查出的
                String username1 = rs.getString("username");
                String password1 = rs.getString("password");
                String phone = rs.getString("phone");
                String address = rs.getString("address");

                admin = new Admin(  );// 用这个对象封装数据库的数据
                admin.setUsername(username1);
                admin.setPassword(password1);
                admin.setPhone(phone);
                admin.setAddress(address);
            }
        } catch (SQLException e) {
            e.printStackTrace( );
        } finally {
            DBUtil.closeAll(conn,ps,rs);
        }
        return admin;
    }

    @Override
    public List<Admin> findAll() {
        Connection conn = DBUtil.getConnection( );
        PreparedStatement ps = null;
        ResultSet rs = null;
        Admin admin = null;
        ArrayList<Admin> list = new ArrayList<>( );
        try {
            ps = conn.prepareStatement("select * from admin ");

            rs = ps.executeQuery( );
            while (rs.next()) {
                // 从数据库查出的
                String username1 = rs.getString("username");
                String password1 = rs.getString("password");
                String phone = rs.getString("phone");
                String address = rs.getString("address");

                admin = new Admin(  );// 用这个对象封装数据库的数据
                admin.setUsername(username1);
                admin.setPassword(password1);
                admin.setPhone(phone);
                admin.setAddress(address);

                // 存入集合
                list.add(admin);
            }
        } catch (SQLException e) {
            e.printStackTrace( );
        } finally {
            DBUtil.closeAll(conn,ps,rs);
        }
        return list;
    }
}

4.8 LoginServlet

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // 接收请求
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username = " + username );
        System.out.println("password = " + password );

        /**
         * 中间处理业务逻辑的代码
         * 需要单独创建业务层类(service),数据访问层类(dao)
         * 不要把所有事情都交给servlet,要做到单一职责
         */
        AdminService service = new AdminServiceImpl();
        Admin admin = service.login(username, password);


        PrintWriter out = resp.getWriter( );
        // 做出响应
        if (admin != null) {
            // 登录成功,展现全部
            List<Admin> list = service.findAll( );
            out.write("<html>");
            out.write("<h2 style='color:green'>欢迎"+username+"登录管理员系统</h2>");

            out.write("<hr>");
            out.write("<table border='2'>");
            out.write("<tr>");
            out.write(" <td>用户名</td>");
            out.write(" <td>密码</td>");
            out.write(" <td>手机号</td>");
            out.write(" <td>地址</td>");
            out.write("</tr>");
            for (int i = 0; i < list.size(); i++) {
                Admin obj = list.get(i);
                out.write("<tr>");
                out.write(" <td>"+obj.getUsername()+"</td>");
                out.write(" <td>"+obj.getPassword()+"</td>");
                out.write(" <td>"+obj.getPhone()+"</td>");
                out.write(" <td>"+obj.getAddress()+"</td>");
                out.write("</tr>");
            }
            out.write("</table>");
            out.write("</html>");

        } else {
            // 登录失败
            out.write("<html>");
            out.write("<h1 style='color:red'>用户名或密码错误</h1>");
            out.write("</html>");
        }
    }
}

4.9 测试

image-20230523162257066

image-20230523162307245

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

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

相关文章

OpenAI ChatGPT API + FaskAPI SSE Stream 流式周转技术 以及前端Fetch 流式请求获取案例

先填坑&#xff0c;一贯习惯 nginx如果要支持SSE&#xff0c;要调整一些参数 conf配置文件&#xff0c;AI给的&#xff0c;具体自己没搭&#xff0c;应该是正确的 nginx worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_typ…

Ubuntu下编译运行MicroPython Unix版本

文章目录 github拉取源码更新模块编译运行 github拉取源码 到Github(https://github.com/micropython/micropython)上下载源码 终端输入&#xff0c;如果提示识别不到gh命令&#xff0c;就sudo apt-get install gc安装一下。 再根据提示在终端里登录自己的github账号。 再次…

Hystrix 服务熔断

书籍,人,借阅服务之间相互调用, 高度耦合, 一旦一个服务故障, 其他服务会雪崩, 和多米诺骨牌一样 Hystrix 熔断器, 保险丝 服务降级 提供补救措施发给请求者, 服务可用, 能力下降了 borrow-service 导入依赖 <dependency><groupId>org.springframework.cloud&l…

linux kernel pwn 常用结构体

tty 设备结构体 tty 设备在 /dev 下的一个伪终端设备 ptmx 。 tty_struct&#xff08;kmalloc-1k | GFP_KERNEL_ACCOUNT&#xff09; tty_struct 定义如下 。 /* tty magic number */ #define TTY_MAGIC 0x5401struct tty_struct {int magic;...const struct tty…

python学习-基础知识总结

&#xff08;一&#xff09;基础语法 1.1、注释 程序添加注释&#xff0c;可以用来解释程序某些部分的作用和功能&#xff0c;提高程序的可读性&#xff0c;注释有两种形式&#xff1a; 单行注释&#xff1a;#多行注释&#xff1a;单引号&#xff08;注释内容&#xff09;或双…

【剑指offer】数据结构——字符串

目录 数据结构——字符串直接解【剑指offer】05. 替换空格【剑指offer】17. 打印从1到最大的n位数【剑指offer】20. 表示数值的字符串【剑指offer】37. 序列化二叉树【剑指offer】50. 第一个只出现一次的字符【剑指offer】58. 翻转单词顺序【剑指offer】58.2 左旋转字符串【剑指…

C++多态 万字详解

在经历两个多月的备赛后&#xff0c;最终5.21结果出来后自己也比较满意&#xff0c;以一个省三收尾&#xff08;算法类的&#xff09;。 期间每天偶尔学学新知识&#xff0c;然后主要做题&#xff0c;博客也落下了不少&#xff0c;现在开始继续补&#xff08;可能会些许生疏&a…

【剑指offer】数据结构——数组

目录 数据结构——数组直接解【剑指offer】03.数组中重复的数字排序法集合法原地置换 【剑指offer】04. 二维数组中的查找【剑指offer】29. 顺时针打印矩阵【剑指offer】39. 数组中出现次数超过一半的数字【剑指offer】40. 最小的k个数【剑指offer】45. 把数组排成最小的数【剑…

C++ 实现命令行画心形代码,有多个爱心代码,简单可调数据和字符,可装X,也可用于浪漫的表白,可实现跳动、保存等功能

绘制一个简易爱心 #include <stdio.h> #include <Windows.h>int main() {for (float y 1.5f; y > -1.5f; y - 0.1f){for (float x -1.5f; x < 1.5f; x 0.05f){float z x * x y * y - 1;float f z * z * z - x * x * y * y * y;putchar(f < 0.0f ?…

一文带你了解MySQL之基于规则的优化

前言&#xff1a; 大家别忘了MySQL本质上是一个软件&#xff0c;MySQL的并不能要求使用这个软件的人人都是数据库的高手&#xff0c;就像我写这篇文章的时候并不能要求各位在学之前就会了里边的知识。也就是说我们无法避免某些小伙伴写一些执行起来十分耗费性能的语句。即使是…

【youcans 的图像处理学习课】22. Haar 级联分类器

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的图像处理学习课】22. Haar 级联分类器 3. Haar 特征及其加速计算3.1 Haar 特征3.2 Haar 特征值的计算3.3 积分图像3.4 基于积分图像加速计算 Haar 特…

MATLAB 如何以海森频率格子格纸的形式绘制频率分布曲线?

思路&#xff1a;将水文频率在海森格纸上对应的位置算出来&#xff0c;通过更改坐标轴标签制作海森频率格纸 先放参考链接&#xff1a; norminv 如何利用matlab在海森几率格纸上绘制图形 clc clear close all%% 随机生成径流系列&#xff0c;并计算对应频率 q randi(1000,…

Thymeleaf语法和流程控制,简单传值,each循环,if判断,switch.case使用

Thymeleaf怎么调用静态资源的看我之前发过的文章 这个首先在controller创建一个book的类&#xff0c;book的一些属性自己定义记得getsetyix Controller RequestMapping("/book") public class BookController {RequestMapping("/query")public String qu…

建立基于Open vSwitch的GRE隧道

建立基于Open vSwitch的GRE隧道 1. 环境的准备 图6-1 连接拓扑图 如图6-1所示为两台虚拟机连接拓扑图&#xff0c;两台虚拟机ens33网卡&#xff0c;通过虚拟交换机连接在一起&#xff0c;地址网段为30.0.0.0/24。在Docker主机ens33&#xff0c;IP地址为30.0.0.10/24&#xff…

从0到1接入钉钉消息通知

前段时间给项目接入监控告警&#xff0c;消息通知渠道选了钉钉。预算的原因内部办公刚从飞书转回钉钉&#xff0c;飞书消息通知之前就有一套了&#xff0c;测试钉钉从应用授权到消息测试花了不少时间。这里记录下从钉钉开放平台权限申请到消息接收全流程&#xff0c;给后面有同…

SAP-MM-采购申请字段解析

采购申请抬头以及行项目字段解析 1、采购申请类型&#xff1a; 对PR进行分类&#xff1b; 控制PR行项目的编号间隔&#xff1b; 控制PR编号范围&#xff0c;以及是否内/外部给号&#xff1b; 控制PR的屏幕选择格式&#xff1b; 控制PR是否允许凭证抬头审批&#xff0c;如果允…

mybatis-plus实现逻辑删除(详细!)

文章目录 什么是逻辑删除&#xff1f;为什么用到逻辑删除&#xff1f;在springboot使用Mybatis-Plus提供的逻辑删除1、在application.yml配置2、 实体类字段上加上TableLogic注解演示 什么是逻辑删除&#xff1f; 逻辑删除的本质是修改操作&#xff0c;并不是真正的删除&#…

2023/5/28周报

目录 摘要 论文阅读 1、标题和现存问题 2、使用GNN进行文本分类 3、INDUCT-GCN 4、实验准备 5、实验结果 深度学习 1、时空图的种类 2、图在环境中的应用 3、STGNN 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇InducT-GCN:归纳图卷积文本分类网络的论文。基…

AWVS使用手册

目录 AWVS基本操作 AWVS工具介绍 AWVS界面介绍 AWVS主要操作区域简介 AWVS的功能及特点的功能及特点 AWVS的菜单栏&#xff0c;工具栏简介 AWVS基本功能介绍 AWVS的蜘蛛爬虫功能 AWVS目标目标探测工具 AWVS的子域名探测工具 AWVS的的HTTP嗅探工具 AWVS的的HTTP模糊…

排序算法的时间复杂度、空间复杂度对比总结

参考&#xff1a;八大排序算法的稳定性和时间复杂度