【JavaWeb】复习重点内容

news2024/9/23 13:30:05

在这里插入图片描述

✅✅作者主页:🔗孙不坚1208的博客
🔥🔥精选专栏:🔗JavaWeb从入门到精通(持续更新中)
📋📋 本文摘要:本篇文章主要分享JavaWeb的学习重点内容。

💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞
👉 👉你的一键三连是我更新的最大动力❤️❤️

JavaWeb复习重点

      • 一、问答题7个左右,共40分
        • 1.Servlet的定义、配置(使用xml或注解)
        • 2.重定向与请求转发的区别,使用API完成重定向和转发
        • 3.重定向与请求转发的优缺点
        • 4.给出了Servlet的代码实现,让大家用JSP来实现该功能
        • 5.JavaBean的规范,应该详细掌握
        • 6.给出了Servlet的代码实现,让大家用JSTL来实现该功能
        • 7.过滤器的概念,写出一个过滤器类
        • 8.JPA中实体类、以及实体关系映射,一对一、一对多
        • 9.Spring控制器的类的编写、路径的配置、注入组件、返回Json数据
      • 二、编程题4个题,共60分
        • 1.题目给出了数据库、表等信息,要求使用JDBC完成增删改查这些操作,可能需要事务
        • 2.编写Servlet接收请求参数,并保存到某个作用域
        • 3.JPA的编程题,题目给出数据库和表,让大家使用JPA完成实体类及使用EntityManager完成增删改查操作
        • 4.JSP+Servet+JavaBean开发模式完成系统功能

javaweb期末题型有2大类:问答题、编程题

一、问答题7个左右,共40分

1.Servlet的定义、配置(使用xml或注解)

Servlet是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。

Servlet的配置有xml和注解两种方式

xml方式:

<servlet>
	<servlet-name>demo1</servlet-name>
    <!--全类名-->
    <servlet-class>web.servlet.ServletDemo</servlet-class>
</servlet>
    
<servlet-mapping>
    <servlet-name>demo</servlet-name>
    <!--url访问的资源名-->
    <url-pattern>/index</url-pattern>
</servlet-mapping>

注解方式:在类上使用注解@WebServlet注解配置

@WebServlet("/demo")
public class ServletDemo implements Servlet {
    // 实现Servlet接口
}

2.重定向与请求转发的区别,使用API完成重定向和转发

重定向(Redirect)和请求转发(Forward)是两种不同的HTTP请求处理机制。

重定向是在接收到请求后,服务器向客户端返回一个特殊的响应,指示客户端重新向指定的url发送请求,这个过程是完全由客户端完成的,客户端会发送一个新的请求到指定的url,并接收新的响应。重定向经常被用来处理资源的移动,url的更改,或者是需要访问其他网站的情况。

请求转发则是在服务器端将请求转发给另一个资源进行处理,这个过程是在服务器内部完成的。客户端发送请求到服务器,服务器会将请求转发到另一个资源进行处理,然后将处理结果返回给客户端。请求转发经常被用来组合多个资源进行处理,例如在JSP中使用include指令将多个JSP页面组合在一起。

重定向:

response.sendRedirect("http://www.example.com");

转发:

RequestDispatcher dispatcher = request.getRequestDispatcher("/example.jsp");
dispatcher.forward(request, response);

在以上示例代码中,responserequestjavax.servlet.http.HttpServletResponsejavax.servlet.http.HttpServletRequest的实例对象。重定向通过调用sendRedirect()方法并传入要重定向到的URL字符串来实现。请求转发则通过创建一个RequestDispatcher对象,该对象通过getRequestDispatcher()方法获取,并传入要转发到的资源的路径,然后调用forward()方法来实现。在请求转发中,requestresponse对象被传递给了要转发到的资源。

需要注意的是,重定向会向客户端发送一个新的请求,因此客户端的URL会发生改变,而请求转发是在服务器内部完成的,客户端的URL不会改变。

3.重定向与请求转发的优缺点

重定向的优点:

  1. 简单易用:使用response.sendRedirect()方法非常简单,可以很容易地将客户端重定向到其他URL。
  2. 安全性高:重定向会向客户端发送一个新的请求,因此客户端的URL会发生改变,可以避免某些安全漏洞,比如在表单提交后刷新页面导致的重复提交等。

重定向的缺点:

  1. 频繁网络请求:重定向会向客户端发送一个新的请求,会导致网络请求的增加,影响性能。
  2. 无法访问原始请求对象:重定向会生成一个新的请求对象,因此无法访问原始请求对象,如原始的HTTP请求头等。

请求转发的优点:

  1. 性能高:请求转发是在服务器内部完成的,不会向客户端发送新的请求,因此不会增加网络请求,性能比较高。
  2. 可以访问原始请求对象:请求转发可以访问原始请求对象,如原始的HTTP请求头等。

请求转发的缺点:

  1. 不适用于跨域请求:由于请求转发只能转发到同一Web应用程序中的资源,因此不能用于跨域请求。
  2. 不支持修改URL:请求转发是在服务器内部完成的,客户端无法感知,也无法修改URL。

4.给出了Servlet的代码实现,让大家用JSP来实现该功能

这个参考课本

使用JSP实现重定向和请求转发的示例代码:

重定向:

<%
  response.sendRedirect("http://www.example.com");
%>

请求转发:

<jsp:forward page="/example.jsp" />

5.JavaBean的规范,应该详细掌握

JavaBean是一种符合Java语言规范的特殊类,通常用于存储和操作数据。JavaBean类应该遵循以下规范:

  1. 应该提供一个无参的构造方法:JavaBean的构造方法应该是无参的,这样可以方便地在其他类中创建JavaBean的实例。无参构造方法可以通过手动编写或者使用编译器自动生成的方式实现。
  2. 所有属性应该私有化:JavaBean的属性应该使用private修饰符进行私有化,通过提供公共的getter和setter方法来访问属性。
  3. getter和setter方法的命名应该符合JavaBean命名规范:JavaBean的getter和setter方法应该遵循一定的命名规范。getter方法的名称应该以“get”开头,setter方法的名称应该以“set”开头,后面跟着属性名的首字母大写的形式。
  4. 应该提供默认的toString方法:JavaBean应该提供一个默认的toString方法,以便在调试和日志记录时方便查看JavaBean的属性值。
  5. 应该提供其他有用的方法:除了getter和setter方法以外,JavaBean还可以提供一些其他的有用方法,例如校验方法、计算方法等。

6.给出了Servlet的代码实现,让大家用JSTL来实现该功能

这个参考课本

JSTL(JavaServer Pages Standard Tag Library)是一个标准的JSP标签库,提供了一些常用的标签,可以方便地实现一些常见的操作,包括重定向和转发。以下是使用JSTL实现重定向和转发的示例代码:

重定向:

<c:redirect url="http://www.example.com" />

以上代码中,<c:redirect>标签用于实现重定向,url属性指定要重定向到的URL字符串。

请求转发:

<c:forward page="/example.jsp" />

以上代码中,<c:forward>标签用于实现请求转发,page属性指定要转发到的JSP页面的路径。

7.过滤器的概念,写出一个过滤器类

过滤器(Filter)是Java Web应用程序中的一个重要组件,可以拦截客户端请求和服务器响应,对它们进行预处理和后处理,实现一些通用的功能,例如日志记录、权限控制、字符编码转换等。

一个过滤器类必须实现javax.servlet.Filter接口,并重写其中的doFilter()方法。以下是一个简单的过滤器类的示例代码,实现了字符编码转换的功能:

import javax.servlet.*;
import java.io.IOException;

@WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = "/*")
public class CharacterEncodingFilter implements Filter {
    private String encoding;

    public void init(FilterConfig config) throws ServletException {
        // 读取初始化参数,设置字符编码
        encoding = config.getInitParameter("encoding");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 设置请求和响应的字符编码
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);

        // 调用后续的过滤器或Servlet/JSP处理请求
        chain.doFilter(request, response);
    }

    public void destroy() {
        // 释放资源
    }
}

以上代码中,使用@WebFilter注解配置了过滤器的名称和URL模式。filterName属性指定过滤器的名称,urlPatterns属性指定需要过滤的URL模式。在此示例中,过滤器会拦截所有的请求。

以上代码中,CharacterEncodingFilter类实现了javax.servlet.Filter接口,并重写了其中的init()doFilter()destroy()方法。init()方法在过滤器初始化时被调用,读取初始化参数并设置字符编码;doFilter()方法用于实现过滤功能,设置请求和响应的字符编码,并调用后续的过滤器或Servlet/JSP处理请求;destroy()方法在过滤器销毁时被调用,释放资源。

需要注意的是,过滤器配置除了注解的这种方式也可以在Web应用程序的web.xml文件中,通过过滤器链(Filter Chain)的方式实现多个过滤器的协同工作。过滤器的顺序可以通过<filter-mapping>元素中的<url-pattern>子元素来指定。

8.JPA中实体类、以及实体关系映射,一对一、一对多

在 JPA 中,实体类是指映射到数据库表的 Java 类。实体类通常具有以下特点:

  1. 实体类使用 @Entity 注解进行标记。
  2. 实体类的每个实例对应数据库表中的一行数据。
  3. 实体类的属性对应数据库表中的列。

JPA 中的实体关系映射用于描述实体类之间的关联关系,包括一对一、一对多、多对一和多对多关系。其中,一对一和一对多是较为常见的关系类型。

一对一关系映射示例:

@Entity
public class Person {
    @Id
    private Long id;

    private String name;

    @OneToOne(cascade = CascadeType.ALL)
    private Address address;
}

@Entity
public class Address {
    @Id
    private Long id;

    private String street;

    private String city;

    private String country;

    @OneToOne(mappedBy = "address")
    private Person person;
}

上述代码中,PersonAddress 分别是两个实体类。它们之间的关系是一对一,通过 @OneToOne 注解进行映射。Person 实体类中的 address 属性使用 @OneToOne 注解,表示它与 Address 实体类是一对一关系。Address 实体类中的 person 属性也使用了 @OneToOne 注解,但是它的 mappedBy 属性指向了 Person 实体类的 address 属性,表示这是一个双向关联,并且由 Person 实体类来维护关系。

一对多关系映射示例:

@Entity
public class Department {
    @Id
    private Long id;

    private String name;

    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private List<Employee> employees;
}

@Entity
public class Employee {
    @Id
    private Long id;

    private String name;

    private String email;

    @ManyToOne
    private Department department;
}

上述代码中,DepartmentEmployee 分别是两个实体类。它们之间的关系是一对多,通过 @OneToMany@ManyToOne 注解进行映射。Department 实体类中的 employees 属性使用了 @OneToMany 注解,表示它与 Employee 实体类是一对多关系。Employee 实体类中的 department 属性使用了 @ManyToOne 注解,表示它与 Department 实体类是多对一关系,并且它的 department 属性指向了 Department 实体类的 employees 属性,表示这是一个双向关联,并且由 Department 实体类来维护关系。

需要注意的是,上述示例中使用了 JPA 中的级联操作(CascadeType.ALL),表示当父实体被删除时,子实体也将被删除。这种级联操作可能会对数据产生不可逆的影响,因此需要谨慎使用。

9.Spring控制器的类的编写、路径的配置、注入组件、返回Json数据

在 Spring 中,控制器是指负责处理请求和响应的组件,通常由一个 Java 类实现。以下是 Spring 控制器类的编写、路径配置、注入组件和返回 JSON 数据的示例:

@Controller
@RequestMapping("/api/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    @ResponseBody
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }
    
    @PostMapping("/")
    @ResponseBody
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
    
    @PutMapping("/{id}")
    @ResponseBody
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.updateUser(id, user);
    }
    
    @DeleteMapping("/{id}")
    @ResponseBody
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
    
}

在上述示例中,我们定义了一个名为 UserController 的控制器类,并使用 @Controller 注解标记它。@RequestMapping 注解用于配置控制器类的路径前缀,即 /api/users。这意味着,当请求的路径以 /api/users 开头时,Spring 将会把请求交给该控制器类来处理。

在控制器类中,我们使用了 @Autowired 注解来自动注入一个名为 userService 的组件。这里假设 UserService 是一个已经定义好的服务组件,可以使用 @Service 注解标记它。

控制器类中的方法使用了不同的 HTTP 方法注解,包括 @GetMapping@PostMapping@PutMapping@DeleteMapping,用于定义请求的 HTTP 方法类型。这些注解后面跟随的路径参数用于定义具体的请求路径。例如,@GetMapping("/{id}") 表示可以处理 /api/users/{id} 这样的 GET 请求。

在方法中,我们使用了 @ResponseBody 注解来表示将方法的返回值直接作为响应内容返回给客户端。这里,我们返回的是一个 User 类型的对象,Spring 会将它自动转换为 JSON 格式并返回给客户端。需要注意的是,为了能够让 Spring 自动完成 JSON 转换,我们需要在项目中引入相应的 JSON 库,例如 Jackson。

总的来说,Spring 控制器类提供了方便的方式来处理 HTTP 请求和响应,可以通过注解配置路径和 HTTP 方法,并且支持自动注入组件和返回 JSON 数据等常用功能。

二、编程题4个题,共60分

1.题目给出了数据库、表等信息,要求使用JDBC完成增删改查这些操作,可能需要事务

使用 JDBC 完成增删改查操作通常需要以下步骤:

  1. 加载数据库驱动。
  2. 建立数据库连接。
  3. 创建 Statement 或 PreparedStatement 对象。
  4. 执行 SQL 语句。
  5. 处理查询结果。
  6. 释放资源。

以下是一个使用 JDBC 实现增删改查操作的示例:

public class UserDao {
    
    private Connection conn;
    
    public UserDao(Connection conn) {
        this.conn = conn;
    }
    
    public void createUser(User user) throws SQLException {
        String sql = "INSERT INTO users(name, email, password) VALUES (?, ?, ?)";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setString(1, user.getName());
        stmt.setString(2, user.getEmail());
        stmt.setString(3, user.getPassword());
        stmt.executeUpdate();
        stmt.close();
    }
    
    public void updateUser(User user) throws SQLException {
        String sql = "UPDATE users SET name=?, email=?, password=? WHERE id=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setString(1, user.getName());
        stmt.setString(2, user.getEmail());
        stmt.setString(3, user.getPassword());
        stmt.setLong(4, user.getId());
        stmt.executeUpdate();
        stmt.close();
    }
    
    public void deleteUser(long id) throws SQLException {
        String sql = "DELETE FROM users WHERE id=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setLong(1, id);
        stmt.executeUpdate();
        stmt.close();
    }
    
    public User getUserById(long id) throws SQLException {
        String sql = "SELECT id, name, email, password FROM users WHERE id=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setLong(1, id);
        ResultSet rs = stmt.executeQuery();
        User user = null;
        if (rs.next()) {
            user = new User();
            user.setId(rs.getLong("id"));
            user.setName(rs.getString("name"));
            user.setEmail(rs.getString("email"));
            user.setPassword(rs.getString("password"));
        }
        rs.close();
        stmt.close();
        return user;
    }
    
}

上述代码中,我们定义了一个 UserDao 类,用于操作名为 users 的数据库表。其中的四个方法分别实现了创建用户、更新用户、删除用户和根据用户 ID 查询用户的功能。在这些方法中,我们使用了 PreparedStatement 对象来执行 SQL 语句,并通过设置占位符的方式传递参数。通过这种方式,可以有效避免 SQL 注入等安全问题。

如果需要使用事务,可以将上述方法放到一个事务中执行。以下是一个示例:

public void createUserWithTransaction(User user) throws SQLException {
    conn.setAutoCommit(false);
    try {
        createUser(user);
        conn.commit();
    } catch (SQLException e) {
        conn.rollback();
        throw e;
    } finally {
        conn.setAutoCommit(true);
    }
}

在这个方法中,我们通过将 autoCommit 属性设置为 false,来启用手动事务。在执行完所有操作后,我们可以选择提交或回滚事务。同时,为了保证代码的健壮性,需要在 finally 块中将 autoCommit 属性设置回 true

2.编写Servlet接收请求参数,并保存到某个作用域

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String email = request.getParameter("email");
        String password = request.getParameter("password");

        // 将参数保存到 session 作用域
        HttpSession session = request.getSession();
        session.setAttribute("name", name);
        session.setAttribute("email", email);
        session.setAttribute("password", password);

        // 将参数保存到 request 作用域
        request.setAttribute("name", name);
        request.setAttribute("email", email);
        request.setAttribute("password", password);

        // 将参数保存到 application 作用域
        ServletContext context = getServletContext();
        context.setAttribute("name", name);
        context.setAttribute("email", email);
        context.setAttribute("password", password);

        // 重定向到结果页面
        response.sendRedirect(request.getContextPath() + "/result.jsp");
    }

}

在上述代码中,我们在 doPost 方法中,分别将参数保存到 session、request 或 application 作用域中。在 session 中保存参数的方式与之前的示例类似,使用 request.getSession() 方法获取 HttpSession 对象,并调用其 setAttribute 方法将参数保存到 session 作用域中。

request 作用域中保存参数的方式也很类似,只需要使用 request.setAttribute 方法将参数保存到 request 作用域中即可。

application 作用域中保存参数也非常简单,只需要使用 getServletContext() 方法获取 ServletContext 对象,并调用其 setAttribute 方法将参数保存到 application 作用域中即可。

需要注意的是,在将参数保存到不同作用域中时,需要使用不同的对象来调用 setAttribute 方法。除此之外,其他代码与之前的示例相同,最终通过 response.sendRedirect 方法重定向到结果页面。

3.JPA的编程题,题目给出数据库和表,让大家使用JPA完成实体类及使用EntityManager完成增删改查操作

假设有一个表名为 user,包含以下字段:

FieldType
idINT
nameVARCHAR(100)
ageINT
emailVARCHAR(100)
passwordVARCHAR(100)

接下来,我们需要使用 JPA 完成实体类及使用 EntityManager 完成增删改查操作。

首先,我们需要定义一个实体类 User,对应 user 表中的一条记录:

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private Integer age;

    private String email;

    private String password;

    // getters and setters
}

在上述代码中,我们使用 @Entity 注解表示这是一个实体类,使用 @Table 注解指定了实体对应的表名为 user。同时,我们在类中定义了实体对应的属性,并使用 @Id@GeneratedValue 注解表示该属性为实体的唯一标识,并指定了该属性的生成策略为自增长。

接下来,我们可以使用 EntityManager 对实体进行增删改查操作。以下是一个示例:

public class UserDao {

    @PersistenceContext
    private EntityManager entityManager;

    // 添加用户
    public void addUser(User user) {
        entityManager.persist(user);
    }

    // 根据 id 查询用户
    public User getUserById(Integer id) {
        return entityManager.find(User.class, id);
    }

    // 更新用户信息
    public void updateUser(User user) {
        entityManager.merge(user);
    }

    // 根据 id 删除用户
    public void deleteUserById(Integer id) {
        User user = entityManager.find(User.class, id);
        entityManager.remove(user);
    }

}

在上述代码中,我们使用 @PersistenceContext 注解将 EntityManager 注入到 UserDao 类中。接着,我们定义了几个方法,分别用于添加、查询、更新和删除用户。

addUser 方法中,我们使用 EntityManagerpersist 方法将用户对象保存到数据库中。

getUserById 方法中,我们使用 EntityManagerfind 方法根据用户的唯一标识 id 查询用户信息,并将查询结果返回。

updateUser 方法中,我们使用 EntityManagermerge 方法将修改后的用户对象保存到数据库中。

deleteUserById 方法中,我们使用 EntityManagerremove 方法将根据用户的唯一标识 id 查询到的用户对象从数据库中删除。

需要注意的是,为了使用 EntityManager,我们需要将 JPA 的实现框架(如 Hibernate)配置到项目中,并在 persistence.xml 配置文件中配置数据源等信息。

4.JSP+Servet+JavaBean开发模式完成系统功能

JSP + Servlet + JavaBean 开发模式是一种经典的 Web 开发模式,它的核心是将前端页面(JSP)与后端业务逻辑(JavaBean)分离开来,通过 Servlet 充当中间层,完成两者之间的交互和协作。

以下是一个简单的示例:

1.首先,创建一个JavaBean来表示系统中的一个实体。例如,我们创建一个名为User的JavaBean来表示系统中的用户:

public class User {
    private String username;
    private String password;
    // getter and setter methods
}

2.接下来,创建一个Servlet来处理用户提交的数据。例如,我们创建一个名为LoginServlet的Servlet来处理用户登录请求:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        
        // 将User对象保存到Session作用域中
        request.getSession().setAttribute("user", user);
        
        // 转发到登录成功页面
        request.getRequestDispatcher("/success.jsp").forward(request, response);
    }
}

在Servlet中,我们首先获取用户提交的用户名和密码,然后创建一个User对象,并将其保存到Session作用域中。最后,我们使用请求转发将用户重定向到登录成功页面。

3.在Servlet中,我们首先获取用户提交的用户名和密码,然后创建一个User对象,并将其保存到Session作用域中。最后,我们使用请求转发将用户重定向到登录成功页面。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录成功</title>
</head>
<body>
    <h1>欢迎您,${user.username}!</h1>
</body>
</html>

在JSP页面中,我们使用EL表达式来显示用户登录成功后的信息,例如用户的用户名。

4.最后,我们可以在Web应用程序中部署和运行这个示例,访问/login路径,提交用户名和密码,然后会被重定向到success.jsp页面,页面中显示登录成功后的信息。

这就是使用JSP+Servlet+JavaBean开发模式完成系统功能的基本流程。开发人员可以根据具体的业务需求进行修改和扩展。

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

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

相关文章

C++11多线程编程 二:多线程通信,同步,锁

C11多线程编程 一&#xff1a;多线程概述 C11多线程编程 二&#xff1a;多线程通信&#xff0c;同步&#xff0c;锁 C11多线程编程 三&#xff1a;锁资源管理和条件变量 2.1 多线程的状态及其切换流程分析 线程状态说明&#xff1a; 初始化&#xff08;Init&#xff09;&am…

javaEE 初阶 — 网络层中 IP 协议 的报文结构

文章目录IP 协议报文4位版本号4位首部长度8位服务类型16位总长度&#xff08;字节数&#xff09;8位生存时间&#xff08;TTL&#xff09;与 8位协议16位首部校验和32位源 IP 地址与32位目标 IP 地址动态分配的 IP 地址NAT 网络地址转换IPv6IP 协议报文 4位版本号 这里的 IP 协…

图表示学习+对比学习入门必看:DGI

来源&#xff1a;投稿 作者&#xff1a;kon 编辑&#xff1a;学姐 前言 众所周知&#xff0c;火热的对比学习不仅在CV取得了很多成果&#xff0c;也在NLP、推荐等领域大放异彩。自然的&#xff0c;有人将对比学习引入了图表示学习领域&#xff0c;利用图本身的结构与结点自身的…

14.微服务SpringCloud

一、基本概念 Spring Cloud 被称为构建分布式微服务系统的“全家桶”&#xff0c;它并不是某一门技术&#xff0c;而是一系列微服务解决方案或框架的有序集合。它将市面上成熟的、经过验证的微服务框架整合起来&#xff0c;并通过 Spring Boot 的思想进行再封装&#xff0c;屏蔽…

【Servlet篇】Response对象详细解读

文章目录Response 继承体系Response 设置响应数据设置响应行数据设置响应头数据设置响应体数据Response 重定向Response 响应字符数据Response 响应字节数据Response 继承体系 前面说到&#xff0c;我们使用 Request 对象来获取请求数据&#xff0c;使用 Response 对象来设置响…

Pyinstaller 打包EXE(七) 百篇文章学PyQT

本文章是百篇文章学PyQT6的第七篇&#xff0c;本文讲述如何使用Pyinstaller打包UI界面和代码&#xff0c;将程序打包成EXE来更为方便的进行部署&#xff0c;在写博客和学习的过程中会遇到很多问题&#xff0c;例如&#xff1a;PyQT6在网上很多博客都是PyQT5、或者PyQT4大部分都…

Could not extract response: no suitable HttpMessageConverter

版本&#xff1a;spring-cloud-openfeign-core-2.1.1.RELEASE.jar&#xff0c;spring-webmvc-5.1.14.RELEASE.jar&#xff0c;jetty-server-9.4.41.v20210516.jar&#xff0c;tomcat-embed-core-9.0.48.jar 问题背景 生产服务请求下游服务时偶发抛出下面的异常&#xff0c;下…

git入门

目录 1. git简介 1.1 git是什么 1.2 git与svn的区别 2. github 2.1 创建仓库 2.2 删除仓库 2.3 新建文件及文件夹 3. git的基本操作 3.1 配置账户及邮箱 3.2 git文件状态与工作区域 3.3 常用命令 3.4 克隆&#xff08;clone&#xff09; 3.5 查看git仓库的状态 3.…

[音视频] BMP 图片格式分析

BMP 格式是什么 BMP&#xff08;Bitmap&#xff09;是一种常见的无损位图图像文件格式&#xff0c;是Windows操作系统中最早使用的图像格式之一&#xff0c;也是目前很多应用程序所使用的标准图像格式之一。 整体结构图&#xff0c;如下图所示 格式 BMP文件格式有多个版本&a…

QT中级(5)多线程读取一个文件,并在另一个文件夹中合成这个文件(1)

1 先实现一个简单程序 1.1 功能 用户可以输入一个源文件的路径和目标路径点击开始&#xff0c;程序启动读取和合成合成进度可见、合成步骤可见 1.2 思路 一个线程顺序读取文件&#xff0c;达到设定的缓存块就发给另一个合成线程&#xff0c;主线程用来进行数据传递、显示进…

电子技术——A类输出阶

电子技术——A类输出阶 因为射极跟随器具有较低的输出阻抗&#xff0c;射极跟随器是A类输出阶的典型代表。我们之前已经学习过射极跟随器的小信号模型&#xff0c;本节我们讨论其大信号模型。 传输特性 下图展示了一个射极跟随器的原理图&#xff1a; 其中 Q1Q_1Q1​ 为射极…

并发编程-学习总结(下)

目录 1、Future 1.1、Callable和Runnable的不同 1.2、Future的主要功能 1.3、常用方法 1.4、Future使用注意事项 1.5、CompletableFuture(旅游平台问题) 1.5.1、需求 1.5.2、解决方案1&#xff1a;串行 1.5.3、解决方案2&#xff1a;线程池 1.5.4、解决方案3&#xf…

Prometheus本地存储和VictoriaMetrics远端存储

文章目录Prometheus本地存储简介blockWAL本地存储配置参数VictoriaMetrics简介单机版部署使用安装VictoriaMetrics配置Prometheus使用Victoriametrics配置Grafana以Victoriametrics作为数据源集群版部署使用部署vmstorage部署vmselect部署vminsert配置Prometheus使用vminsert配…

LearnOpenGL-入门-你好,三角形

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网&#xff1a;https://learnopengl-cn.github.io/ 文章目录图形渲染管线基本介绍着色器…

文献计量三大定律之一---洛特卡定律及普赖斯定律

科学生产率是洛特卡定律的基础&#xff0c;科学生产率”(Scientific Productivity)&#xff09;是指科学家&#xff08;科研人员&#xff09;在科学上所表现出的能力和工作效率&#xff0c;通常用其生产的科学文献的数量来衡量。 1926年&#xff0c;洛特卡在一篇论文中提出了科…

Windows作为操作系统的典型特征和主要功能

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。我们每天都在用Windows操作系统&#xff0c;但是其实我们每天直接在打交道的并不是Windows操作系统的内核&#xff0c;而是Windows操作系统的…

Docker部署Springboot项目(含MySQL+Redis)

使用Docker部署之前写的一个博客项目&#xff0c;主要用到了MySQL和Redis&#xff0c;Redis作网站访问量统计。下面会对具体的部署方式作详细讲解 一、服务器安装Docker 1、删除docker旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \…

(三十五)大白话MySQL一个事务多次查询一条数据读到的都是不同的值,这就是不可重复读?

上一讲我们说完了多个事务并发执行时候&#xff0c;对MySQL的缓存页里的同一行数据同时进行更新或者查询的时候&#xff0c;可能发生的脏写和脏读的问题 我们也都理解了&#xff0c;之所以会发生脏写和脏读&#xff0c;最关键的&#xff0c;其实是因为你一个事务写或者查的是人…

黑盒测试的常用方法

这里我们先设置一个示例,后面的文章中会根据示例来进行讲解 假设有一个程序是判断一个整形数字是否属于1-100 目录 1.等价类法 2.边界值法 3.判定表法 4.场景设计法 5.错误猜测法 6.正交法 1.等价类法 概念:系统性的确定要输入的测试条件的方法可以看出概念非常抽象,那…

命令执行漏洞 | iwebsec

文章目录1 靶场环境2 命令执行漏洞介绍3 靶场练习01-命令执行漏洞02-命令执行漏洞空格绕过03-命令执行漏洞关键命令绕过04-命令执行漏洞通配符绕过05-命令执行漏洞base64编码绕过4 命令执行漏洞危害01-读写系统文件02-执行系统命令03-种植恶意木马04-反弹shellpython反弹shellp…