[Java]SpringMVC 学习笔记(动力节点王鹤王妈妈2020)(五)

简介: [Java]SpringMVC 学习笔记(动力节点王鹤王妈妈2020)(五)

springmvc.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 http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  <!-- 控制器包扫描 -->
  <context:component-scan base-package="cw.springmvc.controller"/>
  <!-- 视图解析器 -->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/"/>
    <property name="suffix" value=".jsp"/>
  </bean>
  <!-- 异常处理组件扫描 -->
  <context:component-scan base-package="cw.springmvc.handler"/>
  <!-- 注解驱动器 -->
  <mvc:annotation-driven/>
</beans>

测试


拦截器

拦截器概述

  • 拦截器需要实现框架中的指定接口,HandlerInterceptor,实现这个接口的类都为拦截器
  • 拦截器的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。
  • 拦截器与过滤器类似,过滤器是用来过滤器请求参数,设置编码字符集等工作;拦截器是拦截用户的请求,做请求做判断处理的。
  • 拦截器的拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。
  • 拦截器是全局的,可以对多个Controller做拦截。 一个项目中可以有0个或多个拦截器, 他们在一起拦截用户的请求。
  • 拦截器常用在:用户登录处理,权限检查, 记录日志。
  • 拦截器的使用步骤:
  • 1.定义类实现HandlerInterceptor接口
  • 2.在springmvc配置文件中,声明拦截器, 让框架知道拦截器的存在。
  • 拦截器的执行时间:
  • 1)在请求处理之前, 也就是controller类中的方法执行之前先被拦截。
  • 2)在控制器方法执行之后也会执行拦截器。
  • 3)在请求处理完成后也会执行拦截器。

创建拦截器类

  • 自定义拦截器,需要实现HandlerInterceptor接口,然后根据需求实现HandlerInterceptor接口中的三个方法

拦截器类方法讲解

package cw.springmvc.handler;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * ClassName: MyInterceptor
 * Package: cw.springmvc.handler
 * Description:
 * 拦截器类,拦截用户的请求
 *
 * @Author tcw
 * @Create 2023-06-05 23:40
 * @Version 1.0
 */
public class MyInterceptor implements HandlerInterceptor{
    /**
     * preHandle 预处理方法
     * 该方法在控制器方法执行前执行,用户的请求会先到达此方法
     * 在该方法中可以获取请求的信息,验证请求信息是否符合要求
     * 可以验证用户是否登录, 验证用户是否有权限访问某个连接地址(url)。
     * 如果验证失败,可以截断请求,请求不能被处理;如果验证成功,可以放行请求,此时控制器方法才能执行。
     * 
     * 重要:是整个项目的入口,门户。 
     * 当preHandle返回true 请求可以被处理。
     * preHandle返回false,请求到此方法就截止。
     *
     * @param request
     * @param response
     * @param handler 被拦截的控制器对象
     * @return 布尔值
     *         true: 请求是通过了拦截器的验证,可以执行处理器方法。
     *         false: 请求没有通过拦截器的验证,请求到达拦截器就截止了。 请求没有被处理
     *                后面的方法:处理器方法、后处理方法、afterCompletion都不执行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
    /**
     * postHandle:后处理方法。
     * 在处理器方法之后执行的(MyController.doSome())
     * 能够获取到处理器方法的返回值ModelAndView,
     * 可以修改ModelAndView中的数据和视图,可以影响到最后的执行结果。
     * 主要是对原来的执行结果做二次修正
     *
     * @param request
     * @param response
     * @param handler 被拦截的处理器对象 Controller
     * @param modelAndView 处理器方法的返回值
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    /**
     * afterCompletion:最后执行的方法
     * 在请求处理完成后执行的。
     * 框架中规定是当你的视图处理完成后,对视图执行了forward。就认为请求处理完成。
     * 一般做资源回收工作的, 程序请求过程中创建了一些对象,在这里可以删除,把占用的内存回收。
     *
     * @param request
     * @param response
     * @param handler 被拦截器的处理器对象
     * @param ex 程序中发生的异常
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

拦截器图示

SpringMVC 配置文件中配置拦截器

<!-- 配置拦截器,拦截器可以配置0到多个 -->
<mvc:interceptors>
  <!-- 配置第一个拦截器 -->
  <mvc:interceptor>
    <!-- 
      指定拦截器拦截的URI地址
      可以使用通配符 
        ** 表示任意的字符,文件或者多级目录和目录中的文件
        /user/** 以user开头的请求地址都会被该拦截器拦截
        /** 该拦截器会拦截所有的请求
    -->
    <mvc:mapping path="/**"/>
    <!-- 需要进行拦截的地址,对应的拦截器对象 -->
    <bean class="cw.springmvc.handler.MyInterceptor"/>
  </mvc:interceptor>
</mvc:interceptors>

拦截器中方法编写

package cw.springmvc.handler;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * ClassName: MyInterceptor
 * Package: cw.springmvc.handler
 * Description:
 * 拦截器类,拦截用户的请求
 *
 * @Author tcw
 * @Create 2023-06-05 23:40
 * @Version 1.0
 */
public class MyInterceptor implements HandlerInterceptor{
    private long btime = 0; // 用于统计请求的处理时间
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器preHandle预处理方法执行...");
        btime = System.currentTimeMillis(); // 记录请求开始处理时间
        // 返回真,后面的方法才能执行
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器postHandle后处理方法执行...");
        // 原来的doSome执行结果需要调整,进行modelAndView修改。
        if( modelAndView != null){
            //修改数据
            // modelAndView.addObject("mydate",new Date());
            //修改视图
            modelAndView.setViewName("other");
        }
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器afterCompletion:最后执行的方法执行...");
        long etime = System.currentTimeMillis(); // 请求处理结束时间
        System.out.println("计算从preHandle到请求处理完成的时间:"+(etime - btime ));
    }
}

控制器

@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name, Integer age) throws MyUserException {
        System.out.println("控制器方法执行...");
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", name);
        mv.addObject("age", age);
        mv.setViewName("show");
        return mv;
    }
}

测试


拦截器执行流程图示

多个拦截器的执行顺序

  • 拦截器在配置文件中,先声明的会先执行,后声明的后执行,声明的若干个拦截器在框架中是使用ArrayList集合进行保存的,是按照声明的先后顺序放入到ArrayList集合中

多个拦截器代码实现

  • 拦截器1
package cw.springmvc.handler;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * ClassName: MyInterceptor
 * Package: cw.springmvc.handler
 * Description:
 * 拦截器类,拦截用户的请求
 *
 * @Author tcw
 * @Create 2023-06-05 23:40
 * @Version 1.0
 */
public class MyInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器-1-preHandle预处理方法执行...");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器-1-postHandle后处理方法执行...");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器-1-afterCompletion:最后执行的方法执行...");
    }
}
  • 拦截器2
package cw.springmvc.handler;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * ClassName: MyInterceptor
 * Package: cw.springmvc.handler
 * Description:
 * 拦截器类,拦截用户的请求
 *
 * @Author tcw
 * @Create 2023-06-05 23:40
 * @Version 1.0
 */
public class MyInterceptor2 implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器-2-preHandle预处理方法执行...");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器-2-postHandle后处理方法执行...");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器-2-afterCompletion:最后执行的方法执行...");
    }
}
  • 拦截器配置
<!-- 配置拦截器,拦截器可以配置0到多个 -->
<mvc:interceptors>
  <!-- 配置第一个拦截器 -->
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <bean class="cw.springmvc.handler.MyInterceptor"/>
  </mvc:interceptor>
  <!-- 配置第二个拦截器 -->
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <bean class="cw.springmvc.handler.MyInterceptor2"/>
  </mvc:interceptor>
</mvc:interceptors>

多个拦截器执行顺序图示


不同拦截器 preHandle 不同返回值分析

  • 只有当拦截器的方法preHandle返回true才可以向后执行,如果其中一个拦截器的preHandle方法返回值为false,那么请求会被拦截,不会被控制器方法处理,即只要有拦截器的preHandle方法返回值为false那么处理器方法就不会执行
  • 拦截器-1-preHandle返回true,拦截器-2-preHandle返回false
  • 拦截器-1-preHandle返回false,拦截器-2-preHandle返回true
  • 只要有一个 preHandle()方法返回 false,则上部的执行链将被断开,其后续的处理器方法与 postHandle()方法将无法执行。但,无论执行链执行情况怎样,只要方法栈中有方法,即执行链中只要有 preHandle()方法返回 true,就会执行方法栈中preHandle()方法返回 true相对应的afterCompletion()方法。最终都会给出响应。

拦截器和过滤器的区别

  1. 过滤器是servlet规范中的对象,拦截器是框架中自己定义的对象,拦截器局限于框架之中,离开了SpringMVC框架,拦截器就不能使用了
  2. 过滤器实现Filter接口的对象, 拦截器是实现HandlerInterceptor
  3. 过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。拦截器是用来验证请求的,能截断请求。
  4. 过滤器是在拦截器之前先执行的。
  5. 过滤器是tomcat服务器创建的对象。拦截器是springmvc容器中创建的对象
  6. 过滤器是一个执行时间点。拦截器有三个执行时间点
  7. 过滤器可以处理jsp,js,html等等。拦截器是侧重拦截对Controller的请求, 如果你的请求不能被DispatcherServlet接收, 这个请求不会执行拦截器内容
  8. 拦截器拦截普通类方法(控制器方法)执行,过滤器过滤servlet请求响应
  1. 控制器其实是普通的Java类,框架给了控制器能够处理请求的能力

拦截器案例:登录验证

  • 注意,前端控制器DispatcherServlet的路径配置,不同的路径配置将会影响到对jsp页面的请求是否会交给DispatcherServlet处理,/DispatcherServlet不会处理jsp页面的请求,/*DispatcherServlet会处理jsp页面的请求,*.doDispatcherServlet不会处理jsp页面的请求

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="./login" method="post">
    username:<input type="text" name="username"><br/>
    <input type="submit" name="submit"><br/>
</form>
</body>
</html>

controller

@Controller
public class MyController {
    @RequestMapping(value = "/login")
    public ModelAndView doSome(String name, Integer age) throws MyUserException {
        System.out.println("控制器方法执行...");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("login");
        return mv;
    }
}

拦截器

public class MyInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取登录的用户名
        String username = request.getParameter("username");
        System.out.println(username);
        // 判断会话作用域中是否有用户名,判断是否登录过
        Object username1 = request.getSession().getAttribute("username");
        System.out.println(username1);
        // 验证输入的用户名
        if (username == null || username.length() == 0 || !"admin".equals(username)) {
            // 验证是否登录过
            if (username1 == null || !"admin".equals(username1)) {
                // 验证失败
                request.getRequestDispatcher("./tips.jsp").forward(request, response);
                return false;
            }
        }
        // 验证成功
        // 将用户名添加到会话作用域
        request.getSession().setAttribute("username", username);
        return true;
    }
}

jsp

  • login.jsp
<%--
  Created by IntelliJ IDEA.
  User: cw
  Date: 2023-06-06
  Time: 10:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>模拟登录</h1>
<p>用户【<%= session.getAttribute("username") %>】登录成功</p>
<a href="./logout.jsp">退出登录</a>
</body>
</html>
  • logout.jsp
<%--
  Created by IntelliJ IDEA.
  User: cw
  Date: 2023-06-06
  Time: 10:03
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p>【<%= session.getAttribute("username") %>】退出登录</p>
</body>
</html>
<%
    // 删除信息
    session.removeAttribute("username");
%>
  • tips.jsp
<%--
  Created by IntelliJ IDEA.
  User: cw
  Date: 2023-06-06
  Time: 10:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登录失败</h1>
</body>
</html>

DispatcherServlet 配置

<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

springmvc.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 http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  <!-- 控制器包扫描 -->
  <context:component-scan base-package="cw.springmvc.controller"/>
  <!-- 视图解析器 -->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
  </bean>
  <!-- 配置拦截器,拦截器可以配置0到多个 -->
  <mvc:interceptors>
    <!-- 配置第一个拦截器 -->
    <mvc:interceptor>
      <mvc:mapping path="/**"/>
      <bean class="cw.springmvc.handler.MyInterceptor"/>
    </mvc:interceptor>
  </mvc:interceptors>
</beans>

运行测试

  • 再直接浏览器访问:http://localhost:8080/springmvc/login

SpringMVC 执行流程

  • 浏览器发送请求,请求会最先被Tomcat接收,Tomcat将和DispatcherServlet对应路径相匹配的请求交给DispatcherServlet进行处理
  • DispatcherServlet调用处理器映射器,处理器映射器根据请求,从SpringMVC容器中获取处理器对象
  • 相当于执行:SpringMVC容器对象.getBean("beanName")
  • 处理器映射器:SpringMVC中的一种对象,框架把实现了HandlerMapping接口的类都叫映射器
  • 处理器映射器对象有多个
  • 处理器映射器接口HandlerMapping有很多子接口和子类,因为在没有注解之前需要通过实现接口来创建控制器,控制器种类一多,接口也就多了
  • HandlerExecutionChain mappedHandler = this.getHandler(processedRequest);
  • 框架会把找到的处理器对象放到处理器执行链的类中进行保存,将处理器执行链给DispatcherServlet
public class HandlerExecutionChain {
    private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);
    private final Object handler; // 保存处理器对象
    private final List<HandlerInterceptor> interceptorList; // 项目中所有的拦截器
    private int interceptorIndex;
}
  • DispatcherServlet将处理器执行链中的处理器对象交给处理器适配器,处理器适配器调用执行处理器的方法,将处理器方法的返回值ModelAndView返回给中央调度器
  • 处理器适配器:SpringMVC框架中的对象,需要实现HandlerAdapter
  • 处理器适配器对象有多个
  • 处理器适配器接口HandlerAdapter有很多子接口和子类,因为适配器的种类多
  • HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
  • mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
  • DispatcherServlet接收到处理器适配器的返回结果ModelAndView,调用视图解析器,将ModelAndView交给视图解析器,根据使用解析器的配置,组成视图的完整路径,并创建View对象,将视图对象交给DispatcherServlet
  • 视图解析器需要实现ViewResoler接口
  • 视图解析器可以存在多个
  • View是一个接口,表示视图,在框架中,jsp、html是使用View和其实现类表示
  • mv.setView(new RedirectView("/a.jsp"))mv.setViewName("a")) 效果差不多,只不过前者是显示创建和使用视图对象
  • InternalResourceView表示jsp文件的视图类,视图解析器会创建InternalResourceView对象,这对象中有相应的jsp文件的路径url
  • DispatcherServlet调用视图View,调用视图View对象的方法将Model中的数据放到request作用域中,视图将数据放到视图页面中,DispatcherServlet最后将视图响应给浏览器,向客户端呈现处理结果
  • 使用中央调度器按照处理流程调用相应的对象在不同阶段进行处理,有利于解耦合,其中某个对象进行了修改,不会影响其他对象的正常执行
相关文章
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
614 5
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
302 13
|
9月前
|
小程序 Java 知识图谱
Java 学习笔记 —— BMI & BMR 计算器
这是一个使用 Java 编写的 BMI 与 BMR 计算器小程序,可输入年龄、性别、身高和体重,计算身体质量指数(BMI)和基础代谢率(BMR),并输出健康评估结果。通过该项目,掌握了 Java 的输入处理、数据验证、条件判断、数学运算及格式化输出等基础知识,是 Java 初学者的理想练习项目。
|
9月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
10月前
|
前端开发 Java 开发者
Java新手指南:在Spring MVC中使用查询字符串与参数
通过结合实际的需求和业务逻辑,开发者可以灵活地利用这些机制,为用户提供更丰富而高效的Web应用体验。
252 15
|
11月前
|
JSON 前端开发 Java
Java新手指南:如何在Spring MVC中处理请求参数
处理Spring MVC中的请求参数是通过控制器方法中的注解来完成的。这些注解包括 `@RequestParam`, `@PathVariable`, `@ModelAttribute`, `@RequestBody`, `@RequestHeader`, `@Valid`, 和 `@RequestMapping`。使用这些注解可以轻松从HTTP请求中提取所需信息,例如URL参数、表单数据或者JSON请求体,并将其转换成Java对象以供进一步处理。
655 17
|
Java 区块链 网络架构
酷阿鲸森林农场:Java 区块链系统中的 P2P 区块同步与节点自动加入机制
本文介绍了基于 Java 的去中心化区块链电商系统设计与实现,重点探讨了 P2P 网络在酷阿鲸森林农场项目中的应用。通过节点自动发现、区块广播同步及链校验功能,系统实现了无需中心服务器的点对点网络架构。文章详细解析了核心代码逻辑,包括 P2P 服务端监听、客户端广播新区块及节点列表自动获取等环节,并提出了消息签名验证、WebSocket 替代 Socket 等优化方向。该系统不仅适用于农业电商,还可扩展至教育、物流等领域,构建可信数据链条。
|
开发框架 Java 开发工具
【Java全栈学习笔记-U1-day01】Java介绍
本笔记整理了Java学习的基础内容,涵盖程序理解、Java语言特性、JDK安装与配置、Java程序开发工具及编写步骤。重点介绍了Java程序的基本结构、编译和运行过程,以及输出语句的使用。通过实例演示了IDEA创建Java程序的方法,并强调了编码规范和注意事项。适合初学者复习和交流学习。 主要内容: 1. 理解程序:计算机组成、程序定义。 2. 简介:Java语言特点、技术平台、JDK作用。 3. 编写Java程序:编写、编译、运行步骤,基本结构。 4. 输出语句 5. DEA使用:新建工程、保存位置、文件介绍、新建类。 6. 扩展:注释、代码规范、大小写敏感、缩进等。
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
java202302java学习笔记第七天-n种内部类
java202302java学习笔记第七天-n种内部类
173 0
java202302java学习笔记第七天-n种内部类