Servlet之RequestReponse 学习笔记

news2025/7/22 10:25:40

1 Request

1.1 Request继承关系

ServletRequest     Java提供的请求对象根接口
HttpServletRequest Java提供的对Http协议封装的请求对象接口
RequestFacade	   Tomcat定义的实现类
@WebServlet("/demo2")
public class Servlet2Demo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet req = " + req);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
    }
}

请求http://localhost:8080/tomcat-demo/demo2后,输出日志

doGet req = org.apache.catalina.connector.RequestFacade@1184683

所以继承关系为

RequestFacade extends HttpServletRequest extends ServletRequest

1.2 Request请求数据

1.2.1 获取请求行数据

@WebServlet("/demo2")
public class Servlet2Demo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        System.out.println("method = " + method);

        String path = req.getContextPath();
        System.out.println("path = " + path);

        StringBuffer url = req.getRequestURL();
        System.out.println("url = " + url);

        String uri = req.getRequestURI();
        System.out.println("uri = " + uri);

        String queryString = req.getQueryString();
        System.out.println("queryString = " + queryString);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
    }
}

请求地址: http://localhost:8080/tomcat-demo/demo2?username=zhangsan&pwd=123
输出结果

method = GET
path = /tomcat-demo
url = http://localhost:8080/tomcat-demo/demo2
uri = /tomcat-demo/demo2
queryString = username=zhangsan&pwd=123

1.2.2 获取请求头数据

代码示例

String agent = req.getHeader("user-agent");
System.out.println("agent = " + agent);

输出结果

agent = Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36

1.2.3 获取请求体数据

1 在webApp包下创建req.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/tomcat-demo/demo2" method="post">
        <input name="username"/>
        <input type="submit"/>
    </form>
</body>
</html>

2 在Servlet#doPost()方法中获取数据

@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader bufferedReader = req.getReader();
        String line = bufferedReader.readLine();
        System.out.println(line);
    }

}

3 启动服务,通过浏览器请求

http://localhost:8080/tomcat-demo/req.html

4 在html页面中输入内容后提交后,可看到日志输出

username=zhang&password=1123

1.2.4 获取请求参数的通用方式

1 doGet()和doPost()方法获取到的参数相同时

@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String result = req.getQueryString();
        System.out.println(result);//和doPost()方法的代码相同
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader bufferedReader = req.getReader();
        String line = bufferedReader.readLine();
        System.out.println(line);//和doGet()方法中的代码相同
    }

}

2 处理上述问题方式1
直接在doPost()方法中调用doGet()方法

 @WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String params = "";
        String method = req.getMethod();
        if ("GET".equals(method)) {
            params = req.getQueryString();
        } else if("POST".equals(method)) {
            BufferedReader reader = req.getReader();
            params = reader.readLine();
        }
        System.out.println(params);
        
    }

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

}

3 方式二
html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/tomcat-demo/req2" method="get">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="checkbox" name="hobby" value="1"> 跑步
        <input type="checkbox" name="hobby" value="2"> 骑车
        <input type="submit" >
    </form>
</body>
</html>

Servlet代码

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得所有参数
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            System.out.println("key ---> "  + key);
            String [] values = map.get(key);

            for (String value : values) {
                System.out.println("value ---> " + value);
            }

            System.out.println();
        }

        // 获得单个参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("单个参数值 username = " + username + ", password = " + password);

        //数组值
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby: hobbies) {
            System.out.println(hobby);
        }
    }

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

访问http://localhost:8080/tomcat-demo/req.html 后
日志输出

key ---> username
value ---> lisi

key ---> password
value ---> 432

key ---> hobby
value ---> 1
value ---> 2

单个参数值 username = lisi, password = 432
1
2

1.3 乱码问题

//=================乱码问题
        //post方式设置解码格式
//        req.setCharacterEncoding("UTF-8");

        //get/post设置解码格式
        username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
        System.out.println("username = " + username);

日志输出

单个参数值 username = å¼ ä¸‰, password = 321
1
2
username = 张三

1.3 请求转发

@WebServlet("/req3")
public class RequestDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("req3 doGet ---> ");
        req.setAttribute("key_req", "value from req3");

        //转发
        req.getRequestDispatcher("/req4").forward(req, resp);
    }

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

@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("req4 doGet ---> value = " + req.getAttribute("key_req"));
    }

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

访问http://localhost:8080/tomcat-demo/req3后
日志输出

req3 doGet ---> 
req4 doGet ---> value = value from req3

2 Response

2.1 Response设置响应数据

1 设置响应行

resp.setStatus(200);

2 设置响应头

resp.setHeader("Content-type", "text/json")

3 设置响应体

getWritter();
getOutPutStream();

2.2 Response请求重定向

定义两个Servlet

@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(302);
        resp.setHeader("location", "/tomcat-demo/resp2");
        System.out.println("Resp1 doGet() ");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(200);
        System.out.println("Resp2 doGet() ");
    }

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

请求地址
ocalhost:8080/tomcat-demo/resp1
日志打印

Resp1 doGet() 
Resp2 doGet() 

在这里插入图片描述

2.3 路径问题

重定向时

resp.setHeader("location", "/tomcat-demo/resp2");

转发时

req.getRequestDispatcher("/req4").forward(req, resp);

问题: 为什么转发是不需要加路径?
转发是相对于相对于服务端,重定向时相对于浏览器。

2.4 Response响应字符数据

@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html, charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.write("hello");
    }

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

在这里插入图片描述

2.5 Response响应字节数据

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //响应字节数据
    FileInputStream stream = new FileInputStream("/Users/yl/Desktop/image.png");
    ServletOutputStream os = resp.getOutputStream();
    byte[] buff = new byte[1024];
    int len = 0;
    while ((len = stream.read(buff)) != -1) {
        os.write(buff, 0, len);
    }
    stream.close();
}

在这里插入图片描述
使用工具类简化形式
添加依赖

<dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId>
     <version>2.6</version>
 </dependency>
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //响应字节数据
        FileInputStream stream = new FileInputStream("/Users/yl/Desktop/image.png");
        ServletOutputStream os = resp.getOutputStream();
        
        //简化方式
        IOUtils.copy(stream, os);
        stream.close();
    }

3 示例

3.1 登录示例

3.1.1 登录页面

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>

<body>
<div id="loginDiv">
    <form action="/tomcat-demo/loginServlet" id="form" method="post">
        <h1 id="loginMsg">LOGIN IN</h1>
        <p>Username:<input id="username" name="username" type="text"></p>

        <p>Password:<input id="password" name="password" type="password"></p>

        <div id="subDiv">
            <input type="submit" class="button" value="login up">
            <input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;
            <a href="register.html">没有账号?点击注册</a>
        </div>
    </form>
</div>
</body>
</html>

3.1.2 添加依赖

在pom中添加mysql和mybatis依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.5 </version>
</dependency>

3.1.3 mybatis-config.xml配置

在resources目录下添加mybatis-config.xml配置
文件内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <typeAliases>
        <package name="com.test"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--加载sql映射文件-->
        <package name="com.test.mapper"/>
    </mappers>


</configuration>

3.1.4 创建servlet实现类

@WebServlet(urlPatterns = "/loginServlet")
public class LoginServlet extends HttpServlet {
    private String TAG = getClass().getSimpleName();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(TAG + ": doGet() ---> ");
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user = userMapper.select(username, password);
        sqlSession.close();

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        if (user != null) {
            writer.write("登录成功");
        } else {
            writer.write("登录失败");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(TAG + ": doPost() ---> ");
        this.doGet(req, resp);
    }
}

3.1.5 添加mybatis查询语句

public interface UserMapper {
    @Select("select * from tb_user where username = #{username} and password= #{password}")
    User select(@Param("username") String username, @Param("password") String password);
}

3.1.6 mysql添加测试数据

//tb_user表
mysql> desc tb_user;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(20) | YES  |     | NULL    |                |
| password | varchar(20) | YES  |     | NULL    |                |
| gender   | char(1)     | YES  |     | NULL    |                |
| addr     | varchar(30) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

//添加测试数据
mysql> insert into tb_user(username, password) values('zhangsan', '123'), ('lisi', '125');
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

3.1.5 测试请求

请求地址: http://localhost:8080/tomcat-demo/login.html
当username与pwd输入正确的用户名和密码时,提示登录成功

3.2 注册示例

3.2.1 注册页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎注册</title>
</head>
<body>
<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="login.html">登录</a>
    </div>
    <form id="reg-form" action="/tomcat-demo/registerServlet" method="post">
        <table>
            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <input name="username" type="text" id="username">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                </td>
            </tr>
            <tr>
                <td>密码</td>
                <td class="inputs">
                    <input name="password" type="password" id="password">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>
        </table>
        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>
</div>
</body>
</html>

3.2.2 注册Servlet

@WebServlet(urlPatterns = "/registerServlet")
public class RegisterServlet extends HttpServlet {
    private String TAG = getClass().getSimpleName();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(TAG + ": doGet() ---> ");

        //请求数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        username = new String(username.getBytes("ISO-8859-1"), "UTF-8");

        User userRegister = new User();
        userRegister.setUsername(username);
        userRegister.setPassword(password);

        //创建UserMapper
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //查询本地user是否存在
        User user = userMapper.selectByUsername(username);
        resp.setContentType("text/html;charset=utf-8");
        if (user == null) {
            userMapper.add(userRegister);
            sqlSession.commit();
            sqlSession.close();
            resp.getWriter().write("注册成功!");
        } else {
            resp.getWriter().write("用户名已存在!");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(TAG + ": doPost() ---> ");
        this.doGet(req, resp);
    }
}

3.2.3 sql语句

public interface UserMapper {
    @Select("select * from tb_user where username = #{username} and password= #{password}")
    User select(@Param("username") String username, @Param("password") String password);

    @Insert("insert into tb_user values(null, #{username}, #{password}, null, null)")
    void add(User user);

    @Select("select * from tb_user where username = #{username}")
    User selectByUsername(String username);
}

3.2.4 测试请求

请求http://localhost:8080/tomcat-demo/register.html地址后
输入用户名和密码,当musql中不存在此用户名时,即可注册成功

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

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

相关文章

Vue 路由router的介绍以及使用方法

路由&#xff1a;简单来说类似于路由器&#xff0c;中转站。 1.理解: 一个路由&#xff08;route&#xff09;就是一组映射关系&#xff08;key - value&#xff09;&#xff0c;多个路由需要路由器&#xff08;router&#xff09;进行管理。 2.前端路由&#xff1a;key是路径&…

同源策略、跨域与JSONP

跨域与JSONP一、了解同源策略和跨域1.1 同源策略1.2 跨域二、JSONP2.1 什么是JSONP2.2 JSONP的实现原理2.3 自己实现一个简单的JSONP2.4 JSONP的缺点2.5 jQuery中的JSONP2.6 自定义参数及回调函数名称2.7 jQuery中JSONP的实现过程三、案例-淘宝搜索一、了解同源策略和跨域 1.1…

软考考完了,如何评职称?

很多考生以为软考初级、中级、高级资格考试通过了就是相应的职称了&#xff0c;然而并不是这样的&#xff0c;通过了软考考试只是相当于有了评职称的资格&#xff0c;并不是有了相应职称。 有了软考证书是可以申请评职称的&#xff0c;因为有了软考证书就有了评职称的资格哦&a…

【前端】flet:一款(即将)支持多语言开发的UI库

文章目录介绍开发生态支持语言运行体验组件API热更新开发计划 Roadmap2022 7月-8月安全手机端桌面端Controls(控件)核心功能用户指引&#xff08;User education&#xff09;2022 9月到12月手机端控件&#xff08;Controls&#xff09;编程语言支持核心功能介绍 Flet enables …

【云原生 | Kubernetes 系列】--Gitops持续交付 CD Push Pipeline实现

1. Tekton Trigger基础 Tekton Triggers简介 - 监控特定的事件,并在满足条件时自动触发Tekton PipelineTekton Triggers 为用户提供了一种声明式API 它允许用户按需定义监视的事件,并将其与特定的Pipeline连接,从而实例化出PipelineRun还允许将事件中的某些属性值信息注入到P…

使用springboot每日推送早安问候语到用户微信

本文主要实现给不同的用户推动不同的问候模板 准备工作 申请微信公众平台的测试号 申请微信测试公众号 创建成功后&#xff0c;可以看到appid和appsecret&#xff0c;这个后面认证时需要 申请模板 可自行修改 今天是&#xff1a;{{now.DATA}} 不管那一天&#xff0c;每一天…

【科学文献计量】科学文献知识网络分析基础

科学文献知识网络分析基础 1 知识网络分析基础2 知识网络图构成2.1 简单网络图绘制2.2 完整网络图绘制3 知识网络图中的术语3.1 术语和统计量概念3.2 获取术语信息实例3.3 最大子群和网络图孤立点的识别3.4 网络图节点度信息的统计1 知识网络分析基础 从分析的角度来看,社会网…

安保公司的商业计划书

安保公司的商业计划书年轻人&#xff0c;来做保安吧&#xff0c;少走二十年弯路安保公司的商业计划书安保品牌公司的商业模式真正的路反潮流&#xff0c;不上大学去创业&#xff0c;其实反而是领先的。 工厂肯定不能创业的&#xff0c;因为打工的技能和创业的技能不同。 如果…

【附源码】计算机毕业设计JAVA茶园文化交流平台演示录像2020

【附源码】计算机毕业设计JAVA茶园文化交流平台演示录像2020 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1…

SpringBoot框架Mockito的使用

SpringBoot框架Mockito的使用 一、简介 mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 在具体的测试过程中&#xff0c;我们经常会碰到需要模拟数据或者接口的情况&#xff0c;因为环…

线性模型(穷举法实现)

参考视频&#xff1a;2.线性模型_哔哩哔哩_bilibili 参考视频中实现ywxywxywx 的代码&#xff0c;在加上偏置b后实现 ywxbywxbywxb 的线性模型 假设我们有这样一个线性模型&#xff1a;ywxbywxbywxb X和Y对应的数据如下 XY1.05.02.08.03.011.04.0&#xff1f; 预测值&#x…

开源知识付费APP代码分析

如今&#xff0c;传统的学校已经不能满足大众多元化的需求&#xff0c;各种教育培训机构落地生根。随着时间的推移&#xff0c;互联网与传统教育的结合也开拓了一种新的教育方式&#xff0c;这就是广为人知的知识付费。在线教育的突然崛起多半是因为疫情的“催化”&#xff0c;…

OceanBase 4.0 - 从分布式到单机,从单机到分布式

近些年国产化数据库如雨后春笋般冒出并遍地开花。据某技术平台不完全统计&#xff0c;国产化数据库&#xff08;见图 &#xff09;已达 200余个&#xff0c;对于这些数据库的名字&#xff0c;即使作为多年数据库从业者的我&#xff0c;也有很多是第一次听说。在这竞争激烈的数据…

FFplay文档解读-49-多媒体过滤器三

32.14 sendcmd, asendcmd 将命令发送到filtergraph中的过滤器。 这些过滤器读取要发送到filtergraph中其他过滤器的命令。 必须在两个视频滤镜之间插入sendcmd&#xff0c;必须在两个音频滤镜之间插入asendcmd&#xff0c;但除此之外&#xff0c;它们的行为方式相同。 可以…

[附源码]java毕业设计基于的高校学生考勤管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

vue中tinymce的使用

1.下载 npm i tinymce5.10.3 tinymce/tinymce-vue3.2.8 -S2.在node_modules中找到 &#xff08;我这里是vue2&#xff0c;vue3不是写在public下&#xff0c;具体的可以搜搜 看看&#xff09; 3.在public中新建 tinymce 文件夹 把三个文件复制进去 4.在components文件夹中新建…

Unity架构之详解域重新加载和场景重新加载

一、unity进入运行模式包括以下主要阶段 备份当前场景&#xff1a;这仅在场景被修改后发生。这样当退出运行模式时&#xff0c;Unity 将场景恢复为运行模式开始前的状态。Domain Reload&#xff1a;通过重新加载脚本域来重置脚本状态。Scene Reload&#xff1a;通过重新加载场…

h264编码算法流程

xh264编解码&#xff1a; 编码层&#xff1a;视频压缩解压缩等核心算法&#xff0c;VLC就是这一系列算法&#xff0c;得到的是编码后的比特序列&#xff0c;即VLC数据。 网络抽象层&#xff1a;将压缩后的原始码流拼接头信息用于解码时来识别&#xff0c;安排格式以方便后续的…

APT 注解处理器如何实现Lombok的常用注解功能?带你完整解析

1 背景 在开发中我们常常会用到类似 lombok 、mapstruct 或者 mybatisplus 的框架&#xff0c;只要加入几个注解即可生成对应的方法&#xff0c;既然被很多框架使用&#xff0c;了解其中的原理还是非常有必要的。 2 生成字节码原理 2.1 APT(Annotation Processing Tool )注解…

【论文笔记】用于几何匹配的卷积神经网络结构(CNN for Geometric Matching)

用于几何匹配的卷积神经网络结构(CNN for Geometric Matching) 文章目录AbstractCNNRelated WorkArchitecture for Geometric Matching特征提取&#xff1a;Matching Networkcorrelation-layer归一化&#xff1a;Regression NetworkGeometric TransformationsAffine Transforma…