SpringMVC学习指南(2)

2023-11-12


系列文章目录

SpringMVC学习指南(1)

关注博主,学习后续知识

在这里插入图片描述

前言

提示:
     本博客的内容是在上篇博客SpringMVC学习指南(1)的基础上更新的,没有看过上一篇的同学请移步看完上一篇博客之后,再进行本篇博客的阅读.
     本篇博客的会用大量的代码实例带你快速掌握SpringMVC开发的几个基本且重要的注解。希望大家在看博客的同时,多动手敲,多调试,便能更好的学会SpringMVC。


一、RequestMapping注解

该注解有四个常用属性,分别是:

属性名 类型 含义
value string[] 请求映射
method RequestMethod[] 请求方式
params string[] 请求参数
header string[] 请求头

1.1 value属性

(1)含义

  • 指定请求映射路径,SpringMVC中一个方法处理一个请求。这里的这个请求映射路径就对应前端发起的某个请求。

(2)有两个作用:

  1. 标注在类上:为下面的方法设置了一个基准路径,即:类下的所有方法都会有一个前缀地址。
  2. 标注在方法上:对应一个请求路径。即,该方法要处理的是哪个请求。

(3)实例:

    在前端页面点击超链接,发起请求 /hello ,后端myFirstRequest()方法上标注了 @RequestMapping(value
= “/hello”) 注解,就表示该方法是用来处理 /hello 请求的。

    处理完成之后,方法会返回一个字符串 “success”,我们配置的视图解析器(InternalResourceViewResolver)会完成拼串操作,即:会转发到一个success.jsp页面。

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<html>
<body>
<h1>首页</h1>
	<a href="hello">HelloWorld测试</a><hr>
</body>
</html>

    @RequestMapping(value = "/hello")
    public String myFirstRequest()
    {
        System.out.println("hello请求正在处理……");
        //视图解析器自动拼串,拿到它的前后缀。
        //转发到 /WEB-INF/pages/success.jsp 页面
        return "success";
    }

1.2 method属性

(1)含义

  • 限定请求方式(GET请求、POST请求),默认是都接收,不区分GET和POST。
  • 如果设置了method的值,就只支持设置的请求方式,如果以其他的方式发起的请求,浏览器就会报错 405-Method Not Allowed

(2)method的四个取值

  1. RequestMethod.GET
  2. RequestMethod.POST
  3. RequestMethod.DELETE
  4. RequestMethod.PUT
  • 这些请求方式有什么用呢?
    在后文中我们会使用RUST风格的URL,到时候就会使用不同的请求方式发起请求。同一个URL,它发起的请求方式不同,后端的处理方式就不同。

(3)实例

    当然,这里设置method方式为GET是多此一举的,要求前端发起的超链接请求本就是GET方式的,这里只是为了说明如何使用。

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String myFirstRequest()
    {
        System.out.println("请求正在处理…… success");
        return "success";
    }

1.3 params属性

(1)含义

  • 规定请求参数,请求路径中必须有参数,如:?username=1

  • params属性 和 header属性 支持简单的表达式。

    • param:表示请求必须包含名为 param 的参数
    • !param: 表示请求不能包含名为 param 的参数
    • param != value : 表示请求必须包含名为 param 的参数,但其值不能为value
  • eg:

    • params = {“username”} :表示发送请求必须带上一个名为username的参数,请求路径中必须有参数,如:/hello?username=1
    • params = {"!username"}:表示请求不能包含名为username的参数。
    • params = {“username=123”},请求中的参数username必须是123。
    • params = {"!username=123",“pws=321”},路径中参数之间使用 & 连接。

1.4 header属性

(1)含义

  • 规定请求头

(2)作用:

  • 限定哪些浏览器可以访问。
    • User-Agent:浏览器信息,可以规定哪些浏览器可以访问,哪些不可以访问

      • 谷歌浏览器的User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36
      • IE浏览器的User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362
    @RequestMapping(value = "/handle04",headers = {"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"})
    public String handle04()
    {
        return "success";
    }

1.5 通配符

     RequestMapping的模糊匹配 Ant风格的URL,使用通配符

URL地址中可以以下四个写通配符

  • ?:能替代任意一个字符
  • *:能替代任意多个字符(包括0个字符),和一层路径
  • **: 能替代多层路径

注意:当模糊匹配和精确匹配同时存在时,精确匹配优先。

代码示例:

@Controller
public class RequestMappingTest {
    @RequestMapping("/antTest01")
    public String antTest01()
    {
        System.out.println("antTest01");

        return "success";
    }


    /**
     * 只要请求路径是 /antTest0 开头,只要最后一个字符不同。
     *  模糊和精确多个匹配的情况下,精确匹配优先
     * @return
     */
    @RequestMapping("/antTest0?")
    public String antTest02()
    {
        System.out.println("antTest02");
        return "success";
    }

    @RequestMapping("/antTest0*")
    public String antTest03()
    {
        System.out.println("antTest03");
        return "success";
    }
}

二、PathVariable 注解

    拿到请求路径中占位符的信息。

路径上可以有占位符:

  • 占位符的使用。语法:{变量名}
  • 占位符只能占一层路径

eg:

<a href="user/LXY">路径属性值测试</a><br/>
@RequestMapping("/user/{name}")
public String pathVariableTest(@PathVariable("name") String name)
{
    System.out.println("路径上的占位符的值为"+name);
    return "success";
}

三、REST风格的URL

3.1 REST简介

    REST:即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用

  • 资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的URI就可以,因此 URI 即为每一个资源的独一无二的识别符。

  • 表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层(Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。

  • 状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:(请求方式)

  1. GET 用来获取资源

  2. POST 用来新建资源

  3. PUT 用来更新资源

  4. DELETE 用来删除资源。

比如:

发送的请求是 “/book”:

  • 如果是以GET方法发送的,就认为是获得book。
  • 如果是以DELETE方式发送的,就认为是删除book。

通俗来说:
    REST风格是希望以非常简洁的URL地址来发送请求,用请求方式来区分对一个资源的增删改查。

3.2 REST风格URL的使用

(1)我们在JavaWeb中写的URL

  • /getBook?id=1 查询id为1的图书

  • /deleteBook?id=1 删除id为1的图书

(2)REST风格的URL

  • 格式: /资源名/资源标识符
  • eg:URL为:/book/1
    • GET:查询1号图书
    • PUT:更新1号图书
    • DELETE:删除1号图书

(3)存在的问题

页面只能发起GET和POST请求,其他方法的请求无法发起

  • 解决: Spring提供了REST风格的支持

    • SpringMVC有一个Filter,他可以把普通的请求转换为规定形式的请求。
      • 在web.xml 中配置Fitter。(HiddenHttpMethodFilter)
<!--  配置filter,将POST请求转换为其他合适的请求方式,如DELETE,PUT-->
  <filter>
    <filter-name>filter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>filter</filter-name>
<!-- 过滤所有请求,只有Servlet中写的是“/”,其他地方的url写的还是“/*”-->
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 如何发起其他形式的请求?
    1. 创建一个POST类型的表单
    2. 表单项(input标签)中携带一个_method 的参数。
    3. 这个 _method 的值(value)就是DELETE或者PUT
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<html>
<body>
<h2>图书的增删改查,使用REST风格的URL地址</h2>

<a href="book/1">查询图书</a>

<form action="book" method="post">
    <input type="submit" value="保存图书">
</form>

<%--Delete请求--%>
<form action="book/1" method="post">
    <input name="_method" value="DELETE">
    <input type="submit" value="删除图书">
</form>

<%--Put请求--%>
<form action="book/1" method="post">
    <input name="_method" value="PUT">
    <input type="submit" value="更新图书">
</form>

</body>
</html>
@Controller
public class BookController {
    @RequestMapping(value = "/book",method = RequestMethod.POST)
    public String addBook()
    {
        System.out.println("添加图书成功");
        return "success";
    }

    @RequestMapping(value = "/book/{bookId}",method = RequestMethod.DELETE)
    public String deleteBook(@PathVariable("bookId") Integer id)
    {
        System.out.println("已经删除了【 "+id+" 】号图书");
        return "success";
    }

    @RequestMapping(value = "/book/{bookId}",method = RequestMethod.PUT)
    public String updateBook(@PathVariable("bookId") Integer id)
    {
        System.out.println("已经更新了【 "+id+" 】号图书");
        return "success";
    }

    @RequestMapping(value = "/book/{bookId}",method = RequestMethod.GET)
    public String getBook(@PathVariable("bookId") Integer id)
    {
        System.out.println("已经查询到了【 "+id+" 】号图书");
        return "success";
    }
}

3.3 HiddenHttpMethodFilter源码分析

(1)HiddenHttpMethodFilter的底层实现:

  1. 确定请求是POST。
  2. 从请求中拿到“_method”对应的value的值,并转换为大写。
  3. new出一个新的“HttpServlet对象”即:HttpMethodRequestWrapper,将新的method设置为其新的请求类型。
  4. 并放行这个新的“HttpServlet”对象。

HiddenHttpMethodFilter部分源码:

public static final String DEFAULT_METHOD_PARAM = "_method";

private String methodParam = DEFAULT_METHOD_PARAM;

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws ServletException, IOException {

   HttpServletRequest requestToUse = request;

   if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
        //拿到_method 对应的值。
      String paramValue = request.getParameter(this.methodParam);
      if (StringUtils.hasLength(paramValue)) {
         String method = paramValue.toUpperCase(Locale.ENGLISH);
         if (ALLOWED_METHODS.contains(method)) {
            requestToUse = new HttpMethodRequestWrapper(request, method);
         }
      }
   }

   filterChain.doFilter(requestToUse, response);
}

(2)高版本的Tomcat可能会出现的问题

在上面的程序中可能会出现如下错误:

  • 原因:

    • 高版本的Tomcat对jsp页面有约束。Tomact 8.0之后
  • 解决:

    • 在需要跳转到的jsp页面中加上对异常的支持

上面的程序执行完毕之后是要跳转到 success.jsp 页面

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>成功页面</title>
</head>
<body>
<h2>成功!!!</h2>
</body>
</html>

四、参数传入

问:什么叫参数传入?
答:参数传入,即:如何获取前端页面(表单等)提交的参数信息,并在后端处理方法中使用。

4.1 基本类型参数的获取

(1)默认方式

  • 默认方式获取请求参数,只需给方法参数上写一个和前度叶面参数名相同的变量,这个变量就自动来接收请求参数的值。
    • 有值:则直接获取
    • 无值:null

(2)使用注解

  • @RequestParam:获取表单中提交的参数

  • 该注解相当于原生Servlet中的:request.getParameter(key)

  • eg:

public String test01(@RequestParam(value = "username",required = false,defaultValue = "Hello") String name)
{
}

相当于:name=request.getParameter("username);

  • 注意:如果直接使用该注解,则默认请求中必须带要获取的参数名,不带就报错。可以使用注解的属性改变。

    • value:默认。获取指定key的参数
    • required:是否必须指定。布尔类型
    • defaultValue:默认值,原本默认是null,现在可以指定默认值
  • 注意和 @PathVariable的区别:

    • @PathVariable 是获取路径中的key对应的值
      • @PathVariable("user") 获取/book/{user}
      • @RequestParam("user") 获取前端提交的参数,例如:form表单中的user参数。

(3)扩展学习两个注解

@RequestHeader 和 @CookieValue

  • @RequestHeader: 获取请求头中的值。

    • 相当于:原生Servlet:request.getHeader("key");
    • 如果请求头中没有这个key,会报500错误。
    • 该注解也有valuerequireddefaultValue属性值,其使用方法和 @RequestParam 中的三个属性一样。
  • @CookieValue:获取某个cookie的值。

    • 相当于:原生Servlet:Cookies[] cookies = request.getCookies();,只不过原生Servlet中获取的是所有的cookie,然后在遍历拿到真正需要的那个cookie。
    • 该注解也有三个属性:required,defaultValue,defaultValue。同上。

看一段代码来熟悉一下这三个注解

前端页面

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" isErrorPage="true"%>
<html>
<body>
<h2>测试获取请求参数</h2>
<a href="testParam?username=Tom">获取参数</a><br/>
<a href="testHeader">获取请求头信息</a><br/>
<a href="testCookies">获取Cookies信息</a><br/>

</body>
</html>

controller代码

package nuc;
/**
*  获取请求带来的参数
*/
@Controller
public class RequestParamsController {

    /**
     *
     * @return 成功页面

     */
    @RequestMapping(value = "/testParam")
    public String testRequest01(@RequestParam(value = "username",required = false,defaultValue = "Hello") String name)
    {
        System.out.println("请求参数:"+name);
        return "success";
    }


    @RequestMapping(value = "/testHeader")
    public String testRequest02(@RequestHeader("User-Agent") String userAgent)
    {
        System.out.println("请求头信息:"+userAgent);
        return "success";
    }
    @RequestMapping(value = "/testCookies")
    public String testRequest03(@CookieValue("JSESSIONID") String jsessionid)
    {
        System.out.println("Cookies 信息:"+jsessionid);
        return "success";
    }
}

4.2 自定义类型参数的获取

(1)概念

  • 如果我们方法的参数是一个实体类,SpringMVC会自动为这个实体类赋值。

    • 将这个实体类中的每一个属性(要求和前端页面提交的参数的名椅子),从request中获取出来,进行封装。

    • 还可以级联封装,即:这个实体类中还有另外一个实体类。(在请求中的参数也必须是级联的)

    • 注意:这个实体类的属性值的名要和请求中的参数名一致,否则会获取不到这个属性值,即为null。

(2)实践

前端页面:

<form action="addBook" method="post">
    书名:<input type="text" name="name">
    作者:<input type="text" name="author">
    价格:<input type="text" name="price">
    库存:<input type="text" name="stock">
    <hr/>
    <input type="text" name="address.province">
    <input type="text" name="address.city">//级联属性

    <input type="submit">
</form>

Book实体类

public class Book {
    private String bookname;
    private String author;
    private Double price;
    private int stock;
    private Address address;
}
@RequestMapping("/addBook")
public String addBook(Book book)
{
    System.out.println(book);
    return "success";
}

这个addBook() 方法中的book,就会和前端页面提交的参数进行一对一绑定。(前提是参数名一致)

五、中文乱码的解决

5.1 请求乱码

1. GET请求

     改Tomcat的server.xml文件,在如图位置8080后,加上:URIEncoding=“UTF-8” (我这里并没有修改web.xml文件,大家如果没有遇到过GET请求中文乱码的话,就不必修改此处)

2. POST请求

  • 在JavaWeb中的处理方式是,在第一次获取请求参数之前设置:response.setCharacterEncoding("UTF-8");
  • 在SpringMVC中有一个专门的过滤器,它专门用来处理字符乱码。CharacterEncodingFilter
  • 在SpringMVC的配置文件中配置该过滤器。
<!--配置一个过滤字符编码方法的Filter,来处理字符乱码-->
<!--该Filter必须在所有的Filter之前。否则不会有过滤效果-->
<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <!-- 设置POST请求编码方式。其实默认就是UTF-8。只不过我们可以使用init-param标签类设置-->
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</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>
  • 注意:该过滤器要直接写在“前端控制器”的Servlet之后,即:在其他所有的Filter之前,否则会报错!!!
  • 原因:因为在JavaWeb中我们就知道,在设置字符编码时,就要在第一次获取参数之前设置。所以,该过滤器就就必须在其他过滤器之前,否则无法起到很好的字符编码过滤,SpringMVC就会发出报错信息。

5.2 响应乱码

对响应乱码的处理非常简单,使用一行代码即可
response.setContentType("text/html;charset=utf-8");

六、使用原生API

这里“使用原生API”的意思就是,在SpringMVC的控制器方法参数列表中使用JavaWeb中的API。即:

  1. HttpServletResponse:
  2. HttpServletRequest:
  3. HttpSession:
    还有一些,只不过这三个是常用的,其他的都不常用。这里就不再赘述了

原生API的使用,我们在JavaWeb中已经很熟悉了,这里就直接用一段代码来复习一些。

什么?你竟然没有了解过Servlet?

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

SpringMVC学习指南(2) 的相关文章

  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • 为什么用java日历解析时会得到错误的月份

    Date fakeDate sdf parse 15 07 2013 11 00 AM Calendar calendar Calendar getInstance calendar setTime fakeDate int current
  • 带有 Spring RequestMapping 路径参数的编码斜杠 (%2F) 给出 HTTP 400

    这不是重复的参考问题 https stackoverflow com questions 3235219 因为它是 Spring 特有的 无论谁添加了这个 事实发生三年后 都没有费心去阅读问题或评论线程来看看真正的答案是什么 接受的答案并不
  • Spring MVC 和 Struts MVC 之间的区别 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Spring MVC 和 Struts MVC 之间的主要区别是什么 Spring MVC 和 Struts 之间的主要区别是 Spr
  • .NET 世界有 Maven 替代方案或端口吗?

    NET 世界有 Maven 替代方案或端口吗 我很想使用 Java 世界拥有的良好依赖管理系统 但我没有找到任何可与 NET 项目相媲美的系统 NMaven http incubator apache org nmaven 是第一个 官方努
  • java中的散列是如何工作的?

    我正在尝试弄清楚java中的哈希值 例如 如果我想在哈希图中存储一些数据 它是否会有某种带有哈希值的底层哈希表 或者 如果有人能够对哈希的工作原理给出一个很好且简单的解释 我将非常感激 HashMap 基本上在内部实现为数组Entry 如果
  • 将 Swing 集成到简单的文本冒险游戏中

    我对 Java 中的一些中级概念相当陌生 最近 我制作了一款名为 DazzleQuest 的文本冒险游戏 它完全在开发者控制台 终端中运行 它涉及到我的朋友作为角色 所以我想向他们展示它 并通过将命令行的功能和控制台的输出转移到一个简单的
  • 当Java中set已经是原子的时候,为什么我们还需要compareAndSet呢?

    因为原子意味着线程安全 当 set 本身在java中是原子和线程安全的时候 我们什么时候使用compareAndSet 举例来说 我想以原子方式设置一个变量 以便每个其他线程都可以看到它 但我希望以线程安全的方式设置该变量 我可以简单地将其
  • Java TCP Echo 服务器 - 广播

    我有一个简单的回显服务器 我希望当连接的用户向服务器键入任何内容时 所有其他客户端和该客户端都会收到消息 MOD 它现在不会发送给所有客户端 但它应该发送 而且我只是不知道我的代码出了什么问题 所以现在它只会将消息 MOD 发送给发送消息的
  • 使用 PowerMock 和 TestNG 模拟单个静态方法

    class StaticClass public static String a return a public static String ab return a b 我想嘲笑StaticClass a以便它返回 x 并致电StaticC
  • 控制启动时的竞争条件

    我有一些代码想要执行一些一次性初始化 但这段代码没有明确的生命周期 因此在初始化完成之前 我的逻辑可能会被多个线程调用 所以 我想基本上确保我的逻辑代码 等待 直到初始化完成 这是我的第一次剪辑 public class MyClass p
  • 在 XSSF 工作簿上设置密码保护

    我想为使用 poi 3 14 创建的 xlsx 文件添加密码保护 该文档声称 这是可能的 http poi apache org cryption html http poi apache org encryption html 使用我尝试
  • 使用 JPA 标准的“不在”约束

    我正在尝试写一个NOT IN约束使用JPA Criteria 我尝试过这样的事情 builder not builder in root get property1 虽然我知道这行不通 在上面的语法中 如何添加集合 列表property1会
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中
  • Android Studio错误的含义:未注释的参数覆盖@NonNull参数

    我正在尝试 Android Studio 创建新项目并添加默认值后onSaveInstanceState方法创建 MyActivity 类 当我尝试将代码提交到 Git 时 我收到一个我不明白的奇怪错误 代码是这样的 我得到的错误是这样的
  • 尝试用Java实现基于文本的Hangman游戏

    我需要检查用户输入的字母以及他们猜测的空格是否位于隐藏单词的特定位置 变量one等于用户猜测的空间索引 而letterGuess是他们猜测的字母 我的代码怎么错了 示例 秘密词是你好 hidden word is 用户猜测h 0 1 2 3
  • 如何在 Windows 上使用 Java Hotspot JVM 禁用小型转储 (mdmp) 文件生成

    目前 我有一个已部署的可执行 jar 文件 该文件在崩溃时会创建大型 7 Gb 小型转储文件 我想要一个导致崩溃原因的文本表示 而不是 JVM 状态的二进制文件 我尝试使用中找到的信息这个 CodeRanch 帖子 http www cod
  • 项目级别的@PowerMockIgnore

    在 Maven 中运行时 我的 powermock 测试用例出现以下错误 java lang LinkageError loader constraint violation loader instance of org powermock
  • 请解释为什么Java和C对此代码给出不同的答案

    public class Test public static void main String args int i 10 i i System out println value of i is i 输出是 10 当我在中执行类似的代码

随机推荐

  • IAR error: a declaration cannot have a label

    在使用switch时 在case 后面申请变量会出现 error a declaration cannot have a label错误 原因 Case statements are only labels This means the c
  • 【安全技术】Java 实现加密数据库连接

    一 前言 在很多项目中 数据库相关的配置文件内容都是以明文的形式展示的 这存在一定的安全隐患 在开发和维护项目时 不仅要关注项目的性能 同时也要注重其安全性 二 实现思路 我们都知道项目启动时 Spring 容器会加载配置文件并读取文件中的
  • FreeRTOS学习-软件定时器管理

    1 简介 软件定时器用于在未来的某个时间执行某个预先指定的函数 或者以一个固定的频率周期性调度该函数 这个预先指定的函数称为软件定时器回调函数 它是由软件定时器服务调用的 软件定时器由FreeRTOS的内核控制 不需要硬件的支持 不与硬件定
  • smart device industry

    公司培训 讲了一下smart device industry 不知讲得对不对 第一层 Ip Core 例如Intel MIPS ARM 第二层 芯片制造商Silicone 例如 broadcom Qualcomm BlueCore inte
  • Office2016软件安装教程

    关注公众号 免费获取资料 解压压缩文件 点击office 2013 专业增强版 64位文件夹 根据自身系统选择位数 右击setup gt 以管理员的身份运行 3 勾选接收 继续 4 选择自定义安装 5 点击浏览 选在office 安装位置
  • STM32实战项目系列教程 (一)—— 循迹小车

    前言 以往我们看到很多学习单片机知识的教程往往是从单片机内部资源出发 这样的教程原理往往晦涩难懂 初学者很难系统的学习开发单片机的项目 而本次教程是从项目出发教你学习循迹小车的制作 整个项目采用 STM32 单片机作为控制器来实现 所以在学
  • 【vue2】el-table 从接口获取数据改变了,但是页面却没有正常渲染

    方法一 在el table上面添加一个 key 属性 指定一个唯一的值 然后数据改变后 我们更新这个唯一值 这样 Vue 会自动重新渲染该组件 1 获取随机uuid 创建在uuid js文件当中 获取唯一id export function
  • 7月15日---7月21日(计划50小时,实际12小时,还有5258小时)

    本周单位事情应该不算多 没事就在家看看文挡 切忌浮躁 一颗平常心 就当学东西了 业余爱好 就按照DDRAW 软引擎 OSG引擎 自制3D引擎去走 上午PHYSX 中午DDRAW引擎 下午加入GAMEDEMO程序 晚上文挡 周六日文档 擦 最
  • 哪个进程在访问这个恶意域名???

    哪个进程在访问这个恶意域名 背景 信息安全工程师很多时候需要通过某个恶意域名来判断主机失陷情况 恶意域名特征比较明显的 比较容易通过威胁情报找到相关线索 例如fr minexmr com 通过威胁情查询 该恶意域名比较容易判断该主机感染Wa
  • 数据双向绑定

    一 什么是双向绑定 我们先从单向绑定切入单向绑定非常简单 就是把Model绑定到View 当我们用JavaScript代码更新Model时 View就会自动更新双向绑定就很容易联想到了 在单向绑定的基础上 用户更新了View Model的数
  • cocos cretor shader effect-the book of shader-4.二维矩阵

    2D Matrices 二维矩阵 前面章节 TheBookofShader开始 Shaping functions 造型函数 Color 颜色 Shapes 形状 平移 之前的章节我们学习了如何制作一些图形 而如何移动它们的技巧则是借助移动
  • 【设计模式】Chain of Responsibility 责任链式模式

    一 前言 责任链行为模式是行为模式的一种 行为模式涉及到算法和对象间职责的分配 行为模式不仅描述对象或类的模式 还描述它们之间的通信模式 行为模式分为 Template Method 模板方法 和 Interpreter 解析器行为模式 模
  • linux下安装mysql(rpm)方式安装

    前言 在linux中使用rpm安装包安装5以上版本的mysql的都可以参考这个 1 首先下载rpm安装包 要下载两个安装包一个client 一个server 有个镜像做的不错 下载地址mirrors sohu com mysql 进入后找到
  • 虚拟机centos7搭建k8s

    虚拟机centos7搭建k8s 1 踩坑大全 centos7安装的docker后 默认非root用户无法使用 所以需要创建docker组 把当前普通用户加入到组中 这里参考链接 设置docker非root用户正常使用 在给docker配置镜
  • Error creating bean with name ‘sqlSessionFactory‘ 、MySQL启动报错

    今天学习SpringSecurity的时候 选用了springboot 因为公司用的不是boot 所以 boot一直不是很熟悉 在此连接数据库的时候 遇到了一个bug Error creating bean with name sqlSes
  • UR机器人:位姿表示以及相关移动

    博主最近在做强化相关的任务 用到了UR5机械臂 所以本文主要讲述在使用过程中 对于UR机器人位姿的理解 在阅读本文之前 希望大家能够花一点时间读一下我的另一篇博文空间信息与坐标变换 本文如有错误的地方 欢迎大家指正 欢迎讨论 机座和工具 首
  • 麦科捷联合 Mellanox 加速eXtremeDB 集群性能

    2016年7月20日McObject 作为分布式数据库管理系统eXtremeDB 中集群功能的开发者 联合端对端以太网和无限宽带互联方案和服务领先供应商的Mellanox 共同宣布一个基准测试结果 该测试通过集成Mellanox的信息加速器
  • Node-RED配置

    配置文件 可通过配置文件配置Node RED 配置文件在哪 Node RED启动时 会在Node RED用户目录下寻找setting js文件 node red Windows中为系统盘 Users 当前用户 node red 若找不到 将
  • Vue3下pinia的状态管理原理和具体使用示例

    一 Pinia是什么 Pinia在Composition API的设计背景下 以Vuex下一代的构想设计了新的Vue存储状态管理库 Pinia 是一个基于 Vue 3 的状态管理库 它提供了一个可组合的 类型安全的 API 来管理 Vue
  • SpringMVC学习指南(2)

    文章目录 系列文章目录 前言 一 RequestMapping注解 1 1 value属性 1 2 method属性 1 3 params属性 1 4 header属性 1 5 通配符 二 PathVariable 注解 三 REST风格的