SpringMVC2~~~

目录

数据格式化

基本数据类型可以和字符串自动转换

特殊数据类型和字符串间的转换

验证及国际化

自定义验证错误信息

 细节

数据类型转换校验核心类DataBinder

工作机制

取消某个属性的绑定

中文乱码处理

处理json和HttpMessageConverter

处理Json-@ResponseBody

 处理Json-@ResquestBody

细节

HttpMessageConverter 

文件下载-ResponseEntity

文件上传

自定义拦截器

​拦截器与过滤器的区别​编辑 

异常处理

局部异常

执行流程

全局异常

自定义异常

统一处理异常信息SimpleMappingExceptionResolver

对未知异常进行统一处理


数据格式化

提交数据(比如表单),对提交的数据进行转换和处理

基本数据类型可以和字符串自动转换

<a href="<%=request.getContextPath()%>/addMonsterUI">添加妖怪</a>
@Controller
@Scope(value = "prototype")
public class MonsterHandler {@RequestMapping(value = "/addMonsterUI")public String addMonsterUI(Map<String, Object> map) {map.put("monster", new Monster());return "datavalid/monster_addUI";}@RequestMapping(value = "/save")public String save(Monster monster) {System.out.println("----monster---" + monster);return "datavalid/success";}
}

 return "datavalid/monster_addUI";配置文件写了前缀后缀

<form:form action="save" method="post" modelAttribute="monster">妖怪名字: <form:input path="name"/> <form:errors path="name"/>  <br><br>妖怪年龄~: <form:input path="age"/> <form:errors path="age"/> <br><br>电子邮件: <form:input path="email"/> <form:errors path="email"/>  <br><br><input type="submit" value="添加妖怪"/>
</form:form>

1. 使用springMVC的标签来完成
2. SpringMVC 表单标签在显示之前必须在 request 中有一个 bean, 该 bean 的属性和表单标签的字段要对应!
3. SpringMVC 的 form:form 标签的 action 属性值中的 / 不代表 WEB 应用的根目录.
4. <form:form action="?" method="POST" modelAttribute="monster">
5. 当我们向map添加的数据时,会默认存放到request域 

特殊数据类型和字符串间的转换

特殊数据类型和字符串之间的转换使用注解(比如日期,规定格式的小数比如货币形式等)

日期@DateTimeFormat        货币@NumberFormat

public class Monster() {@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;@NumberFormat(pattern = "###,###.##")private Float salary;
}

@NumberFormat 只要能转成数字,1234.11也可以

@Controller
@Scope(value = "prototype")
public class MonsterHandler {@RequestMapping(value = "/addMonsterUI")public String addMonsterUI(Map<String, Object> map) {map.put("monster", new Monster());return "datavalid/monster_addUI";}@RequestMapping(value = "/save")public String save(Monster monster) {System.out.println("----monster---" + monster);return "datavalid/success";}
}
<form:form action="save" method="post" modelAttribute="monster">妖怪生日: <form:input path="birthday"/> <form:errors path="birthday"/> <br>妖怪薪水: <form:input path="salary"/> <form:errors path="salary"/> <br><input type="submit" value="添加妖怪"/>
</form:form>

验证及国际化

JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在JavaEE中
JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则

HibernateValidator 扩展注解

public class Monster {private Integer id;@NotEmptyprivate String email;@NotNull(message = "age不能为空")@Range(min = 1,max = 100)private Integer age;@NotEmptyprivate String name;@NotNull(message = "生日不能为空")@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;@NotNull(message = "薪水不能为空")@NumberFormat(pattern = "###,###.##")private Float salary;
}

1、 @Valid 对 monster 数据按照注解进行验证

2、Errors errors 表示如果校验出现错误,将校验的错误信息保存 errors
3、Map<String, Object> map  表示如果校验出现错误, 将校验的错误信息保存 map 同时保存monster对象
4、校验发生的时机: 在springmvc底层,反射调用目标方法时,会接收到http请求的数据,然后根据注解来进行验证

@RequestMapping(value = "/save")public String save(@Valid Monster monster, Errors errors, Map<String, Object> map) {System.out.println("----monster---" + monster);//我们为了看到验证的情况,我们输出map 和 errorsSystem.out.println("===== map ======");for (Map.Entry<String, Object> entry : map.entrySet()) {System.out.println("key= " + entry.getKey() + " value=" + entry.getValue());}System.out.println("===== errors ======");if (errors.hasErrors()) {//判断是否有错误List<ObjectError> allErrors = errors.getAllErrors();for (ObjectError error : allErrors) {System.out.println("error=" + error);}return "datavalid/monster_addUI";}return "datavalid/success";}

map会输出对象信息,并且会显示有几个错误,输出错误信息(跟Errors功能一样)

Errors输出错误信息

如果没有错误,map也会输出对象信息

回显错误信息 

<form:form action="save" method="post" modelAttribute="monster">妖怪名字: <form:input path="name"/> <form:errors path="name"/>  <br><br>妖怪年龄~: <form:input path="age"/> <form:errors path="age"/> <br><br>电子邮件: <form:input path="email"/> <form:errors path="email"/>  <br><br>妖怪生日: <form:input path="birthday"/> <form:errors path="birthday"/> <br>妖怪薪水: <form:input path="salary"/> <form:errors path="salary"/> <br><input type="submit" value="添加妖怪"/>
</form:form>

自定义验证错误信息

在springDispatcherServlet-servlet.xml配置

   <!-- 配置国际化错误信息的资源处理bean --><bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><!-- 配置国际化文件名字表示messageSource回到 src/i18nXXX.properties去读取错误信息--><property name="basename" value="i18n"></property></bean>

 i18n.properties

NotEmpty.monster.name=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a
typeMismatch.monster.age=\u5e74\u9f84\u8981\u6c42\u5728\u0031\u002d\u0031\u0035\u0030\u4e4b\u95f4
typeMismatch.monster.birthday=\u751f\u65e5\u683c\u5f0f\u4e0d\u6b63\u786e
typeMismatch.monster.salary=\u85aa\u6c34\u683c\u5f0f\u4e0d\u6b63\u786e

只加@Range,如果不在范围,会显示 需要在 x - x 之间,可以指定message

如果在国际化文件写了Range.monster.age,优先自定义信息

@NotNull会显示不能为null

@NotEmpty会显示不能为空

 

Range.monster.age=\u8fd9\u662f\u65b0\u7684\u9a8c\u8bc1\u9519\u8bef\u4fe1\u606f-\u5e74\u9f84\u57281-100\u4e4b\u95f4

 细节

Bean字段加验证注解
目标方法,在Bean类型的参数前加@Valid注解,之后添加Errors或BindingResult类型参数
表单回显错误信息
配置文件,中文需要Unicode编码,使用工具转码
格式:验证规则.表单modelAttribute值.属性名=消息信息

@NotEmpty,String、colletcion、map、array不为null,不为empty
@NotNull,可以接收任何类型,不为null

数据类型转换校验核心类DataBinder

工作机制

SpringMVC 通过反射机制对目标方法进行解析,将请求消息绑定到处理方法的入参中。

数据绑定的核心部件是 DataBinder

在数据校验前也会发生错误(比如数据类型转换/格式化),会放在BindingResult中

public class DataBinder implements PropertyEditorRegistry, TypeConverter {@Nullableprivate ConversionService conversionService;//用于数据转换private final List<Validator> validators;//校验器封装到集合@Nullableprivate AbstractPropertyBindingResult bindingResult;//存放校验错误的结果public void validate() {Object target = this.getTarget();Assert.state(target != null, "No target to validate");BindingResult bindingResult = this.getBindingResult();Iterator var3 = this.getValidators().iterator();while(var3.hasNext()) {Validator validator = (Validator)var3.next();validator.validate(target, bindingResult);}}
}

因为加了@Valid注解,需要对Bean实例进行校验

target就是表单提交的Bean实例数据

bindingResult的运行类型是BeanPropertyBindingResult,就是errors

如果在Bean字段加了@DateTimeFormat、@NumberFormat会进行数据类型转换/格式化,出错直接存放在bindingResult中,跳过数据校验这个步骤

拿到校验器进行遍历,如果Bean实例没通过校验,就会将错误放在bindingResult中

取消某个属性的绑定

使用@InitBinder注解标识方法,对WebDataBinder对象进行初始化

WebDataBinder对象是DataBinder的子类,用于完成由表单字段到Bean属性的绑定

@InitBinder方法的参数通常是WebDataBinder,返回必须是void

机制:springmvc 在底层通过反射调用目标方法时, 接收到http请求的参数和值,使用反射+注解技术取消对指定属性的填充
setDisallowedFields支持可变参数,可以填写多个字段
如果我们取消某个属性绑定,验证无意义,把验证的注解去掉, name属性会使用默认值null

    @InitBinderpublic void initBinder(WebDataBinder webDataBinder) {webDataBinder.setDisallowedFields("name","age");}

中文乱码处理

表单(POST)提交数据为中文时,会出现乱码,GET不会出现乱码

web.xml 自定义过滤器

    <filter><filter-name>MyCharacterFilter</filter-name><filter-class>com.hspedu.web.filter.MyCharacterFilter</filter-class></filter><filter-mapping><filter-name>MyCharacterFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
public class MyCharacterFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");//放行请求filterChain.doFilter(servletRequest, servletResponse);}public void destroy() {}
}

Spring提供过滤器

放在所有过滤器之前,只需要配置xml,不再写过滤器

设置为true,保证按照指定格式转换 

第一个参数:设置encoding编码的值

第二个参数:强制请求对象(HttpServletRequest)使用encoding编码的值

第三个参数:强制应答对象(HttpServletResponse)使用encoding编码的值

web.xml 

    <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>

处理json和HttpMessageConverter<T>

处理Json-@ResponseBody

目标方法 @ResponseBody,返回的数据是json格式

控制台返回Json数据 

@Data
public class Dog {private String name;private String address;
}
@Controller
public class JsonHandler {@RequestMapping(value = "/json/dog")@ResponseBodypublic Dog getJson() {//返回对象//springmvc会根据你的设置,转成json格式数据返回Dog dog = new Dog();dog.setName("大黄狗");dog.setAddress("小新的家");return dog;}
}
<html>
<head><title>json提交</title><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script type="text/javascript">$(function () {//给id="getJson"绑定点击事件$("#getJson").click(function () {var url = this.href;var args = {"time": new Date};//为了防止页面缓存$.post(url,args,function (data) {//data 就是返回的数据,是json格式=>如果是多个json数据,可以遍历console.log("dataa= ", data);console.log("dog.name=", data.name)console.log("dog.addresss=", data.address)},"json");return false;//这里我们返回false,就不使用href默认机制})})</script>
</head>
<body>
<h1>请求一个json数据</h1>
<a href="<%=request.getContextPath()%>/json/dog" id="getJson">点击获取json数据</a>
</body>
</html>

处理Json-@ResquestBody

以前通过 表单(POST) 或者 URL请求携带参数名=参数值(GET) 把数据提交给目标方法

使用SpringMVC的 @RequestBody 将客户端提交的json数据,封装成JavaBean对象,再把这个javabean以json对象形式返回

@Data
public class User {private String userName;private Integer age;
}

@RequestBody User user 在形参指定了 @RequestBody
springmvc就会将提交的json字符串数据填充给指定Javabean  

@Controller
public class JsonHandler {@RequestMapping(value = "/save2")@ResponseBodypublic User save2(@RequestBody User user) {//将前台传过来的数据 以json的格式相应回浏览器System.out.println("user~= " + user);return user;}}
<html>
<head><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script type="text/javascript">$(function () {$("button[name='butt1']").click(function () {//目标:将userName 和 age 封装成json字符串,发送给目标方法var url = "/springmvc/save2";var userName = $("#userName").val();var age = $("#age").val();//将json对象转成json字符串var args = JSON.stringify({"userName": userName, "age": age});$.ajax({url: url,data: args,type: "POST",success: function (data) {console.log("返回的data= ", data);},//下面这个contentType参数,是指定发送数据的编码和格式contentType: "application/json;charset=utf-8"})})})</script></head>
<body>
<h1>发出一个json数据</h1>
u:<input id="userName" type="text"><br/>
a:<input id="age" type="text"><br/>
<button name="butt1">添加用户</button>
</body>
</html>

细节

@ResponseBody可以返回一个对象,也可以是集合

    @RequestMapping(value = "/json/dogs")@ResponseBodypublic List<Dog> getJsons() {List<Dog> dogs = new ArrayList<>();dogs.add(new Dog("大黄狗", "小新的家"));dogs.add(new Dog("大黄狗2", "小新2的家"));dogs.add(new Dog("大黄狗3", "小新3的家"));return dogs;}

@ResponseBody可以直接写在controller上,对所有的方法生效
@ResponseBody + @Controller 可以直接写成 @RestController

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {@AliasFor(annotation = Controller.class)String value() default "";
}

HttpMessageConverter<T> 

SpringMVC 处理 JSON-底层实现是依靠HttpMessageConverter来进行转换的

根据消息头来查找对应的实现子类,再去找到对应的转换器,在转换器中封装,传给SpringMVC,再根据@ResponseBody、HttpEntity<T>等信息找到对应转换器 

1、到达转换器进行转换,有两个参数

inputMessage封装了请求头和请求数据

javaType,Bean的全路径

2、指定字符集(application/json;charset=utf-8)

3、ObjectMapper处理Json数据

把请求数据封装到javaType指定的对象中,inputMessage封装了目标方法

返回给SpringMVC的目标方法

最后return user还要经过转换器进行回送
回送的数据格式根据@ResponseBody等自动选择

文件下载-ResponseEntity<T>

<body>
<h1>下载文件的测试 </h1>
<a href="<%=request.getContextPath()%>/downFile">点击下载文件</a>
</body>
    @RequestMapping(value = "/downFile")public ResponseEntity<byte[]> downFile(HttpSession session)throws Exception {//1. 先获取到下载文件的inputStreamInputStream resourceAsStream =session.getServletContext().getResourceAsStream("/img/2.jpg");//2. 开辟一个存放文件的byte数组, byte[] 是可以支持二进制数据(图片,视频。)byte[] bytes = new byte[resourceAsStream.available()];//3. 将下载文件的数据,读入到byte[]resourceAsStream.read(bytes);//public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {}//4. 创建返回的HttpStatusHttpStatus httpStatus = HttpStatus.OK;//5. 创建 headersHttpHeaders headers = new HttpHeaders();//指定返回的数据,客户端应当以附件形式处理headers.add("Content-Disposition", "attachment;filename=2.jpg");//构建一个ResponseEntity 对象1. 的http响应头headers 2. http响应状态 3. 下载的文件数据ResponseEntity<byte[]> responseEntity =new ResponseEntity<>(bytes, headers, httpStatus);//如果出现找不到文件,解决方法 rebuild project -> 重启tomcatreturn responseEntity;}

文件上传

<h1>文件上传的演示</h1>
<form action="<%=request.getContextPath()%>/fileUpload" method="post" enctype="multipart/form-data"><%--在handler的形参加上字段就可以获取到introduce中文乱码使用过滤器来处理--%>文件介绍:<input type="text" name="introduce"><br>选择文件:<input type="file" name="file"><br><input type="submit" value="上传文件">
</form>
    <!--配置文件上传需要的bean--><!--这里的id不能乱写,底层通过父接口id来查找--><bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"id="multipartResolver"/>
@Controller
public class FileUploadHandler {//编写方法,处理文件上传的请求@RequestMapping(value = "/fileUpload")public String fileUpload(@RequestParam(value = "file") MultipartFile file,HttpServletRequest request, String introduce) throws IOException {//接收到提交的文件名String originalFilename = file.getOriginalFilename();System.out.println("你上传的文件名= " + originalFilename);System.out.println("introduce=" + introduce);//得到要把上传文件保存到哪个路径[全路径:包括文件名]String fileFullPath =request.getServletContext().getRealPath("/img/" + originalFilename);//创建文件File saveToFile = new File(fileFullPath);//将上传的文件,转存到saveToFilefile.transferTo(saveToFile);return "success";}
}

自定义拦截器

 如果用户提交的数据有禁用词,在第一个拦截器就返回,不执行目标方法

@Component
public class MyInterceptor01 implements HandlerInterceptor {/*** handler被拦截的控制器对象* 1. preHandle() 在目标方法执行前被执行* 2. 如果preHandle() 返回false , 不再执行目标方法* 3. 该方法可以获取到request, response, handler* 4. 这里根据业务,可以进行拦截,并指定跳转到哪个页面*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("--MyInterceptor01--preHandle()---");//获取到用户提交的关键字String keyword = request.getParameter("keyword");if("病毒".equals(keyword)) {//请求转发到warningrequest.getRequestDispatcher("/WEB-INF/pages/warning.jsp").forward(request,response);return false;}System.out.println("得到到keyword= "+ keyword);return true;}/*** 1. 在目标方法执行后,会执行postHandle* 2. 该方法可以获取到 目标方法,返回的ModelAndView对象*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("--MyInterceptor01--postHandle()--");}/*** afterCompletion() 在视图渲染后被执行, 这里可以进行资源清理工作*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("--MyInterceptor01--afterCompletion()--");}
}

配置拦截器 

1. 创建实现 HandlerInterceptor 接口的 bean
2. 在 mvc:interceptors 中配置拦截器

 第一种:自己在interceptors配置一个引用指向你需要使用的拦截器,对所有的请求都拦截

<mvc:interceptors><ref bean="myInterceptor01"/>
</mvc:interceptors>

第二种:指定拦截目标方法

<mvc:interceptors><mvc:interceptor><mvc:mapping path="/monster"/>//拦截器对象<ref bean="myInterceptor01"/>或<ref class="拦截器全路径"></mvc:interceptor>
</mvc:interceptors>

第三种:支持通配符,同时指定不对哪些目标方法进行拦截 

<mvc:interceptors>        <mvc:interceptor>//**表示任意的字符,文件或多级目录和目录中的文件//   /**拦截所有请求<!-- <mvc:mapping path="/user/**"/> --><mvc:mapping path="/h*"/><mvc:exclude-mapping path="/hello"/><ref bean="myInterceptor01"/></mvc:interceptor>
</mvc:interceptors> 

多个拦截器执行流程

按配置顺序执行放入ArrayList
如果A的pre方法返回false,直接返回
如果B的pre方法返回false,执行A的after方法


拦截器与过滤器的区别 

异常处理

局部异常

@ExceptionHandler

1. localException 方法处理局部异常
2. 这里处理ArithmeticException.class,NullPointerException.class
3. Exception ex: 生成的异常对象,会传递给ex, 通过ex可以得到相关的信息

@Controller
public class MyExceptionHandler{@ExceptionHandler({ArithmeticException.class,NullPointerException.class})public String localException(Exception ex, HttpServletRequest request){System.out.println("局部异常信息是-" + ex.getMessage());//将异常的信息带到下一个页面.request.setAttribute("reason", ex.getMessage());return "exception_mes";}@RequestMapping(value = "/testException01")public String test01(Integer num) {int i = 9 / num;return "success";}
}
<body>
<h1>朋友, 程序发生了异常...</h1>
异常信息- ${requestScope.reason}
</body>

执行流程

ExceptionHandlerMethodResolver先找到对应异常.class,然后拿到方法名

全局异常

1. 全局异常就不管是哪个Handler抛出的异常,都可以捕获

    @ExceptionHandler({异常类型})
2. 这里的全局异常是NumberFormatException.class,ClassCastException.class
3. Exception ex 接收抛出的异常对象

@ControllerAdvice
public class MyGlobalException {@ExceptionHandler({NumberFormatException.class, ClassCastException.class, AgeException.class})public String globalException(Exception ex, HttpServletRequest request) {System.out.println("全局异常处理-" + ex.getMessage());//将异常的信息带到下一个页面.request.setAttribute("reason", ex.getMessage());return "exception_mes";}
}
@Controller
public class MyExceptionHandler {@ExceptionHandler({ArithmeticException.class,NullPointerException.class,NumberFormatException.class})public String localException(Exception ex, HttpServletRequest request){System.out.println("局部异常信息是-" + ex.getMessage());request.setAttribute("reason", ex.getMessage());return "exception_mes";}@RequestMapping(value = "/testGlobalException")public String global(){//1. 模拟了一个异常 NumberFormatException//2. 该异常没有在局部异常处理,按照异常处理机制,就会交给全局异常处理类处理int num = Integer.parseInt("hello");return "success";}
}
局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat默认机制

自定义异常

@ResponseStatus

@ResponseStatus(reason = "年龄需要在1-120之间", value = HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException {public AgeException() {}public AgeException(String message) {super(message);}
}
@Controller
public class MyExceptionHandler {@RequestMapping(value = "/testException02")public String test02(){throw new AgeException("年龄必须在1-120之间~~~");}
}

@ResponseStatus的内容在tomcat默认页面展示出来,并没有传给getMessage()

使用构造器就可以把内容传给getMessage()

可以被全局异常接管,@ExceptionHandler添加自定义异常类名.class即可

@ControllerAdvice
public class MyGlobalException {@ExceptionHandler({ClassCastException.class, AgeException.class})public String globalException(Exception ex, HttpServletRequest request) {System.out.println("全局异常处理-" + ex.getMessage());request.setAttribute("reason", ex.getMessage());return "exception_mes";}
}

统一处理异常信息SimpleMappingExceptionResolver

没有设置局部异常和全局异常

key是异常的全类名,根据视图解析器,指定对应的页面名

   <!--配置统一处理异常Bean--><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop></props></property></bean>
@Controller
public class MyExceptionHandler {@RequestMapping(value = "/testException03")public String test03(){int[] arr = new int[]{3,9,10,190};//抛出一个数组越界的异常 ArrayIndexOutOfBoundsExceptionSystem.out.println(arr[90]);return "success";}
}

对未知异常进行统一处理

对发生了没有归类的异常,可以给出统一提示页面

<prop key="java.lang.Exception">allEx</prop>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python精选200Tips:186-190

针对序列&#xff08;时间、文本&#xff09;数据的网络结构 续 P186-- 双向LSTM(Bidirectional Long Short-Term Memory 2005)&#xff08;1&#xff09;模型结构说明&#xff08;2&#xff09;创新性说明&#xff08;3&#xff09;示例代码&#xff1a;IMDB电影评论情感分析 …

通义灵码 Visual Studio 下载安装指南(附安装包)

文章目录 前言一、下载和安装指南方法 1&#xff1a;从插件市场安装方法 2&#xff1a;下载安装包安装方法 3&#xff1a;登录并开启智能编码之旅 二、使用指南总结 前言 通义灵码是基于通义大模型的智能编程辅助工具&#xff0c;它提供了多种强大的功能&#xff0c;旨在助力开…

【ProtoBuf】基础使用与编译

文章目录 ProtoBuf的使用基本使用指定proto3语法package声明符定义消息(message)定义消息字段字段唯一编号 编译序列化与反序列化序列化与反序列化使用 ProtoBuf的使用 流程如下&#xff1a; 编写 .proto文件&#xff0c;定义结构对象(message)及属性内容使用 protoc 编译器编…

[Halcon矩阵] 通过手眼标定矩阵计算相机旋转角度

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

GS-SLAM论文阅读笔记-MGSO

前言 MGSO首字母缩略词是直接稀疏里程计(DSO)&#xff0c;我们建立的光度SLAM系统和高斯飞溅(GS)的混合。这应该是第一个前端用DSO的高斯SLAM&#xff0c;不知道这个系统的组合能不能打得过ORB-SLAM3&#xff0c;以及对DSO会做出怎么样的改进以适应高斯地图&#xff0c;接下来…

一次性语音芯片:重塑语音识别技术,引领智能化生活新时代

随着一次性语音芯片的突破性进展&#xff0c;语音识别技术正融入我们生活的方方面面&#xff0c;引领着智能化生活迈向一个全新的时代。这些芯片不仅体积小巧、成本低廉&#xff0c;更在性能上实现了质的飞跃&#xff0c;能够更精确地捕捉并理解人类语音。本文将解读关于一次性…

Crypto虐狗记---”你“和小鱼(五)

前言&#xff1a;剧情五 提示&#xff1a; 一种食物&#xff1f; 一种食物——培根&#xff1a;&#xff08;A B 也暗示是培根加密&#xff09; cyberpeace{attackanddefenceworldisinteresting} 密码学笔记——培根密码 - ILK - 博客园 (cnblogs.com)

Appium Device Farm安装教程

环境要求&#xff1a;Appium version ≥ 2.4.X 安装appium npm install -g appium2.11.3 如果安装提示如下问题 npm error code EEXIST npm error syscall rename npm error path /Users/wan/.npm/_cacache/tmp/d5787519 npm error dest /Users/wan/.npm/_cacache/content-…

Android一个APP里面最少有几个线程

Android一个APP里面最少有几个线程 参考 https://www.jianshu.com/p/92bff8d6282f https://www.jianshu.com/p/8a820d93c6aa 线程查看 Android一个进程里面最少包含5个线程&#xff0c;分别为&#xff1a; main线程(主线程&#xff09;FinalizerDaemon线程 终结者守护线程…

cnn突破七(四层bpnet网络公式与卷积核bpnet公式相关)

我们要有一个概念&#xff0c;就是卷积核就是我们的w1&#xff0c;w12&#xff0c;w2 那么我们的5*5卷积核怎么表达&#xff0c;当他在14*14的图像中流动时&#xff0c;对应的像素也在变化 这个和我们的上面w1&#xff0c;w12&#xff0c;w2不同&#xff0c;因为这几个都是全…

7. 整数反转【数学】

文章目录 7. 整数反转解题思路Go代码 7. 整数反转 7. 整数反转 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [−231,231−1] &#xff0…

数学建模算法与应用 第12章 现代优化算法

目录 12.1 粒子群优化算法 Matlab代码示例&#xff1a;粒子群优化算法求解函数最小值 12.2 遗传算法 Matlab代码示例&#xff1a;遗传算法求解函数最小值 12.3 蚁群算法 Matlab代码示例&#xff1a;蚁群算法求解旅行商问题 12.4 Matlab 遗传算法工具 使用遗传算法工具箱…

U盘误删文件?一招教你轻松找回!

大家好&#xff01;今天咱们来聊聊一个让人头疼却又常见的问题——U盘数据丢失。是不是有时候不小心删了个文件&#xff0c;或者格式化了U盘&#xff0c;结果发现重要资料不见了&#xff0c;心里那个急啊&#xff01;别急&#xff0c;别急&#xff0c;今天我就给大家推荐几款免…

Scalable TCP 如何优化长肥管道

来看一个极简的拥塞控制实现 net/ipv4/tcp_scalable.c&#xff0c;去掉注释不到 50 行代码。它的介绍在 Scalable TCP-improving performance in highspeed networks。由于太简单&#xff0c;估计没什么人会在意。 本文说一下它背后的道理。 无论 bic/cubic&#xff0c;westw…

leetcode:反转字符串II

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseStr(string s, int k) {string s1;int i 0;//标记字符串下标int j 0;int length …

react+ts+vite 别名一直爆红问题

已经配置如下代码安装了types/node import path from "path"; // https://vitejs.dev/config/ export default defineConfig({plugins: [react()],server: {proxy: {"/api": {target: "http://localhost:3000",changeOrigin: true,rewrite: (pa…

数字电路尚硅谷学习笔记

学习视频&#xff1a;01_数字电路_从零搭建计算机引导_哔哩哔哩_bilibili 第1章数字电路基础 1.引言 数字电路是现代科技和工程领域中不可或缺的基础。从计算机系统到通信设备&#xff0c;从家庭电子产品到工业自动化&#xff0c;数字电路无处不在&#xff0c;影响着我们的生…

手写mybatis之解析和使用ResultMap映射参数配置

前言 学习源码是在学习什么呢&#xff1f; 就是为了通过这些源码级复杂模型中&#xff0c;学习系统框架的架构思维、设计原则和设计模式。在这些源码学习手写的过程中&#xff0c;感受、吸收并也是锻炼一种思维习惯&#xff0c;并尝试把这些思路技术迁移到平常的复杂业务设计开…

1.MySQL存储过程基础(1/10)

引言 数据库管理系统&#xff08;Database Management System, DBMS&#xff09;是现代信息技术中不可或缺的一部分。它提供了一种系统化的方法来创建、检索、更新和管理数据。DBMS的重要性体现在以下几个方面&#xff1a; 数据组织&#xff1a;DBMS 允许数据以结构化的方式存…

“云计算+高职”:VR虚拟仿真实训室的发展前景

随着科技的飞速进步&#xff0c;云计算与虚拟现实&#xff08;VR&#xff09;技术的结合正在深刻改变着教育领域&#xff0c;尤其是在高等职业教育中&#xff0c;这一融合为实训教学带来了革命性的变革。VR虚拟仿真实训室作为这一变革的前沿阵地&#xff0c;正展现出广阔的发展…