SpringMvc框架详解

2023-11-06

目录

1.概念

2.作用

3.原理

4.使用Springmvc框架

4.1创建一个maven-web工程,并替换web.xml文件的内容

4.2引入springmvn所依赖的jar包

4.3将DpatcherServlet注册到配置文件中

4.4创建springmvc配置文件

4.5根据扫描包的地址,创建相应的包并在包中创建controller类

4.6启动服务器并访问映射路径,得到相应的页面和结果

5.springmvc的运行流程

6.传递和接受参数的方法

6.1传递和接收少量的参数

 6.1.2传递和接收大量参数(例如表单提交的一些数据)

7.处理静态资源(例如 css,img,html等等)

8.将controller层的数据在页面回显的方式

8.1使用request保存数据并在页面使用el表达式获取

8.2使用Model保存数据在页面使用el表达式获取(作用域与request相同)

8.3使用session保存数据在页面使用el表达式获取

8.4使用@SessionAttributes注解将Model的作用域变为session

 9.使用重定向跳转

10.springmvc返回json数据

10.1导入所依赖的jar包

10.2加入ResponseBody注解

 11.springmvc全局异常处理类

 11.1作用

 11.2使用

12.springmvc拦截器

 12.1使用


1.概念

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。

2.作用

springMVC它是spring框架的一个分支,该springMVC框架主要完成的功能是:==接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示== 可以把它理解为和Servlet干的工作是一样的。

3.原理

4.使用Springmvc框架

4.1创建一个maven-web工程,并替换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>

原因:原来的配置文件版本过低,建议使用4.0版本

4.2引入springmvn所依赖的jar包

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

4.3将DpatcherServlet注册到配置文件中

<?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-name>DispactherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--默认DispactherServlet加载的springmvc配置文件:WEB-INF/[servlet-name]-servlet.xml
        我们可以指定加载配置文件
         -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--classpath:表示编译后的路径-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispactherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app

4.4创建springmvc配置文件

 将包扫描的配置写在其中

<?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"
       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">
    <!--包扫描-->
    <context:component-scan base-package="com.pgx.controller"/>

</beans>

4.5根据扫描包的地址,创建相应的包并在包中创建controller类

@Controller //该注解标记该类为处理层类---类似@WebServlet
public class HelloController {

    @RequestMapping(value = "/hello01") //把请求路径映射到该方法上。
    public String hello01(){
        System.out.println("业务处理");

        return "hello01.jsp"; //响应一个页面
    }
}

4.6启动服务器并访问映射路径,得到相应的页面和结果

http://localhost:8080/sprinmvc02_war/hello

5.springmvc的运行流程

 *     1. 客户端发生请求http://localhost:8080/sprinmvc02_war/hello
 *     2. 来到tomcat服务器。
 *     3. springmvc的前端控制器DipatcherServlet接受所有的请求。
 *     4. 查看你的请求地址和哪个@RequestMaping匹配。
 *     5. 执行对应的方法。方法会返回一个字符串。springmvc把该字符串解析为要转发的网页。
 *     6. 把该字符串经过视图解析器拼接。
 *     7. 拿到拼接的地址,找到对应的网页。
 *     8. 渲染该网页给客户

6.传递和接受参数的方法

6.1传递和接收少量的参数

 6.1.2传递和接收大量参数(例如表单提交的一些数据)

 特殊参数:日期类,springmvc框架不会帮我们直接解析

 处理方式:

1).为日期类加入日期处理类的注解

 2).在springmvc配置中启动注解驱动

 问题:接受参数时将其打印如果传递的是中文会出现中文乱码问题

 解决方法:添加编码过滤器(可以自定义,也可以使用该框架自带的),这里使用自带的过滤器

 1).直接将过滤器注册到web.xml配置文件中即可。

7.处理静态资源(例如 css,img,html等等)

问题:当我们在页面上引入图片时,其实也是一种请求,会被DispatcherSerlvet拦截,并且无法找到对应的@RequestMaping配置路径,所以无法放行。

解决:在springmvc配置文件中设置放行即可

8.将controller层的数据在页面回显的方式

8.1使用request保存数据并在页面使用el表达式获取

 @RequestMapping(value = "list01")
    public String list01(HttpServletRequest request){
        Student student = new Student("张三",0,new Date());

        request.setAttribute("stu",student);

        return "msg.jsp";
    }

8.2使用Model保存数据在页面使用el表达式获取(作用域与request相同)

  @RequestMapping(value = "list02")
    public String list02(Model model){
        Student student = new Student("李四",0,new Date());
        model.addAttribute("stu",student);

        return "msg.jsp";
    }

8.3使用session保存数据在页面使用el表达式获取

  @RequestMapping(value = "list03")
    public String list03(HttpSession session){
        Student student = new Student("李四",0,new Date());
        session.setAttribute("stu",student);

        return "msg.jsp";
    }

8.4使用@SessionAttributes注解将Model的作用域变为session

 9.使用重定向跳转

 @RequestMapping("list5")
    public String list5(){
        System.out.println("!!!!!!!!!!!!!!!!!");
        return "redirect:list.jsp"; //当springmvc看到你返回的字符串钟含有redirect:时 它认为你要进行重定向跳转
    }

10.springmvc返回json数据

10.1导入所依赖的jar包

 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.2.2</version>
    </dependency>

10.2加入ResponseBody注解

@Controller
//将java对象转为json对象的注解
@ResponseBody
public class controller02 {
    @RequestMapping(value = "list05")
    public List<Student> list05(){
        List<Student> list = new ArrayList<Student>();
        list.add(new Student("张三",1,new Date()));
        list.add(new Student("李四",0,new Date()));
        list.add(new Student("王五",0,new Date()));

        return list;
    }
 }

结果:

 发现:返回的日期对象为是1970年至填写的日期之间的毫秒数,将其转为yyyy-MM-dd格式

加入Jsonformat注解

 11.springmvc全局异常处理类

 11.1作用

     当controller发生异常,则有全局异常类来处理并执行相应的处理方法。

 11.2使用

1).创建一个异常处理类

//标记为异常处理类
@ControllerAdvice
public class MyExceptionHandler {
    //标记异常类型
    @ExceptionHandler(value = Exception.class)
    public String exception(){
        return "error.jsp";
    }
}

2).保证springmvc.xml中扫描包能够扫描到该类

 3).如果是ajax请求时出现异常,返回json数据(这里使用Map容器)

//标记为异常处理类
@ControllerAdvice
@ResponseBody
public class MyExceptionHandler {
    //标记异常类型
    @ExceptionHandler(value = Exception.class)
    public Map exception(){
        Map map = new HashMap();
        map.put("code",5000);
        map.put("msg","出错了");
        map.put("data",null);
        return map;
    }
}

12.springmvc拦截器

拦截器只会拦截controller层的资源路径

 12.1使用

1).创建一个类,并实现HandlerInterceptor接口并重写接口的preHandle方法

public class MyInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //该方法中可写放行的条件
        //表示放行,返回false表示拦截
        return true;
    }
}

2).将拦截器注册到springmvc.xml配置文件中

<!--拦截器的配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--mapping:哪些路径需要经过拦截器
               /**: 表示n层路径
               /*:表示一层路径
                -->
            <mvc:mapping path="/**"/>
            <!--exclude-mapping:设置不经过该拦截的路径-->
            <mvc:exclude-mapping path="/list2"/>
            <mvc:exclude-mapping path="/list3"/>
            <!--bean表示你自定义的拦截器类路径-->
            <bean class="com.ykq.interceptor.MyInterceptor"/>
        </mvc:interceptor>
</mvc:interceptors>

13.文件上传到本地服务器

13.1导入文件上传所依赖的jar包

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>

13.2创建一个表单提交页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <%--
      method: 提交方式 文件上传必须为post提交。
      enctype:默认application/x-www-form-urlencoded 表示提交表单数据
              multipart/form-data:可以包含文件数据

      input的类型必须为file类型,而且必须有name属性
   --%>
   <form method="post" action="upload01" enctype="multipart/form-data">
       <input type="file" name="myfile"/>
   </form>
</body>
</html>

 13.3.在springmvc中配置文件解析器

   <!--
     id的名称必须叫multipartResolver
     -->
     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <!--这里的单位为字节10M*1024K*1024-->
          <property name="maxUploadSize" value="10485760"/>
     </bean>

13.4在controller层编写文件上传的实现接口

    //注意:MultipartFile 参数名必须和<input type="file" name="myfile"/>中name属性相同
    @RequestMapping("/upload01")
    public String upload01(MultipartFile myfile, HttpServletRequest request) throws Exception{

        //(1)得到本地服务目录的地址
        String path = request.getSession().getServletContext().getRealPath("upload");
        //(2)判断该目录是否存在
        File file=new File(path);
        if(!file.exists()){
             file.mkdirs();
        }
        //(3)//把myfile保存到本地服务中某个文件夹下。
        //生成文件名
        String filename= UUID.randomUUID().toString().replace("-","")+myfile.getOriginalFilename();
        File target=new File(path+"/"+filename);
        myfile.transferTo(target); //把myfile转移到目标目录下
        return "";
    }

14.使用elementui+Vue完成文件上传

14.1页面布局

<%--
  Created by IntelliJ IDEA.
  User: ykq
  Date: 2022/6/9
  Time: 15:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <!--引入element得css样式-->
    <link type="text/css" rel="stylesheet" href="css/index.css"/>
    <!--引入vue得js文件 这个必须在element之前引入-->
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript" src="js/qs.min.js"></script>
    <script type="text/javascript" src="js/axios.min.js"></script>
    <!--element得js文件-->
    <script type="text/javascript" src="js/index.js"></script>
</head>
<body>
    <div id="app">
        <%--action:文件上传的路径--%>
        <el-upload
                class="avatar-uploader"
                action="/upload02"
                :show-file-list="false"
                :on-success="handleAvatarSuccess"
                :before-upload="beforeAvatarUpload">
            <img v-if="imageUrl" :src="imageUrl" class="avatar">
            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
        </el-upload>
    </div>
</body>
<script>
     var app=new Vue({
           el:"#app",
           data:{
               imageUrl:"",
           },
           methods:{
               //上传成功后触发的方法
               handleAvatarSuccess(res, file) {
                   this.imageUrl=res.data;
               },
               //上传前触发的方法
               beforeAvatarUpload(file) {
                   const isJPG = file.type === 'image/jpeg';
                   const isPNG = file.type === 'image/png';
                   const isLt2M = file.size / 1024 / 1024 < 2;
                   if (!isJPG) {
                       this.$message.error('上传头像图片只能是 JPG 格式!');
                   }
                   if (!isLt2M) {
                       this.$message.error('上传头像图片大小不能超过 2MB!');
                   }
                   return isJPG && isLt2M;
               }
           }
     })
</script>

<style>
    .avatar-uploader .el-upload {
        border: 1px dashed #d9d9d9;
        border-radius: 6px;
        cursor: pointer;
        position: relative;
        overflow: hidden;
    }
    .avatar-uploader .el-upload:hover {
        border-color: #409EFF;
    }
    .avatar-uploader-icon {
        font-size: 28px;
        color: #8c939d;
        width: 178px;
        height: 178px;
        line-height: 178px;
        text-align: center;
    }
    .avatar {
        width: 178px;
        height: 178px;
        display: block;
    }
</style>
</html>

14.2后端接口

   @RequestMapping("/upload02")
    @ResponseBody
    public Map upload02(MultipartFile file, HttpServletRequest request) {
        try {
            //1.获取上传到服务器的文件夹路径
            String path = request.getSession().getServletContext().getRealPath("upload");
            File file1 = new File(path);
            //判断指定的目录是否存在
            if (!file1.exists()) {
                file1.mkdirs();
            }
            //设置上传后的文件名称
            String filename = UUID.randomUUID().toString().replace("-", "") + file.getOriginalFilename();
            File target = new File(path+"/"+filename);
            file.transferTo(target);
            Map map=new HashMap();
            map.put("code",2000);
            map.put("msg","上传成功");
            //通过访问服务器地址来访问图片.
            map.put("data","http://localhost:8080/upload/"+filename);
            return map;
        }catch (Exception e){
            e.printStackTrace();
        }
        Map map=new HashMap();
        map.put("code",5000);
        map.put("msg","上传失败");
        return map;
    }

15.普通文件上传到阿里OSS服务器中

1).从OSS服务端拿到使用Java上传的代码(结合自己的账户信息修改),创建测试类进行测试

@RequestMapping("/upload03")
    public String upload03(MultipartFile myfile,HttpServletRequest request){
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-hangzhou.aliyuncs.com";

        //LTAI78XQAZq2s5Rv
        //qdyZxR0x4LoUpTVbuyvCGdcrhEyw7H
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI78XQAZq2s5Rv";
        String accessKeySecret = "qdyZxR0x4LoUpTVbuyvCGdcrhEyw7H";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "qy151";
        //你上传到oss后的名字 会根据日期帮你创建文件夹。
        Calendar calendar=Calendar.getInstance();
        String objectName =calendar.get(Calendar.YEAR)+"/"+(calendar.get(Calendar.MONTH)+1)+"/"+
                calendar.get(Calendar.DATE)+"/"+UUID.randomUUID().toString().replace("-","")+
                myfile.getOriginalFilename();

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            InputStream inputStream =myfile.getInputStream();
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (Exception oe) {

        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        //https://qy151.oss-cn-hangzhou.aliyuncs.com/2022/6/10/20d3d7e6b5bb455cb548675501f7270fgdnj.jpg
        String url="https://"+bucketName+"."+endpoint+"/"+objectName;
        request.setAttribute("imgUrl",url);
        return "success.jsp";
    }

2).将该方法封装到一个工具类中。

public class OSSUtils {

    public static String upload(MultipartFile myfile){
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-hangzhou.aliyuncs.com";

        //LTAI78XQAZq2s5Rv
        //qdyZxR0x4LoUpTVbuyvCGdcrhEyw7H
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "****";
        String accessKeySecret = "*****";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "qy151";
        //你上传到oss后的名字 会根据日期帮你创建文件夹。
        String objectName =fileName(myfile);
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            InputStream inputStream =myfile.getInputStream();
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (Exception oe) {

        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        //https://qy151.oss-cn-hangzhou.aliyuncs.com/2022/6/10/20d3d7e6b5bb455cb548675501f7270fgdnj.jpg
        String url="https://"+bucketName+"."+endpoint+"/"+objectName;
        return url;
    }

    //获取上传到oss后的名字
    private static String fileName(MultipartFile myfile){
        Calendar calendar=Calendar.getInstance();
        String name=calendar.get(Calendar.YEAR)+"/"+(calendar.get(Calendar.MONTH)+1)+"/"+
                calendar.get(Calendar.DATE)+"/"+ UUID.randomUUID().toString().replace("-","")+
                myfile.getOriginalFilename();

        return name;
    }
}

16.使用elementui+Vue发送异步请求上传文件

16.1页面布局

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <!--引入element得css样式-->
    <link type="text/css" rel="stylesheet" href="css/index.css"/>
    <!--引入vue得js文件 这个必须在element之前引入-->
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript" src="js/qs.min.js"></script>
    <script type="text/javascript" src="js/axios.min.js"></script>
    <!--element得js文件-->
    <script type="text/javascript" src="js/index.js"></script>
</head>
<body>
    <div id="app">
        <%--action:文件上传的路径--%>
        <el-upload
                class="avatar-uploader"
                action="/upload04"
                :show-file-list="false"
                :on-success="handleAvatarSuccess"
                :before-upload="beforeAvatarUpload">
            <img v-if="imageUrl" :src="imageUrl" class="avatar">
            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
        </el-upload>
    </div>
</body>
<script>
     var app=new Vue({
           el:"#app",
           data:{
               imageUrl:"",
           },
           methods:{
               //上传成功后触发的方法
               handleAvatarSuccess(res, file) {
                   this.imageUrl=res.data;
               },
               //上传前触发的方法
               beforeAvatarUpload(file) {
                   const isJPG = file.type === 'image/jpeg';
                   const isPNG = file.type === 'image/png';
                   const isLt2M = file.size / 1024 / 1024 < 2;
                   if (!isJPG) {
                       this.$message.error('上传头像图片只能是 JPG 格式!');
                   }
                   if (!isLt2M) {
                       this.$message.error('上传头像图片大小不能超过 2MB!');
                   }
                   return isJPG && isLt2M;
               }
           }
     })
</script>

<style>
    .avatar-uploader .el-upload {
        border: 1px dashed #d9d9d9;
        border-radius: 6px;
        cursor: pointer;
        position: relative;
        overflow: hidden;
    }
    .avatar-uploader .el-upload:hover {
        border-color: #409EFF;
    }
    .avatar-uploader-icon {
        font-size: 28px;
        color: #8c939d;
        width: 178px;
        height: 178px;
        line-height: 178px;
        text-align: center;
    }
    .avatar {
        width: 178px;
        height: 178px;
        display: block;
    }
</style>
</html>

16.2.后端接口
 

@RequestMapping("/upload04")
    @ResponseBody
    public Map upload04(MultipartFile file) {
        try {
            //调用封装到工具类中文件上传的方法,返回文件地址
            String url = OSSUtils.upload(file);
            Map map = new HashMap();
            map.put("code", 2000);
            map.put("msg", "上传成功");
            map.put("data", url);
            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        HashMap map = new HashMap();
        map.put("code", 5000);
        map.put("msg", "上传失败");
        return map;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMvc框架详解 的相关文章

随机推荐

  • C/C++ cmake教程

    通过编写CMakeLists txt 然后运行cmake命令可以自动生成对应Makefile 从而控制make的编译过程 因此在学习cmake之前 建议先对make有个大致的了解 1 单个源文件的编译 如果你的项目只有一个源文件main c
  • 《一周搞定模电》-二极管

    一周搞定模电 二极管 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一周搞定模电 二极管 前言 一 什么是二极管 二 稳压二极管 整流二极管 开关二极管 前言 提示 这里可以添加本文要记录的大概内容 为找工作
  • 怎么排列html的顺序,css样式优先级及层叠的顺序排序探讨

    一般情况下 1位重要标志位 gt 4位特殊性标志 gt 声明先后顺序 important gt id gt class gt tag 使用 important可以改变优先级别为最高 其次是style对象 然后是id gt class gt
  • mysql:insert并发问题(on DUPLICATE KEY UPDATE)

    目录 一 insert 存在则更新 不存在则新增 1 表结构如下 2 sql语句 3 批量插入 某一条记录存在 则更新 其余进行新增 二 insert 存在则不进行任何操作 不存在则新增 1 sql语句 三 总结 小编最近在项目中 遇到了一
  • 你不知道的JavaScript---------语法

    目录 语句和表达式 语句的结果值 表达式的 副作用 上下文规则 标签语句 不推荐使用 代码块 对象结构 else if和可选代码块 在js中运算符有优先级 在js中的短路运算 函数参数 参数默认值 arguments 剩余参数 剩余参数和
  • 0基础小白入门SRC漏洞挖掘的正确姿势

    前言 有不少阅读过我文章的伙伴都知道 我从事网络安全行业已经好几年 积累了丰富的经验和技能 在这段时间里 我参与了多个实际项目的规划和实施 成功防范了各种网络攻击和漏洞利用 提高了安全防护水平 也有很多小伙伴私信问我怎么学 怎么挖漏洞 怎么
  • 安装mlxtend_python机器学习包mlxtend的安装和配置详解

    今天看到了mlxtend的包 看了下example集成得非常简洁 还有一个吸引我的地方是自带了一些data直接可以用 省去了自己造数据或者找数据的处理过程 所以决定安装体验一下 依赖环境 首先 sudo pip install mlxten
  • 若依图片上传到服务器,前端显示图片

    效果图如下 前端代码 table显示图片
  • Java中的多态理解之向上转型和向下转型(一)

    多态 Java中的多态可以用一句话来概括 父类引用指向子类对象 从这句话可以看出 有三个关键的点 父类引用 指向关系 子类对象 在理解这句话之前 我们先来学习两个概念 向上转型和向下转型 注意 无论是向上转型还是向下转型 两个类之间都必须要
  • Andriod Studio EditText 输入框 美化

    对输入框实现以下美化 该显示的结构为 LinearLayout 内部加一个 EditText 图中外部轮廓是LinearLayout 的样式 LinearLayout 部分 在要操作页面的 Design 页面添加一个大小合适的 Linear
  • vue中添加在标签上增加动态属性

  • 使用python进行数据分析

    1 数据分析步骤 数据分析五个步骤 数据分析步骤 提出问题 提出一个好问题 是成功的一半 面对一堆数据 同样也需要提出问题 这样才能为后面的具体步骤找到方向和侧重点 如某游戏公司想找一位明星为其新开发的游戏进行代言 明星那么多 如何才能话最
  • Vue中使用富文本ueditor

    Vue中使用富文本ueditor解决图片上传问题 学习新内容可能少不了官方文档 目前使用的是 vue ueditor wrap 组件它对ueditor进行了二次封装 集成秀米等第三方插件也方便 https hc199421 gitee io
  • jdk-8u191-linux-x64.tar.gz ,ftp上传服务器解压安装

    官网下载jdk ftp上传服务器解压安装 1 进入 Oracle 官方网站 下载合适的 JDK 版本 准备安装 注意 这里需要下载 Linux 版本 这里以jdk 8u191 linux x64 tar gz为例 你下载的文件可能不是这个版
  • CAN 帧简介

    1 数据帧 数据帧的构成 下图中的D为显性电平 R为隐性电平 数据帧是由7个段构成 其各个段的含义如下 1 帧起始 表示数据帧开始的帧 SOF由1位显性位组成 2 仲裁段 表示该帧优先级的段 标准数据帧与扩展数据帧在此段不同 标准数据帧的仲
  • 爬取csdn的个人博客

    爬取csdn的个人博客 全文构思 本文使用账号密码进行登录 所用到的环境安装 sudo pip3 install selenium sudo pip3 install pyperclip 除此之外使用了chrome的浏览器 需要下载驱动 自
  • 俩个数组对比去重

    俩个数组去重 键值对类型的 var arr id 1 value 1 id 2 value 2 id 3 value 3 var arr1 id 1 value 1 id 4 value 4 id 5 value 5 带键值对的用 for
  • 时间序列预测算法

    图片参考博客 时间序列 时间序列预测算法总结 https zhuanlan zhihu com p 421710621 ARIMA Holt Winters Prophet算法 Facebook时间序列预测算法Prophet的研究 http
  • 微信小程序扫描普通二维码跳转到小程序指定页面

    这个功能的逻辑是什么呢 二维码就相当于是一个链接 相当于我们点击一个链接跳转到另一个页面 只不过这里是扫码的形式 如何操作 1 首先我们需要在微信公众平台的开发管理 gt 开发设置 找到 扫普通链接二维码打开小程序 点击添加 会出现下面的页
  • SpringMvc框架详解

    目录 1 概念 2 作用 3 原理 4 使用Springmvc框架 4 1创建一个maven web工程 并替换web xml文件的内容 4 2引入springmvn所依赖的jar包 4 3将DpatcherServlet注册到配置文件中