当前位置: 首页 > 编程日记 > 正文

Spring Web MVC(一)

  • 概述
    • Spring Web MVC框架的特点
    • 五大核心组件
    • 编程步骤
  • 五大核心组件
    • DispatcherServlet前端控制器
      • WebApplicationContext中特殊的bean
      • 处理过程
    • HandlerMapping 处理映射
      • Spring中最常用的两个处理器映射
      • BeanNameUrlHandlerMapping
      • SimpleUrlHandlerMapping
      • 拦截器HandlerInterceptor

概述

Spring的web框架围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器。 Spring的web框架包括可配置的处理器(handler)映射、视图(view)解析、本地化(local)解析、 主题(theme)解析以及对文件上传的支持。Spring的Web框架中缺省的处理器是Controller 接口,这是一个非常简单的接口,仅包含ModelAndView handleRequest(request, response) 方法。可以通过实现这个接口来创建自己的控制器(也可以称之为处理器),但是更推荐继承Spring提供的一系列控制器, 比如AbstractController、AbstractCommandController 和SimpleFormController。

Spring Web MVC框架的特点

Spring的web模块提供了大量独特的功能,包括:

  • 清晰的角色划分:控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(form object)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、 处理器映射(handler mapping)、视图解析器(view resolver)等等。 每一个角色都可以由一个专门的对象来实现。

  • 强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器(validator)的引用。

  • 可适配、非侵入:可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。

  • 可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。

  • 可定制的绑定(binding) 和验证(validation):比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象, 需要手动解析它并转换到业务对象。

  • 可定制的handler mapping和view resolution:Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些web MVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。

  • 灵活的model转换:在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。

  • 可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。

  • 简单而强大的JSP标签库(Spring Tag Library):支持包括诸如数据绑定和主题(theme) 之类的许多功能。它提供在标记方面的最大灵活性。如欲了解详情,请参阅附录附录 D, spring.tld

  • Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。 准确的说,这并非Spring MVC框架本身特性,而应归属于Sping MVC使用的WebApplicationContext容器。

五大核心组件

  • DispatcherServlet (前端控制器)

  • HandlerMapping (处理映射)

  • Controller (处理器)

  • ModelAndView (处理结果)

  • ViewResolver (视图解析器)

    1. 请求先发送给DispatcherServlet,DispatcherServlet会 依据HandlerMapping的指示调用对应的Controller来处理。
    2. Controller将处理结果封装成ModelAndView并返回给 DispatcherServlet。
    3. DispatcherServlet会依据ViewResolver的解析,调用对应的 视图对象(比如jsp),生成最终的页面。

过程如下图
这里写图片描述

编程步骤

  1. 导包
  2. 添加spring配置文件(空白的配置文件)
  3. 配置DispatcherServlet(web.xml)
  4. 写Controller(业务逻辑)
  5. 写jsp
  6. 在spring配置文件当中,添加HandlerMapping, ViewResolver的配置信息。

注意:
a. 不用实现Controller接口。
b. 可以添加多个处理方法。
c. 处理方法的名称可以自定义,方法的返回值可以是
ModelAndView,也可以是String。
d. 在类名前,添加 @Controller注解。
e. 可以在类名前或者处理方法前面添加 @RequestMapping注解。
该注解的作用相当于HandleMapping。
step5. 写jsp。
step6. 在spring配置文件当中,添加ViewResolver的配置信息。
注意:添加组件扫描(component-scan base-package)。
添加mvc注解扫描(annotation-driven)。
spring配置文件

<?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:jdbc="http://www.springframework.org/schema/jdbc"  xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:util="http://www.springframework.org/schema/util"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd"><!-- 在这里写配置文件的内容  --><!-- 配置HandleMapping。设置请求路径与处理器的对应关系。--><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/hello.do">helloController</prop></props></property></bean><!-- 配置处理器 --><bean id="helloController" class="controller.HelloController"/><!-- 配置视图解析器。负责将视图名解析成真正的视图对象,比如将"hello"解析成hello.jsp。--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/"/><property name="suffix" value=".jsp"/></bean>
</beans>

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_2_5.xsd" version="2.5"><servlet><servlet-name>action</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- DispatcherServlet的初始化方法会启动spring容器,所以,需要告诉它spring配置文件的位置。--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:app.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern>
</servlet-mapping></web-app>

五大核心组件

DispatcherServlet(前端控制器)

Spring Web MVC DispatcherServlet处理请求的流程

这里写图片描述

DispatcherServlet实际上是一个Servlet (它继承了HttpServlet)。与其它Servlet一样, DispatcherServlet定义在web应用的web.xml文件中。 DispatcherServlet处理的请求必须在同一个web.xml文件里使用url-mapping定义映射。

<web-app><servlet><servlet-name>example</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>example</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping></web-app>

在上面的例子里,所有以.do结尾的请求都会由名为 example的DispatcherServlet处理。这只是配置Spring Web MVC 的第一步。接下来需要配置DispatcherServlet本身和Spring Web MVC 框架用到的其他的bean。
  注意:
   默认情况下,如果没有配置contextConfigLocation(即没有指定spring配置文件的位置),在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。这些bean会覆盖在全局范围(global cope)中定义的同名的bean。

在web MVC框架中,每个 DispatcherServlet有它自己的WebApplicationContext ,这个context继承了根 WebApplicationContext 的所有bean定义。这些继承的bean也可以在每个serlvet自己的所属的域中被覆盖(override),覆盖后的bean 可以被设置成只有这个servlet实例自己才可以使用的属性。

Spring的DispatcherServlet有一组特殊的bean, 用来处理请求和渲染相应的视图。这些bean包含在Spring的框架里,可以在 WebApplicationContext中配置,配置方式与配置其它bean相同。

WebApplicationContext中特殊的bean

Bean类型描述
控制器(Controllers)控制器 实现的是MVC中的C
处理器映射(Handler mapping)处理器映射包含预处理器(pre-processor), 后置处理器(post-processor)和控制器的列表,它们在符合某种条件时才被执行(例如符合控制器指定的URL)。
处理器映射(Handler mapping)视图解析器 可以将视图名解析为对应的视图。
本地化解析器(Locale resolver)视图解析器 可以将视图名解析为对应的视图。
主题解析器(Theme resolver)主题解析器能够解析你的web应用所使用的主题,以提供个性化的布局。
文件上传解析器(Multipart File resolver)文件上传解析器提供HTML表单文件上传功能
处理器异常解析器(Handler exception resolver(s))处理器异常解析器可以将异常对应到视图,或者实现更加复杂的异常处理逻辑。

处理过程

DispatcherServlet配置完成后,当相应的请求到达时,处理就开始了。 下面的列表描述了DispatcherServlet处理请求的全过程

  • 找到WebApplicationContext并将其绑定到请求的一个属性上, 以便控制器和处理链上的其它处理器能使用WebApplicationContext。 默认的属性名为DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE。

  • 将本地化解析器(localResolver)绑定到请求上,这样使得处理链上的处理器在处理请求(准备数据、显示视图等等) 时能进行本地化处理。若不使用本地化解析器,也不会有任何副作用,因此如果不需要本地化解析,忽略它即可。

  • 将主题解析器绑定到请求上,这样视图可以决定使用哪个主题。如果你不需要主题,可以忽略它,不会有任何影响。

  • 如果上传文件解析器被指定,Spring会检查每个接收到的请求是否存在上传文件,如果存在, 这个请求将被封装成MultipartHttpServletRequest以便被处理链中的其它处理器使用

  • 找到合适的处理器,执行和这个处理器相关的执行链(预处理器,后置处理器,控制器),以便为视图准备模型数据(用于渲染)。

  • 如果模型数据被返回,就使用配置在WebApplicationContext中的视图解析器显示视图, 否则视图不会被显示。有多种原因可以导致返回的数据模型为空,比如预处理器或后处理器可能截取了请求,这可能是出于安全原因, 也可能是请求已经被处理,没有必要再处理一次。

    请求处理过程中抛出的异常,可以被任何定义在WebApplicationContext中的异常解析器所获取。 使用这些异常解析器,可以在异常抛出时根据需要定义特定行为。

    Spring的DispatcherServlet也支持返回Servlet API定义的last-modification-date
      决定某个请求的最后修改日期很简单:

    DispatcherServlet会首先寻找一个合适的handler mapping,检查从中取得指定的处理器是否实现了 LastModified接口,如果是,将调用long getLastModified(request)方法,并将结果返回给客户端。

HandlerMapping (处理映射)

通过处理器映射,可以将web请求映射到正确的处理器(handler)上。
  HandlerMapping的基本功能是将请求传递到HandlerExecutionChain上。

  • 首先,这个HandlerExecutionChain必须包含一个能处理该请求的处理器。

  • 其次,这个链也可以包含一系列可以拦截请求的拦截器。

    当收到请求时,DispatcherServlet将请求交给处理器映射,让它检查请求并找到一个适当的HandlerExecutionChain。 然后,DispatcherServlet执行定义在链中的处理器和拦截器(interceptor)。
      在处理器映射中通过配置拦截器(包括处理器执行前、执行后、或者执行前后运行拦截器)将使其功能更强大。 同时也可以通过自定义HandlerMapping来支持更多的功能。

    比如如下例子:一个自定义的处理器映射不仅可以根据请求的URL,而且还可以根据和请求相关的特定session状态来选择处理器。

Spring中最常用的两个处理器映射

它们都是AbstractHandlerMapping的子类,同时继承了下面这些属性:

属性描述
interceptors在映射中使用的拦截器列表(拦截器(HandlerInterceptor))
defaultHandler缺省的处理器。 当没有合适的处理器可以匹配请求时,该处理器就会被使用。
order根据每个映射的order属性值 (由org.springframework.core.Ordered 接口定义),Spring 将上下文中可用的映射进行排序,然后选用第一个和请求匹配的处理器。
alwaysUseFullPath如果这个属性被设成true,Spring 将会使用绝对路径在当前的servlet context中寻找合适的处理器。 这个属性的默认值是false,在这种情况下,Spring会使用当前servlet context中的相对路径。
urlDecode这个属性的默认值是true。 如果想比较编码后的路径,可以把这个属性设为false。 不过,需要注意的是,HttpServletRequest总是返回解码后的servlet路径, 与编码后的格式进行比较时可能不会匹配。
lazyInitHandlers这个属性允许设置是否延迟singleton处理器的初始化工作(prototype处理器的初始化都是延迟的)。 这个属性的默认值是false。

注意:
  最后三个属性只有org.springframework.web.servlet.handler.AbstractUrlHandlerMapping的子类才有。

BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping是一个简单但很强大的处理器映射,它将收到的HTTP请求映射到bean的名称(这些bean需要在web应用上下文中定义)。

当使用BeanNameUrlHandlerMapping时,我们用如下方式将包含http://samples.com/editaccount.form的访问请求映射到指定的FormController上:

<beans><bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><bean name="/editaccount.form" class="org.springframework.web.servlet.mvc.SimpleFormController"><property name="formView" value="account"/><property name="successView" value="account-created"/><property name="commandName" value="account"/><property name="commandClass" value="samples.Account"/></bean>
<beans>

所有对/editaccount.form的请求就会由上面的FormController处理。 当然我们得在web.xml中定义servlet-mapping,接受所有以.form结尾的请求。

<web-app>...<servlet><servlet-name>sample</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><!-- maps the sample dispatcher to *.form --><servlet-mapping><servlet-name>sample</servlet-name><url-pattern>*.form</url-pattern></servlet-mapping>...
</web-app>

注意
  要使用BeanNameUrlHandlerMapping,无须(如上所示)在web应用上下文中定义它。 缺省情况下,如果在上下文中没有找到处理器映射,DispatcherServlet会为你创建一个BeanNameUrlHandlerMapping

SimpleUrlHandlerMapping

它在应用上下文中可以进行配置,并且有Ant风格的路径匹配功能。
  例子:

<web-app>...<servlet><servlet-name>sample</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><!-- maps the sample dispatcher to *.form --><servlet-mapping><servlet-name>sample</servlet-name><url-pattern>*.form</url-pattern></servlet-mapping><!-- maps the sample dispatcher to *.html --><servlet-mapping><servlet-name>sample</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping>...
</web-app>

上面的web.xml设置允许所有以.html和.form结尾的请求都由这个sample DispatcherServlet处理。

<beans><!-- no 'id' required, HandlerMapping beans are automatically detected by the DispatcherServlet --><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><value>/*/account.form=editAccountFormController/*/editaccount.form=editAccountFormController/ex/view*.html=helpController/**/help.html=helpController</value></property></bean><bean id="helpController"class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/><bean id="editAccountFormController"class="org.springframework.web.servlet.mvc.SimpleFormController"><property name="formView" value="account"/><property name="successView" value="account-created"/><property name="commandName" value="Account"/><property name="commandClass" value="samples.Account"/></bean>
<beans>

这个处理器映射首先将对所有目录中文件名为help.html的请求传递给helpController。 helpController是一个UrlFilenameViewController。 对ex目录中所有以view开始,以.html 结尾的请求都会被传递给helpController。 同样的,我们也为editAccountFormController定义了两个映射。

拦截器(HandlerInterceptor)

Spring的处理器映射支持拦截器
  处理器映射中的拦截器必须实现org.springframework.web.servlet包中的HandlerInterceptor接口。 这个接口定义了三个方法,

  • 一个在处理器执行前被调用,

  • 一个在处理器执行后被调用,

  • 一个在整个请求处理完后调用。
      这三个方法提供你足够的灵活度做任何处理前后的操作。

preHandle(..)方法有一个boolean返回值。 使用这个值,可以调整执行链的行为。
  当返回true时,处理器执行链将继续执行;
  当返回false时,DispatcherServlet认为该拦截器已经处理完了请求(比如显示正确的视图),而不继续执行执行链中的其它拦截器和处理器。

例子:
  下面提供了一个拦截器,它拦截所有请求,如果当前时间不是在上午9点到下午6点,它将用户重定向到某个页面。

<beans><bean id="handlerMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="interceptors"><list><ref bean="officeHoursInterceptor"/></list></property><property name="mappings"><value>/*.form=editAccountFormController/*.view=editAccountFormController</value></property></bean><bean id="officeHoursInterceptor"class="samples.TimeBasedAccessInterceptor"><property name="openingTime" value="9"/><property name="closingTime" value="18"/></bean>
<beans>
package samples;public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {private int openingTime;private int closingTime;public void setOpeningTime(int openingTime) {this.openingTime = openingTime;}public void setClosingTime(int closingTime) {this.closingTime = closingTime;}public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {Calendar cal = Calendar.getInstance();int hour = cal.get(HOUR_OF_DAY);if (openingTime <= hour < closingTime) {return true;} else {response.sendRedirect("http://host.com/outsideOfficeHours.html");return false;}}
}

所有的请求都将被TimeBasedAccessInterceptor截获, 如果当前时间不在上班时间,用户会被重定向到一个静态html页面,提供诸如只有上班时间才能访问网站之类的告示。

Spring还提供了一个adapter类HandlerInterceptorAdapter让用户更方便的扩展HandlerInterceptor接口。

拦截器和过滤器比较重要我对单独整理的,大家到我主页可以看下。

相关文章:

技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证

背景 最近&#xff0c;自己在技术精进方向上有所犹豫&#xff0c;是往"网络渗透"的方向走呢&#xff1f;还是往"量化交易"的方向走&#xff1f; 如果选择精进“网络渗透”&#xff0c;就需要学习各种Web渗透技术、客户端渗透技术、移动环境渗透技术、社会…

零基础学习java软件开发攻略

Java是主流开发语言&#xff0c;应用普遍。Spring Boot是Java开发时常用框架&#xff0c;有非常丰富的组件和易用的功能。实际开发工作中涉及到的知识点比较多&#xff0c;将它们分门别类&#xff0c;专题攻关&#xff0c;由点到面&#xff0c;学习效率非常高。 软件开发系统学…

Linux--档案/目录 权限及修改

首先所有权限对于三类用户分别设定&#xff1a; User(所有者) / Group(组群) / Others(其他)。 权限也是有三种&#xff1a;Read / Write / eXecute&#xff0c;这三种权限对于文档和目录有不同的意义。 1. 对于文档&#xff1a; Read&#xff1a;可以查看文档的内容 Write&…

sklearn:Python语言开发的通用机器学习库

引言&#xff1a;深入理解机器学习并全然看懂sklearn文档&#xff0c;须要较深厚的理论基础。可是。要将sklearn应用于实际的项目中&#xff0c;仅仅须要对机器学习理论有一个主要的掌握&#xff0c;就能够直接调用其API来完毕各种机器学习问题。本文选自《全栈数据之门》。将向…

资料分享:送你一本《BigONE Developer API V2》电子书!

背景 昨天&#xff0c;我推送了一篇技术图文《如何利用 BigOne 的 API 制作自动化交易系统 – 身份验证》&#xff0c;里面提到了 BigONE Developer API V2。为了方便自己也方便他人&#xff0c;所以把这份文档整理成 PDF。如果大家对封装 BigONE 提供的 API 感兴趣可以下载这…

Web前端培训面试攻略

学会web前端技术之后&#xff0c;接下来就是要找到一份合适的工作&#xff0c;今天小编要跟大家分享的文章是关于web前端面试攻略&#xff0c;做好这些可以给面试环节加分&#xff0c;找到合适的工作几率会更高&#xff0c;希望本篇文章能够对大家有所帮助。 ​  Web前端培训…

微软鲍尔默回应被苹果超越:将开发更好产品

针对苹果超过微软成为全球市值最高的高科技公司的消息&#xff0c;微软首席执行官史蒂夫鲍尔默 (Steve Ballmer)周四表示&#xff0c;其目标是开发更好的产品&#xff0c;提高盈利能力。鲍尔默周四在印度首都新德里说&#xff0c;“我每天思考的是如何改进产品、如何使产品更 具…

技术图文:如何利用C#实现Huffman编码?

背景 Huffman编码 在通信和数据压缩领域具有重要的应用。 在介绍 Huffman 编码具体实现之前&#xff0c;先介绍几个相关的概念。 概念1&#xff1a;树中结点的带权路径长度 – 根结点到该结点的路径长度与该结点权值的乘积。 概念2&#xff1a;树的带权路径长度 – 树中所有…

ELK 5.x日志分析 (二) Elasticserach 5.2 安装

2019独角兽企业重金招聘Python工程师标准>>> 解压安装包到/opt/elasticsearch 目录下面 [roots1-prod-it-web01 opt]# tree -L 1 elasticsearch/ elasticsearch/ ├── bin ├── config ├── lib ├── LICENSE.txt ├── modules ├── NOTICE.txt ├── …

什么样的人适合学习UI?

UI时代的到来&#xff0c;让我们的生活都多姿多彩&#xff0c;很多企业越来越注重UI设计这方面&#xff0c;想要学习UI设计的人也越来越多&#xff0c;暗恶魔什么样的人适合学习UI呢? 什么样的人适合学习UI? 目前的UI设计很多都是停留在手机端设计&#xff0c;网页&#xff0…

Uva 10074【递推dp】

UVa 10074 题意:求01矩阵的最大子0矩阵。 http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2 这里说的很清楚。先求Largest Empty Interval,枚举每个点为矩形的右下角。 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<…

金融时报:谷歌撤离中国有99.9%的可能性

据国外媒体报道&#xff0c;英国《金融时报》周六发表文章称&#xff0c;谷歌与中国政府就监管问题的谈判显然陷入僵局&#xff0c;而这家世界最大的搜索引擎关闭中国业务现在有99.9%的可能性。《金融时报》称&#xff0c;谷歌已经制定了关闭中国搜索引擎的详细计划。该报援引一…

技术图文:匿名方法是怎样演变为Lambda表达试的?

背景 “Lambda 表达式”&#xff08;lambda expression&#xff09;是一个匿名函数&#xff0c;Lambda 表达式基于数学中的 λ演算得名&#xff0c;直接对应于其中的 lambda 抽象&#xff08;lambda abstraction&#xff09;&#xff0c;是一个匿名函数&#xff0c;即没有函数…

python和c++的相互调用教程

日常工作中会遇到需要python与cpp代码之间的相互调用&#xff0c;工作的应用复杂&#xff0c;都是取决于代码的多少&#xff0c;但是总的方法不变&#xff0c;这里用两个简单例子说明下&#xff0c;有兴趣的筒子可以探讨下~~ 我的测试环境&#xff1a;ubuntu1604&#xff0c;py…

技术图文:如何通过 LINQ 查找集合中的重复数据?

背景 在前几天介绍的 如何利用C#实现Huffman编码&#xff1f; 的图文中有以下代码。 private List<HuffmanTreeNode> CreateInitForest(string str) {if (string.IsNullOrEmpty(str))throw new ArgumentNullException();List<HuffmanTreeNode> result new List&…

mysql的基本知识

安装&#xff1a;http://www.cnblogs.com/sshoub/p/4321640.html 导库 http://www.cnblogs.com/yuwensong/p/3955834.html 报错&#xff1a;Error was: No module named PIL pip install image转载于:https://www.cnblogs.com/baldermurphy/p/7403778.html

msys下产生dll的导入库

有些时候在只有一个dll的情况下&#xff0c;如果需要隐式链接的话&#xff0c;就需要为该dll产生一个导入库.注意导入库是不能跨编译器使用的&#xff0c;在mingw中导入库需要以.a结尾,而vs则以.lib 以下的方法是在Msys产生mingw及vs 的导入库 , 打开MSys工具 首先生成dll库的d…

零基础小白如何学习好UI设计

智能时代的来临&#xff0c;很多企业都越来越注重用户体验这一块&#xff0c;想要有一个吸引用户的好页面&#xff0c;UI设计师岗位不可或缺&#xff0c;如今越来越多的人想要学习UI设计技术&#xff0c;那么对于零基础小白如何学习好UI设计呢? 零基础小白如何学习好UI设计? …

技术图文:如何利用BigOne的API制作自动化交易系统 -- 获取账户资产

背景 前几天我们介绍了如何使用 BigONE Developer API V2 来获取身份令牌的方法「如何利用BigOne的API制作自动化交易系统 – 身份验证」。一旦获取了身份令牌&#xff0c;我们就可以在网络请求的 header 中加入令牌来获取自己的账户数据&#xff0c;创建买入、卖出订单&#…

『网站升级』PHPWind8.0至8.3升级过程及问题种种回顾录

上星期的PHPWind杭州峰会之后&#xff0c;PHPWind发布了8.3版。紧接着淘连接&#xff0c;淘满意&#xff0c;团购PHPWind的一系统ARP应用开始进入我们公司技术苦力的耳朵里&#xff08;也就是偶&#xff09;&#xff0c;偶知道有大事要发生了。于是乎。领导悠然降至&#xff0c…

新浪 抓取详情页

转载于:https://www.cnblogs.com/tian-sun/p/7404493.html

零基础如何学习软件测试

很多人想学软件测试是因为软件测试是进入到IT行业里比较快的一门技术&#xff0c;软件测试的门槛比较低&#xff0c;初学者和零基础小白学起来都是比较容易的&#xff0c;下面小编就详细的给大家介绍一下具体零基础如何学习软件测试? 零基础如何学习软件测试?对于初级测试而言…

VPS使用初体验

很早就想建个人网站&#xff0c;但是出于各种限制&#xff0c;一直没有实施。前几天开通了网银&#xff0c;便再次萌发了建站的想法。。。 购买一个了enom的域名&#xff0c;然后寻找比较好的虚拟主机&#xff0c;发现ubuntuchina上有个卖vps的&#xff0c;价格还行&#xff0c…

LeetCode实战:相同的树

题目英文 Given two binary trees, write a function to check if they are the same or not. Two binary trees are considered the same if they are structurally identical and the nodes have the same value. Example 1: Input: 1 1/ \ / \2 3 …

mysql数据库常用命令

登录&#xff1a; mysql -h 服务器地址 -u 登录名 -P 端口 -p 密码 &#xff08;登录时最好先不输入密码&#xff0c;等下一条提示出来之后再输&#xff0c;这样可以在界面中隐藏密码&#xff09; 退出&#xff1a; quit 或者 exit 注意&#xff1a;登录数据库系统后&#xff0…

Java入门学习注意事项有哪些?

想要学好java技术&#xff0c;做好学习规划路线和注意事项是非常重要的&#xff0c;尤其是零基础学员&#xff0c;Java涉及到的知识点非常多&#xff0c;我们需要制定合理的Java学习路线图&#xff0c;这样会事半功倍&#xff0c;下面小编和大家总结一下Java入门学习注意事项有…

在Hibernate中处理批量更新和批量删除

批量更新是指在一个事务中更新大批量数据&#xff0c;批量删除是指在一个事务中删除大批量数据。以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段&#xff1a; 如果CUSTOMERS表中有1万条年龄大于零的记录&#xff0c;那么Session的find()方法…

LeetCode实战:对称二叉树

题目英文 Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For example, this binary tree [1,2,2,3,4,4,3] is symmetric: 1/ \2 2/ \ / \ 3 4 4 3But the following [1,2,2,null,3,null,3] is not: 1/ \2 2\ \3 …

flannel 概述 - 每天5分钟玩转 Docker 容器技术(58)

2019独角兽企业重金招聘Python工程师标准>>> flannel 是 CoreOS 开发的容器网络解决方案。flannel 为每个 host 分配一个 subnet&#xff0c;容器从此 subnet 中分配 IP&#xff0c;这些 IP 可以在 host 间路由&#xff0c;容器间无需 NAT 和 port mapping 就可以跨…

Python如何实现穷举搜索?

穷举搜索就是在整个搜索空间范围内尝试每一种可能性&#xff0c;直到找到目标值或者整个搜索空间都找完也没有找到目标值。最常见的穷举搜索就是线性搜索&#xff0c;即按照顺序简单检查所有不同的可能性。 例如&#xff1a;2个警察追逐强盗到了一个废弃旅馆的二楼走廊&#xf…