SSM项目搭建保姆级教程

news2024/11/17 13:44:41

文章目录

  • 1、什么是SSM框架
    • 1.1、持久层
    • 1.2、业务层
    • 1.3、表现层
    • 1.4、View层
    • 1.5、SpringMVC执行流程
    • 1.6、MyBatis
  • 2、SSM实战搭建
    • 2.1、创建工程
    • 2.2、添加依赖
    • 2.3、配置spring.xml文件
    • 2.4、配置web.xml文件
    • 2.5、log4j.properties
    • 2.6、准备表
    • 2.7、实体类
    • 2.8、mapper
    • 2.9、service
    • 2.10、controller
    • 2.11、前端页面
      • 1、index.html
      • 2、addUser.jsp
      • 3、queryUser.jsp
      • 4、success.jsp和fail.jsp
    • 2.12、项目结构
    • 2.13、部署
      • 1、tomcat准备
      • 2、IDEA配置Tomcat
      • 3、运行
      • 4、Tomcat乱码问题

1、什么是SSM框架

  1. SSM框架是Spring、Spring MVC 和MyBatis框架的整合,是标准的MVC模式
  2. 标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层
  3. 使用spring实现业务对象管理,使用spring MVC负责请求的转发和视图管理,mybatis作为数据对象的持久化引擎

1.1、持久层

持久层,也就是我们常说的dao层或者mapper层

作用:主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此

  • Dao层首先设计的是接口,然后再Spring的配置文件中定义接口的实现类
  • 然后可以在模块中进行接口的调用来进行数据业务的处理(不在关心接口的实现类是哪个类)
  • 数据源的配置以及有关数据库连接的参数都在Spring的配置文件中进行配置

1.2、业务层

业务层,也就是我们常说的service层

作用:Service层主要负责业务模块的逻辑应用设计

  • 先设计接口然后再设计实类,然后再在Spring的配置文件中配置其实现的关联
  • 业务逻辑层的实现具体要调用到自己已经定义好的Dao的接口上,这样就可以在应用中调用Service接口来进行业务处理
  • 建立好Dao之后再建立service层,service层又要在controller层之下,因为既要调用Dao层的接口又要提供接口给controller层,每个模型都有一个service接口,每个接口分别封装各自的业务处理的方法

1.3、表现层

表现层,也就是我们常说的Controller层

作用:负责具体的业务模块流程的控制

  • 配置也同样是在Spring的配置文件里面进行
  • 调用Service层提供的接口来控制业务流程
  • 业务流程的不同会有不同的控制器,在具体的开发中可以将我们的流程进行抽象的归纳,设计出可以重复利用的子单元流程模块

1.4、View层

作用:主要和控制层紧密结合,主要负责前台jsp页面的表示

各层之间的关系:

image-20221228114700648

1.5、SpringMVC执行流程

复杂版:

1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
4、 DispatcherServlet调用HandlerAdapter处理器适配器
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
11、 DispatcherServlet响应用户

简单版:

1.客户端发送请求到DispacherServlet(分发器)
2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
3.Controller调用业务逻辑处理后,返回ModelAndView
4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
5.视图负责将结果显示到客户端

1.6、MyBatis

  • MyBatis是对jdbc的封装,它让数据库底层操作变的透明
  • MyBatis的操作都是围绕一个SqlSessionFactory实例展开的
  • MyBatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射
  • 在每次与数据库交互时,通过SqlSessionFactory拿到一个SqlSession,再执行sql命令
  • 所以,MyBatis的核心是SqlSession

2、SSM实战搭建

搭建思路如下:

image-20221229085956979

2.1、创建工程

image-20221228123037107

image-20221228123137046

image-20221228123228941

新建完成后工程目录结构如下:

image-20221228123430878

然后替换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_4_0.xsd"
         version="4.0">
</web-app>

2.2、添加依赖

在pom.xml中添加依赖,如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itsource</groupId>
    <artifactId>SSMTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>SSMTest Maven Webapp</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--spring-webmvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.15.RELEASE</version>
        </dependency>

        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>

        <!--mybatis和spring整合的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <!--druid连接池依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.1</version>
        </dependency>

        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

        <!--jackson java对象转换为json对象 @ResponseBody-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.2.2</version>
        </dependency>

        <!--servlet-api依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.15.RELEASE</version>
        </dependency>

        <!--sql日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.30</version>
        </dependency>
    </dependencies>

</project>

2.3、配置spring.xml文件

在main目录下,新建java和resources目录,如下:(如果有就不需要新建了)

image-20221228123823850

然后在resources目录下新建spring.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--包扫描-->
    <context:component-scan base-package="cn.itsource" />

    <!-- 声明视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!--静态资源放行-->
    <mvc:default-servlet-handler />
    <!-- 声明springmvc注解驱动 -->
    <mvc:annotation-driven />

    <!--数据源配置-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/ssmtest?serverTimezone=Asia/Shanghai"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <!--初始化连接数量:根据你项目的并发进行评估-->
        <!--最少连接池的个数-->
        <property name="minIdle" value="5"/>
        <!--初始的连接池的个数-->
        <property name="initialSize" value="5"/>
        <!--最大的连接个数-->
        <property name="maxActive" value="10"/>
        <!--超过的最大连接池个数,等待时间 单位是毫秒-->
        <property name="maxWait" value="3000"/>
    </bean>

    <bean id="sessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--设置数据源-->
        <property name="dataSource" ref="dataSource" />
        <!--设置mybatis映射文件的路径-->
        <property name="mapperLocations" value="classpath:mapper/*.xml" />
    </bean>

    <!--为dao接口生成代理实现类-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.itsource.dao" />
    </bean>

</beans>

2.4、配置web.xml文件

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_4_0.xsd"
         version="4.0">

    <!--servlet-->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 声明字符集过滤器 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

2.5、log4j.properties

在resources目录下新建log4j.properties文件,内容如下:

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

2.6、准备表

在本地MySQL服务器中新建数据库【ssmtest】,然后新建表【t_user】,建表语句如下:

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
  `age` int(3) NULL DEFAULT NULL COMMENT '年龄',
  `intro` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '个人简介',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_user_username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC;

2.7、实体类

package cn.itsource.entity;

import lombok.Data;

/**
 * <p>用户信息表对应实体类</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
@Data
public class User {

    private Long id;
    private String username;
    private String sex;
    private Integer age;
    private String intro;
}

2.8、mapper

在dao包下新建UserMapper类,代码:

package cn.itsource.dao;

import cn.itsource.entity.User;
import java.util.List;

/**
 * <p>UserMapper</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
public interface UserMapper {

    //保存用户信息到数据库
    int saveUser(User user);

    //查询数据库中所有用户信息
    List<User> selectAllUser();
}

在resources下的mapper文件夹中新建UserMapper.xml文件,代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itsource.dao.UserMapper">

    <!-- 使用 insert、update、delete、select 标签编写sql语句 -->

    <!--保存用户信息到数据库-->
    <insert id="saveUser">
        insert into t_user(username, sex, age, intro) values (#{username}, #{sex}, #{age}, #{intro})
    </insert>

    <!--查询所有用户信息-->
    <select id="selectAllUser" resultType="cn.itsource.entity.User">
        select id, username, sex, age, intro from t_user order by id desc
    </select>
</mapper>

2.9、service

在service包下新建UserService类:代码如下:

package cn.itsource.service;

import cn.itsource.entity.User;
import java.util.List;

/**
 * <p>UserService</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
public interface UserService {

    //保存用户信息到数据库
    int saveUser(User user);

    //查询数据库中所有用户信息
    List<User> selectAllUser();
}

然后在service包下新建impl包,其下新建UserServiceImpl类,代码如下:

package cn.itsource.service.impl;

import cn.itsource.dao.UserMapper;
import cn.itsource.entity.User;
import cn.itsource.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

/**
 * <p>UserServiceImpl</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
@Service
public class UserServiceImpl implements UserService {

    //注入 UserMapper 对象
    @Resource
    private UserMapper userMapper;

    @Override
    public int saveUser(User user) {
        return userMapper.saveUser(user);
    }

    @Override
    public List<User> selectAllUser() {
        return userMapper.selectAllUser();
    }
}

2.10、controller

在controller包下新建UserController类,代码如下:

package cn.itsource.controller;

import cn.itsource.entity.User;
import cn.itsource.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import java.util.List;

/**
 * <p>UserController</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    /**
     * 新增用户
     * @param user
     * @return
     */
    @PostMapping("/saveUser")
    public ModelAndView saveUser(User user){
        ModelAndView mv = new ModelAndView();
        int saveCount = userService.saveUser(user);
        if(saveCount > 0){
            mv.addObject("msg", "新增用户成功");
            mv.setViewName("success");
        }else{
            mv.addObject("msg", "新增用户失败");
            mv.setViewName("fail");
        }
        return mv;
    }

    /**
     * 查询所有用户信息
     * @param user
     * @return
     */
    @GetMapping("/selectAllUser")
    public List<User> selectAllUser(User user){
        List<User> userList = userService.selectAllUser();
        return userList;
    }
}

2.11、前端页面

1、index.html

首先改造webapp目录下的index.html文件,内容如下:

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<%
    String basePath=request.getScheme() + "://" + request.getServerName()
            + ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<html>
<head>
    <base href="<%=basePath%>">
    <title>SSM实战案例</title>
</head>
<body>
<div align="center">
    <p>SSM整合小案例</p>
    <table>
        <tr>
            <td><a href="addUser.jsp">注册用户</a></td>
            <td><br/></td>
            <td><a href="queryUser.jsp">查询用户</a></td>
        </tr>
    </table>
</div>
</body>
</html>

效果如下:

image-20221228143114725

2、addUser.jsp

在webapp目录下新建文件addUser.jsp,用来新增用户,代码如下:

<%@ page contentType="text/html;charset=utf-8" language="java"%>
<html>
<head>
    <title>注册用户</title>
</head>
<body>
<div align="center">
    <p>注册用户</p>
    <form action="user/saveUser" method="post">
        <table>
            <tr>
                <td>姓名:</td>
                <td><input type="text" name="username"></td>
            </tr>
            <tr>
                <td>年龄:</td>
                <td><input type="text" name="age"></td>
            </tr>
            <tr>
                <td>性别:</td>
                <td><input type="text" name="sex"></td>
            </tr>
            <tr>
                <td>简介:</td>
                <td><input type="text" name="intro"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="注册"></td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

效果如下:

image-20221228143042628

3、queryUser.jsp

在webapp目录下新建文件queryUser.jsp,用来查询所有用户,代码如下:

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<%
    String basePath=request.getScheme() + "://" + request.getServerName()
            + ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<html>
<head>
    <base href="<%=basePath%>">
    <title>查询学生</title>
    <%--<script type="text/javascript" src="js/jquery-3.6.0.js"></script>--%>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#myBtn").on("click",function () {
                $.ajax({
                    url: "user/selectAllUser",
                    dataType: "json",
                    success: function (resp) {
                        $("#userInfo").empty();
                        $.each(resp, function (i,n) {
                            $("#userInfo").append("<tr><td>" + n.id + "</td>" +
                                "<td>" + n.username + "</td>" +
                                "<td>" + n.age + "</td>" +
                                "<td>" + n.sex + "</td>" +
                                "<td>" + n.intro + "</td></tr>");
                        })
                    }
                })
            })
        })
    </script>
    <style>
        .tdStyle{
            width: 100px;
        }
    </style>
</head>
<body>
<div align="center">
    <p>用户列表 <button id="myBtn">获取用户信息</button></p>
    <table>
        <thead>
        <tr>
            <td class='tdStyle'>id</td>
            <td class='tdStyle'>姓名</td>
            <td class='tdStyle'>年龄</td>
            <td class='tdStyle'>性别</td>
            <td class='tdStyle'>简介</td>
        </tr>
        </thead>
        <tbody id="userInfo">
        </tbody>
    </table>
</div>
</body>
</html>

效果如下:

image-20221228143206573

4、success.jsp和fail.jsp

在webapp - WEB-INF目录下新建success.jsp和fail.jsp文件,内容分别如下:

success.jsp:

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
<h3>结果:${msg}</h3>
</body>
</html>

效果:

image-20221228143322002

fail.jsp:

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>fail</title>
</head>
<body>
<h3>结果:${msg}</h3>
</body>
</html>

2.12、项目结构

目前项目结构如下:

image-20221228143711302

2.13、部署

1、tomcat准备

本地部署到tomcat,首先需要你本地有tomcat服务器,下载地址:

链接:https://pan.baidu.com/s/1VpRboSME8R64yhXE4MwxiA

提取码:nr43

下载下来后,直接解压即可,如下:

image-20221228143542493

我这里使用的tomcat版本是:8.5.75

2、IDEA配置Tomcat

按照下面步骤一步一步做就可以在IDEA中配置好tomcat了

image-20221228143824954

image-20221228143909733

image-20221228144038540

image-20221228144206292

image-20221228144228706

image-20221228144249243

image-20221228144313541

然后开始部署:

image-20221228144421773

image-20221228144449980

image-20221228144529397

然后:

image-20221228144623293

就成这样了:

image-20221228144659317

3、运行

image-20221228144807680

image-20221228145017340

启动成功后,会自动打开页面,如下:

image-20221228145038065

到此,我们的SSM项目就部署完毕,可以正常使用了

4、Tomcat乱码问题

上面我们可以看到,Tomcat启动后,控制台打印的日志出现了乱码,按照下面方式做即可

打开tomcat安装目录下conf下的logging.properties文件:

image-20221228150624243

将该配置文件中的UTF-8全部改成GBK

然后再重启一下Tomcat,就会发现已经没有乱码了:

image-20221228150830314

如果按照上面设置后还没有好的话,就继续设置:

查看下IDEA的字集是不是UTF-8,确认一下,不是的话,改成UTF-8:

image-20221228145524466

打开IDEA的安装目录下的bin目录,打开里面的idea64.exe.vmoptions文件:

image-20221228145746705

添加内容:

-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8

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

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

相关文章

GuLi商城-SpringCloud-OpenFeign测试远程调用

1. Feign 简介 Feign 是一个声明式的 HTTP 客户端&#xff0c;它的目的就是让远程调用更加简单。Feign 提供了HTTP请 求的模板&#xff0c;通过编写简单的接口和插入注解&#xff0c;就可以定义好 HTTP 请求的参数、格式、地址等信 息。Feign 整合了 Ribbon&#xff08;负载…

操作系统 二(进程管理)

一、进程的定义及特征进程的定义由程序、数据、进程控制块三部分组成为了使程序可以并发执行&#xff0c;且可以对并发执行的程序加以描述和控制。不同角度的定义&#xff1a;进程是程序的一次执行&#xff1b;进程是一个程序及其数据在处理机上顺序执行时所发生的活动&#xf…

IDEA Maven Helper插件(详细使用教程)

一、引言 在写Java代码的时候&#xff0c;我们可能会出现Jar包的冲突的问题&#xff0c;这时候就需要我们去解决依赖冲突了&#xff0c;而解决依赖冲突就需要先找到是那些依赖发生了冲突&#xff0c;当项目比较小的时候&#xff0c;还比较依靠IEDA的【Diagrams】查看依赖关系&…

dom基本操作

1、style修改样式 基本语法&#xff1a; 元素.style.样式’值‘ 注意: 1.修改样式通过style属性引出 2.如果属性有-连接符&#xff0c;需要转换为小驼峰命名法 3.赋值的时候&#xff0c;需要的时候不要忘记加css单位 4.后面的值必须是字符串 <div></div> // 1、…

《Hadoop篇》------HDFS与MapReduce

目录 一、HDFS角色职责总结 二、CheckPoint机制 三、Mapreduce序列化 四、Mapper 4.1、官方介绍 4.2、Split计算 4.3、Split和block对应关系 4.4、启发式算法 五、MapTask整体的流程 六、压缩算法 6.1、压缩算法适用场景 6.2、压缩算法选择 6.2.1、Gzip压缩 6.2…

独家 | ChatGPT提高你日常工作的五个特点以及如何使用它来提高代码质量

翻译&#xff1a;陈超 校对&#xff1a;赵茹萱本文约3200字&#xff0c;建议阅读8分钟 本文介绍了ChatGPT提高日常工作的五个特点。ChatGPT已经完全改变了代码开发模式。然而&#xff0c;大多数软件开发者和数据专家们仍然不使用ChatGPT来完善——并简化他们的工作。这就是我们…

【Python】缺失值可视化工具库:missingno

文章目录一、前言二、下载二、使用介绍2.1 绘制缺失值条形图2.2 绘制缺失值热力图2.3 缺失值树状图三、参考资料一、前言 在我们进行机器学习或者深度学习的时候&#xff0c;我们经常会遇到需要处理数据集缺失值的情况&#xff0c;那么如何可视化数据集的缺失情况呢&#xff1…

MSR寄存器访问

1.介绍 MSR是CPU的一组64位寄存器&#xff0c;每个MSR都有它的地址值&#xff08;如下图所示&#xff09;&#xff0c;可以分别通过RDMSR 和WRMSR 两条指令进行读和写的操作。 如图中为8个P-state寄存器&#xff0c;地址分别为0xC001 0064 ~ 0xC001 006B&#xff0c;每个寄存…

FyListen 在 MVP 架构中的内存优化表现

FyListen 在 MVP 中的内存优化表现 本文只是分享个人开源框架的内存优化测试&#xff0c;你可以直接跳到最后&#xff0c;参考内存泄漏的分析过程&#xff01; 项目地址&#xff1a; https://github.com/StudyNoteOfTu/fylisten2-alpha1 由于使用到 AOP&#xff0c;所以直接…

【嵌入式开发】microcom安装与使用

microcom安装与使用1.安装2.使用3.用法4.测试三级目录1.安装 sudo apt-get install microcom -yQ&#xff1a;报错E: 在更改保留软件包的同时使用了 -y 选项&#xff0c;但没有搭配 --allow-change-held-packages. A&#xff1a;sudo apt-get install microcom -y --allow-cha…

软件测试面试复述,想知道你面试不过的原因吗?

最近有机会做一些面试工作&#xff0c;主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色&#xff0c;经历了不少次的面试之后&#xff0c;多少也积累一点面试的经验&#xff0c;现在发生了角色转变。初次的面试就碰到个工作年限比我长的&#xff0c;也没有时…

PowerShell Install Office 2021 Pro Plus Viso Professional

前言 微软Office在很长一段时间内都是最常用和最受欢迎的软件。从小型创业公司到大公司,它的使用比例相当。它可以很容易地从微软的官方网站下载。但是,微软只提供安装程序,而不提供完整的软件供下载。这些安装文件通常比较小。下载并运行后,安装的文件将从后端服务器安装M…

5.1配置IBGP和EBGP

5.2.1实验1&#xff1a;配置IBGP和EBGP 实验目的 熟悉IBGP和EBGP的应用场景掌握IBGP和EBGP的配置方法 实验拓扑 实验拓扑如图5-1所示&#xff1a; 图5-1&#xff1a;配置IBGP和EBGP 实验步骤 IP地址的配置 R1的配置 <Huawei>system-view Enter system view, return …

Python每日一练(20230218)

目录​​​​​​​ 1. 旋转图像 2. 解码方法 3. 二叉树最大路径和 1. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像…

[LeetCode 1237]找出给定方程的正整数解

题目描述 题目链接&#xff1a;[LeetCode 1237]找出给定方程的正整数解 给你一个函数 f(x, y) 和一个目标结果 z&#xff0c;函数公式未知&#xff0c;请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满足条件的结果数对可以按任意顺序返回。 尽管函数的具体式子未知…

Vue:@font-face引入外部字体

在项目开发中&#xff0c;我们经常会遇到想要优化字体font-family的问题&#xff0c;如下为默认字体样式&#xff0c;在大屏项目中看起来似乎有些呆板。 默认字体效果默认font属性尽管我们可以使用web安全字体&#xff0c;但是大多数场景下&#xff0c;例如&#xff1a;对于电子…

IOT2.5|第1章嵌入式系统概论|操作系统概述|嵌入式操作系统

目录 第1章&#xff1a; 嵌入式系统概论 1.嵌入式系统发展史 2.嵌入式系统定义* 3.嵌入式系统特点* 4.嵌入式处理器的特点 5.嵌入式处理分类 6.嵌入式系统的应用领域及嵌入式系统的发展趋势 第8章&#xff1a;Linux内核配置 1.内核概述 2.内核代码结构 第1章&#xf…

Linux内核CPU可运行进程队列的负载均衡

前面主要是学习进程的调度管理&#xff0c;默认都是在单CPU上的调度策略&#xff0c;在O(1)调度后&#xff0c;为了减小CPU之间的干扰&#xff0c;就会为每个CPU上分配一个任务队列&#xff0c;运行的时候可能会出现有的CPU很忙&#xff0c;有的CPU很闲&#xff0c;为了避免这个…

Vue:filters过滤器

日期、时间格式化是Vue前端项目中较为常遇到的一个需求点&#xff0c;此处&#xff0c;围绕Vue的过滤器来介绍如何更为优雅的解决此类需求。 过滤器filters使用注意点 Vue允许开发者自定义过滤器&#xff0c;可以实现一些常见的文本格式化等需求。 使用时要注意的点在于&#…

[软件工程导论(第六版)]第1章 软件工程学概述(复习笔记)

文章目录1.1 软件危机1.1.1 软件危机的介绍1.1.2 产生软件危机的原因1.1.3 消除软件危机的途径1.2 软件工程1.2.1 软件工程的介绍1.2.2 软件工程的基本原理1.2.3 软件工程方法学1.3 软件生命周期组成1.4 软件过程概念1.4.1 瀑布模型1.4.2 快速原型模型1.4.3 增量模型1.4.4 螺旋…