本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考,希望能帮助更多码农和想成为码农的人。
本文转发自头条号【普通的码农】的文章,大家可以关注一下,直接在今日头条的移动端APP中阅读。因为平台不同,会出现有些格式、图片、链接无效方面的问题,我尽量保持一致。

文章目录

    • 介绍
    • 分层思维和单一职责思维
    • 思路
    • 配置Spring MVC和Spring IoC
    • 展示层
    • 模型层
    • 控制器层
    • 验证
    • 中文乱码问题再现
    • 总结

介绍

我们的租房网应用从刚开始的使用Servlet建立,到使用Filter来消除重复,再到使用JSP将展示层初步分离,再到使用JSTL和EL表达式彻底分离展示层,现在看起来已经很不错了。
不过,还存在以下问题:
• 控制器层和模型层尚未分离;
• 如果要使用JSP以外的展示层技术,则还要做很多工作;
• 等等
而要解决这些问题,MVC框架和IoC框架是一个很好的选择,Spring MVC和Spring IoC就是其中一个很流行的组合。
我们前面已经介绍过Spring MVC的核心原理、使用XML配置和整合IoC、使用Java配置和整合IoC、整合基于注解和Java的IoC、基于注解的控制器。
也介绍过Spring IoC的核心原理、基于XML生产和装配Bean、使用注解自动装配Bean、使用注解生产Bean、使用Java生产和装配Bean
所以,我们继续使用Spring MVC和Spring IoC来改造租房网应用吧。

分层思维和单一职责思维

分层思维和单一职责思维紧密联系、密不可分。
分层思维,也可以叫做层级、级别等等;
单一职责思维,就是只干一件事;
它们都可谓是无处不在。
自然界中,蚂蚁、蜜蜂这两个团队都是依据分层和单一职责来划分的。
国家行政机关有省部厅司局等,组织机构也有类似的分层,这些都是管理范畴的。
公路网、铁路网、电信网络等都有主干、次级主干、分支等,这也是一种分层。
做事情的规划也可以分层,百年规划、五十年规划、三十年规划、十年规划、五年规划。
在我们IT行业中,操作系统中也有硬件层、内核层、应用层等;计算机网络中有物理层、数据链路层、网络层、传输层、会话层、表示层、应用层的OSI七层模型;而应用程序开发中,又具有更细的分层,比如MVC,甚至每一个类/接口、每一个方法/函数都可以视之为分层和单一职责的体现。
分层最大的好处是什么?就是每一层只关心和解决一件事,这实际上又是单一职责思维、高内聚的体现。而层与层之间的通信只通过规范好的接口来实现,这就是低耦合的体现。
我们依据分层思维(具体到这就是MVC了),将JSP页面用作展示层,即只是取数据进行展示,而不关心数据是如何取得的。
而数据的查找、计算和存储是由模型层来解决。
控制器层拦截请求、分派请求、串联模型层和展示层进行请求的处理(转换、绑定、校验、调用模型层、转发到展示层或其他组件)、生成响应并发送,我们采用Servlet来实现。具体到Spring MVC,又分为三个层级(DispatcherServlet、Controller、Handler)。我们把对一个请求的处理叫做一个action,所以规定提交给控制器层的请求必须以 .action 为后缀。
再加上JSP页面是以 .jsp 为后缀的,它们都可以称之为资源,只不过JSP页面是数据的展示,控制器层是数据的处理。即请求某个资源,实际上是指请求某些数据进行展示,或者请求某些数据进行处理。
当然,处理结果最后还是要进行展示,所以,最终返回给浏览器端的都是某种数据的某种展示。

思路

展示层往往是从最终用户(可能是普通用户,也可能是开发者用户哦)使用的角度去分析,我们这里主要是JSP页面,仍然是登录页面login.html、登录后会展示用户感兴趣的房源列表页面houses.jsp、可以查看某个房源详情的页面house-details.jsp、可以修改某个房源信息的编辑页面house-form.jsp。
这几个JSP页面因为之前已经改造成了纯粹展示,所以代码基本不用改变。不过,这几个JSP页面内部的链接需要修改为 .action 为后缀的,因为每个链接都需要请求服务端执行查找或处理某些数据的动作啊。
我们再来看看控制器层如何来设计。
Spring MVC的核心是DispatcherServlet,首先要在部署描述符web.xml中配置它。当然,必须配置它拦截所有 .action 为后缀的请求(上面设计的:))。而它又依赖于Spring IoC来配置和管理各种组件,比如控制器、视图解析器等等,所以要提供Spring IoC的配置元数据(基于XML、注解、Java均可)。
那么进一步看看需要几个Controller和Handler。因为我们的租房网应用现在还比较简单,所以把所有动作都放在一个Controller中就行了。
因为请求登录页面仍然是不需要任何数据,所以不需要为它设计任何动作,使用静态页面就可以了。但是,提交登录请求的时候需要服务端验证用户名和密码,这需要一个动作,就叫login.action吧。
登录之后,就需要服务端找到我感兴趣的房源啊,这需要一个动作,就叫houses.action吧。
然后,我想看某个房源的详细信息,也需要服务端去查找那个房源的详细信息(为什么不在找房源列表的同时把每一个房源的详细信息就找到呢?大家也可以想一想),这也需要一个动作,就叫house-details.action吧。
最后,我想编辑某个房源的详细信息,首先需要服务端把该房源的详细信息找到,并以表单的形式展示出来,这需要一个动作,就叫house-form.action吧;而修改完表单中该房源的详细信息之后,需要提交给服务端保存起来,这也需要一个动作,就叫house-form.action吧。哎,等等,怎么这两个动作都叫house-form.action啊?!那该怎么映射到Spring MVC中的Handler呢?这就需要将这两个动作在HTTP层面使用HTTP方法来区分,前者使用GET方法将house-form.action映射到一个Handler;后者使用POST方法映射到另一个Handler。本质上还是两个动作。
租房网目前只用到了模拟的房源数据,连最基本的用户数据都还没有,其实是不太妥当的。不过,这用来做演示已经足够了,何况我们可以慢慢的添加其他数据,一步一步来,这就是演化/迭代思维。
尽管如此,我们把模拟的房源数据也抽象出来,作为我们的模型层(按照目前流行的分层技术,又可以分为服务层和数据访问层,但我们暂时还没有必要这么分)。
根据上面分析,模型层中最主要的服务就是查找某个用户感兴趣的房源列表、根据房源ID查找该房源的详细信息。
下面,我们就一步一步来使用Spring MVC和Spring IoC来改造我们的租房网应用。

配置Spring MVC和Spring IoC

首先,我们要在我们的租房网应用中配置Spring MVC和Spring IoC。
配置的第一步,是把它们的JAR包先引入到工程结构中,可以参考这篇文章(实际上就是直接拷贝)。
在这里插入图片描述
第二步,是要配置Spring MVC的DispatcherServlet,可以使用XML(参考这篇文章),也可以使用Java(参考这篇文章),我这里选择的是使用XML的方式,web.xml的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>house-renter</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/dispatcher.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping>
</web-app>

需要关注的是:
• DispatcherServlet的名称可以随意取,不过最好取个好听的名字;
• 整合Spring IoC,使用的也是基于XML的方式;
• DispatcherServlet拦截的请求是:*.action,可千万不能写成:/*.action,否则Tomcat会启动不了。具体的映射规则可以参考Servlet规范(比如,servlet-4_0_FINAL.pdf)中的“Mapping Requests to Servlets”这一部分。
第三步是整合Spring IoC,使用的也是基于XML的方式。根据DispatcherServlet的配置,创建dispatcher.xml文件:

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

对于Spring IoC的配置,我开启了组件扫描,这样我们就能够使用Spring MVC的基于注解的控制器了。当然,我把所有组件都放在houserenter这个包和它的子包当中。

展示层

展示层的几个HTML、JSP页面的代码只需将链接和表单的URL改为 .action 后缀即可。
• login.html中表单的action属性值改为:login.action;
• include.jsp不用修改;
• houses.jsp中链接的href属性值改为:house-details.action(后面的参数仍然不变,下同);
• house-details.jsp中有两个链接,编辑链接的href属性值改为:house-form.action;回到列表链接的href属性值改为:houses.action;
• house-form.jsp中表单的action属性值改为:house-form.action,同时,method属性值必须是:post,以免跟上面的编辑链接冲突!
改为 .action 后缀的意义对开发人员来说还是挺清晰的,就是要请求服务端执行某个动作啊,当然,这种 .action 后缀的请求都将由DispatcherServlet拦截并分派给各个Controller中的各个Handler。
每个JSP页面中的数据(即绑定到该页面的数据对象的名称)仍然沿用原来的,比如房源列表页面houses.jsp使用mockHouses(它是一个House对象的List);房源详情页面和房源编辑页面使用target(它是一个House对象)。

模型层

因为控制器层依赖于模型层,所以我们还是先来实现模型层吧。
根据前面分析,我们只需要实现一个房源服务即可,就叫HouseService吧,它有两个方法,一个是查找用户感兴趣的房源列表,就叫findHousesInterested();一个是根据房源ID查找房源详情的方法,就叫findHouseById()吧。
因为HouseService将为持续到来的请求提供服务,所以应该在租房网应用运行期间初始化一个实例之后常驻内存,这样才能保证请求更加快速地得到处理。我们不就可以使用Spring IoC的@Service注解自动生成Bean并交给Spring IoC容器来管理了吗?!
它使用模拟的房源数据,当然在该组件初始化的时候装载它们即可。
当然,它仍然使用的是原来entity包中的House类。实际上,实体类也应该属于模型层。而控制器层应该将传输对象转换为实体对象,但我这里都是使用的实体对象,因为它们是一致的。
同时,为了体现分层思维,需要另外建立一个service包,将HouseService类放入此包中。

package houserenter.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
import houserenter.entity.House;
@Service
public class HouseService {private List<House> mockHouses;public HouseService() {mockHouses = new ArrayList<House>();mockHouses.add(new House("1", "金科嘉苑3-2-1201", "详细信息"));mockHouses.add(new House("2", "万科橙9-1-501", "详细信息"));}public List<House> findHousesInterested(String userName) {// 这里查找该用户感兴趣的房源,省略,改为用模拟数据return mockHouses;}public House findHouseById(String houseId) {for (House house : mockHouses) {if (houseId.equals(house.getId())) {return house;}}return null;}
}

控制器层

根据前面的思路,我把所有动作都放在了一个控制器中,就叫HouseRenterController吧。当然,运行时需要生成它的Bean,我们仍然可以使用Spring IoC。因为我们已经开启了组件扫描,所以只要为该类加上注解@Controller即可。
然后,它依赖于模型层的HouseService,而HouseService也使用Spring IoC来自动生成Bean,所以可以使用@Autowired注解自动装配它们。
然后,就是各个Handler的声明,可以参考这篇文章。Handler的声明采用@RequestMapping及其衍生注解如@GetMapping和@PostMapping等。
各个Handler与动作是一一对应的:
• 处理登录请求:@PostMapping("/login.action")
• 获取房源列表:@GetMapping("/houses.action")
• 获取房源详情:@GetMapping("/house-details.action")
• 获取房源编辑表单:@GetMapping("/house-form.action")
• 处理房源更新请求:@PostMapping("/house-form.action")
虽然,获取房源编辑表单和处理房源更新请求的URL是一样的,但是可以通过HTTP方法来匹配这两个不同的请求。
而各个Handler的实现,也可以参考这篇文章。我主要是使用ModelAndView这个类来作为Handler的返回值;而请求中携带的参数直接使用字符串类型,所以可以省略@RequestParam注解,只要保证参数名与请求中的参数名一致即可。
ModelAndView可以绑定我们希望视图层展示的数据对象,也是保证数据的名字与视图中(这里是JSP页面)中使用的名字一致即可。它使用的是addObject()等方法。
ModelAndView可以设置希望将请求转发到哪一个视图(这里是JSP页面)或动作,或者重定向到哪一个视图(这里是JSP页面)或动作。它使用的是setViewName()等方法,重定向的视图名需要带一个前缀:“redirect:”。
至于各个Handler具体的业务处理规则,还是相当简单的。

package houserenter.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import houserenter.entity.House;
import houserenter.service.HouseService;
@Controller
public class HouseRenterController {@Autowiredprivate HouseService houseService;@GetMapping("/test.action")@ResponseBodypublic String test() {return "hello";}@PostMapping("/login.action")public ModelAndView postLogin(String userName, String password) {//这里需要验证用户是否已经注册,省略System.out.println("userName: " + userName + ", password: " + password);ModelAndView mv = new ModelAndView();//重定向到查找感兴趣房源列表的动作mv.setViewName("redirect:houses.action?userName=" + userName);return mv;}@GetMapping("/houses.action")public ModelAndView getHouses(String userName) {//这里需要验证用户是否登录,省略ModelAndView mv = new ModelAndView();//查找感兴趣房源并绑定到相应JSP页面,然后将请求转发到该页面mv.addObject("mockHouses", houseService.findHousesInterested(userName));mv.setViewName("houses.jsp?userName=" + userName);return mv;}@GetMapping("/house-details.action")public ModelAndView getHouseDetails(String userName, String houseId) {// 这里需要验证用户是否登录,省略ModelAndView mv = new ModelAndView();//查找房源详情并绑定到相应JSP页面,然后将请求转发到该页面mv.addObject("target", houseService.findHouseById(houseId));mv.setViewName("house-details.jsp?userName=" + userName);return mv;}@GetMapping("/house-form.action")public ModelAndView getHouseForm(String userName, String houseId) {// 这里需要验证用户是否登录,省略ModelAndView mv = new ModelAndView();//查找房源详情并绑定到相应JSP页面,然后将请求转发到该页面mv.addObject("target", houseService.findHouseById(houseId));mv.setViewName("house-form.jsp?userName=" + userName);return mv;}@PostMapping("/house-form.action")public ModelAndView postHouseForm(String userName, String houseId, String houseName, String houseDetail) {// 这里需要验证用户是否登录,省略//更新指定房源的详情House target = houseService.findHouseById(houseId);target.setName(houseName);target.setDetail(houseDetail);//将请求转发到查找房源详情的动作ModelAndView mv = new ModelAndView();mv.setViewName("redirect:house-details.action?userName=" + userName + "&houseId=" + houseId);return mv;}
}

在Handler方法的取名上,我也是根据HTTP方法加了get、post等前缀。
需要注意的是,处理登录请求和处理房源更新请求这两个Handler最后都采用了重定向。因为它们的目标资源都是GET动作,而这两个请求都是POST请求,如果采用转发,则这两个请求直接交由目标资源的GET动作来处理,这就不匹配了;重定向则是将这两个请求先返回响应给浏览器,浏览器再重新发起对目标资源的GET请求。

验证

我们可以在Eclipse中发布租房网应用到Tomcat服务器,然后启动Tomcat服务器(可以参考这篇文章)。
我们打开浏览器,输入登录页面的URL:

http://localhost:8080/house-renter/login.html

登录后即可看到房源列表页面,URL也相应变为:

http://localhost:8080/house-renter/houses.action?userName=a

点击某个房源,可以打开该房源的详细信息页面,然后可以进一步编辑该房源的详细信息,提交后,却发现可恶的中文乱码问题再次出现!

中文乱码问题再现

此次出现中文乱码问题还是在提交房源详情请求的处理上,我们可以先通过日志打印的方式把提交的数据(房源名称、详情等)打印出来,看是否是乱码。
果然,在这一步已经是乱码,我们可以大胆猜想Spring MVC和Servlet一样,对数据的编码方式默认都是ISO-8859-1,而String类默认编码和解码是UTF-8。即Spring MVC收到的数据的二进制是ISO-8859-1编码方案的二进制,而输出的时候却使用UTF-8去解码。
所以,我们可以使用以下方式进行转换:

new String(houseName.getBytes("iso-8859-1"), "utf-8")

结果还真是解决了乱码问题。唯一的问题是把这个转换代码放到此处有点不太合适,我们是否可以像之前一样使用Filter来解决这种通用维度的问题?
答案当然是可以的。不过这个Filter不需要我们来实现了,Spring MVC已经提供了这么一个Filter,就是:

org.springframework.web.filter.CharacterEncodingFilter

我们只需要在部署描述符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>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

总结

这次我们真正的把Spring MVC和Spring IoC用到了看起来有用一点的项目上,从代码上来看也还不赖(可以把原来的filter包和servlet包删除),层次还是比较清晰的。
• controller包
• entity包
• service包
• 展示层的HTML页面和JSP页面放在WebContent下
• 配置文件放在WebContent/WEB-INF下
代码也比较干净:
• 展示层和控制器层的数据都通过名字来绑定和解绑,Spring MVC帮我们做了,我们就无需使用getParameter()这样的方法来自己转换了。
• 一些通用维度的功能比如字符编码,Spring MVC也提供了相应的Filter,我们只要配置即可,无需在代码中实现。
• 等等。
当然,也还存在很多改进之处:
• 异常处理还没有;
• 用户登录验证也没有;
• 像房源编辑的数据能否直接绑定到一个House对象中;
• 使用的还是模拟数据;
• 等等。
不过,以后我们再继续介绍其他技术的时候,我们就可以一直使用租房网这个应用,慢慢改进和完善吧。

普通的码农
发布了37 篇原创文章 · 获赞 9 · 访问量 3262
私信关注
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 部落冲突

    题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落。其中最为强大的是罗马、高卢和日耳曼。他们之间为了争夺资源和土地,进行了无数次的战斗。期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事。 其中,在大大小小的部落之间,会有一些道路相连…...

    2024/4/12 18:16:18
  2. Redis

    Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(请允许我使用一下夸张的修辞…...

    2024/4/23 22:33:38
  3. 走进大数据丨 Hadoop生态体系

    Hadoop是一个由Apache基金会所开发的分布式系统的基础架构。用户可以在不了解分布式的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop优点1.高可靠性:Hadoop按位存储和处理数据的能力值得人们信赖。2.高扩展性:Hadoop是在可用的计算机集簇间分配数据…...

    2024/4/23 8:11:39
  4. 蠎周刊-398-MicroPython 物联网编程没问题

    原文: PyCoders Weekly - Issue #398191211 Zoom.Quiet(大妈) 用时 42 分钟 完成快译 191211 Zoom.Quiet(大妈) 用时 17 分钟 完成格式转抄.------MicroPython: Python编程硬件简介REAL PYTHONAre you interested in the Internet of Things, home automation, and connected d…...

    2024/4/22 19:55:02
  5. 假设你是个妹子

    假设你是个妹子,你有一位男朋友,于此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人。你随时可以甩了现任男友,另外一位马上就能补上。这是冷备份。 假设你是个妹子,同时和两位男性在交往,两位都是你男朋友。并且他们还互不干涉,独立运行。这就是双机热备份。 假设…...

    2024/4/24 3:52:16
  6. 傅里叶分析之掐死教程

    傅里叶分析之掐死教程(完整版)更新于2014.06.06Heinrich生娃学工打折腿知乎日报收录作 者:韩 昊知 乎:Heinrich微 博:@花生油工人知乎专栏:与时间无关的故事谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。转载的同学请保留上面这句话,谢谢…...

    2024/4/24 8:36:21
  7. pyspark相关配置

    hadoop(配置文件都在$HADOOP_HOME/etc/hadoop)hadoop.env.sh#export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=/opt/modules/jdk1.8.0_11#配置java_homecore-site.xml<configuration><property><name>fs.default.name</name><value>hdfs://pysp…...

    2024/4/18 19:30:13
  8. final,finally,finalize的区别

    一.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文…...

    2024/4/19 18:04:40
  9. python中的递归

    python中的递归 在函数内部调用自己本身就是递归 例如阶乘和累加 累加 def sum(n):if n == 1:return 1return n + sum(n-1) print(sum(3)) 运行结果 6 ===> sum(3) ===> 3 + sum(2) ===> 3 + (2 + sum(1)) ===> 3 + (2 + 1) ===> 6 阶乘 def fact(n):if n == 1:…...

    2024/4/24 17:28:52
  10. sql基础教程--4

    1.数据插入insert insert into 表名(列名1,列名2,列名3) values(值1,值2,值3); 字符型要是’’ 列名可以省,这样的话,从左到右进行插入数据。 可以插入null ,但是插入null值的时候,列的约束可以为空。 在创建表的时候,可以指定默认值 default 值 在插入的时候可以用关…...

    2024/4/19 12:28:16
  11. fiddler手机抓包 手机应用显示证书无效,证书过期的决解办法

    试了好多办法 手机应用都无法正常上网,最后发现是由于电脑上安装的fiddler版本太低导致,最后对fiddler进行了update,把手机上 电脑上 所有的fiddler证书都移除,重新安装,最后解决了。以下是手机和电脑删除重新安装证书的图示步骤,大家参考下:电脑删除:电脑增加:手机删…...

    2024/4/8 1:29:56
  12. Spring的后置处理器到底是怎么回事?

    这里要介绍的是Spring的扩展类点之一的:BeanPostProcessor. 废话不多说,开搞! 1.准备代码TestProcessor类@Component public class TestProcessor implements BeanPostProcessor ,PriorityOrdered{@Overridepublic Object postProcessBeforeInitialization(Object bean, String…...

    2024/4/24 3:57:18
  13. 自学CS & Data Science 近期资源总结

    学习的道路上,能够找到优质的资源,比看n多教程要强。 最近挖掘了斯坦福大学的CS主页,找到了很多有意思的资源教案,可以花点时间浏览一下对CS和自己感兴趣的主题深入了解。 0-CS启蒙: CS 101 :Introduction to Computing Principles --有视频,但是个人觉得视频效率有点低。…...

    2024/3/29 4:39:46
  14. 实现多线程安全的3种方式

    1、先来了解一下:为什么多线程并发是不安全的?在操作系统中,线程是不拥有资源的,进程是拥有资源的。而线程是由进程创建的,一个进程可以创建多个线程,这些线程共享着进程中的资源。所以,当线程一起并发运行时,同时对一个数据进行修改,就可能会造成数据的不一致性,看下…...

    2024/4/20 16:28:03
  15. Stack

    Stack 问题 一、简介 优点:Stack是线程安全的,底层是数组 缺点: 二、继承关系图是浅拷贝 Stack实现了继承Vector,具有线程安全,除了push方法,其他都加了synchornized 实现了RandomAccess接口,for 循环速度比迭代速度快 三、存储结构 四、源码分析 内部类 无 属性 无 构造…...

    2024/4/18 16:08:08
  16. Mysql : InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800!

    Mysql报错,是因为自己之前装的高版本然后再装低版本导致的 [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800! 2019-12-10 22:37:46 0x7f416f5ff780 InnoDB: Assertion failure in thread 139919018162048 in file ut0…...

    2024/4/19 20:39:24
  17. vscode格式化代码

    vscode格式化代码vscode格式化代码快捷键注意事项 vscode格式化代码快捷键 Shift + Alt + F 注意事项 编写lua,安装了Lua Coder Assistant,发现格式化代码时,会默认将双引号变成单引号,可以去用户设置界面,Extensions->Lua Coder Assistant Configuration->Quotemar…...

    2024/4/18 20:50:39
  18. vue,element-ui中的上传upload组件,使用方法,使用详解

    之前写了一个项目,涉及到文档和视频的上传.需求大概是这个样子,拿上传视频举例子吧,首先是将选择的视频上传到文件服务器上,接着文件服务器会返回视频的存储链接还有视频名,在后面保存视频的时候会用到这两个参数的.另外,上传成功的视频名字要显示在左侧,并且是可以修改的.视频…...

    2024/4/23 4:28:43
  19. SpringCloud初探之Eureka

    Eureka 1.1.原理图(重要)原理说明Eureka:就是服务注册中心(可以是一个集群),对外暴 露自己的地址 提供者:启动后向Eureka注册自己信息(地址,提供什么服务) 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新 心跳(续约):…...

    2024/4/19 21:40:00
  20. 【多线程】如何保证线程安全

    一、线程安全等级 之前的博客中已有所提及“线程安全”问题,一般我们常说某某类是线程安全的,某某是非线程安全的。其实线程安全并不是一个“非黑即白”单项选择题。按照“线程安全”的安全程度由强到弱来排序,我们可以将java语言中各种操作共享的数据分为以下5类:不…...

    2024/4/19 12:08:50

最新文章

  1. c++24.4.22-结构体嵌套结构体

    实践&#xff1a;...

    2024/4/25 10:24:37
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. java的gradle,maven工程中使用selenium

    一、下载selenium库 &#xff08;1&#xff09;gradle工程 工程中会有一个build.gradle.kts的文件&#xff0c;这个文件可以定制 Gradle 的行为 在文件中添加下面代码&#xff0c;然后sync // implementation ("org.seleniumhq.selenium:selenium-java:4.19.1") …...

    2024/4/24 9:20:47
  4. 【ARM 嵌入式 C 文件操作系列 20 -- 文件删除函数 remove 详细介绍】

    请阅读【嵌入式开发学习必备专栏 】 文章目录 文件删除函数 remove 文件删除函数 remove 在 C 语言中&#xff0c; 可以使用 remove 函数来删除一个文件&#xff0c;但在删除之前 可能想确认该文件是否存在。 可以使用 stat 函数来检查文件是否存在。 以下是如何实现这个功能…...

    2024/4/25 7:29:23
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/23 20:58:27
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/23 13:30:22
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/23 13:28:06
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/24 18:16:28
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/23 13:27:44
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/23 13:29:53
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/23 13:27:22
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/23 13:28:42
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/23 22:01:21
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/23 13:29:23
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/24 16:38:05
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/23 13:28:14
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/23 13:27:51
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/23 13:27:19
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57