spring的Bean注入和P标签使用

  categories:资料  author:

[spring]xml配置文件中bean属性的两种写法(p:configLocation <=> <property name=”configLocation”/>)
p:configLocation:
<!– mybatis文件配置,扫描所有mapper文件 –>
<bean id=”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactoryBean”
p:dataSource-ref=”dataSource”
p:configLocation=”classpath:mybatis-config.xml”
p:mapperLocations=”classpath:com/eliteams/quick4j/web/dao/*.xml”/>
<property name=”configLocation”/>:

复制代码
<bean id=”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactoryBean”>
<property name=”dataSource” ref=”dataSource”/>
<!– mapper和resultmap配置路径 –>
<property name=”classpath:com/eliteams/quick4j/web/dao/*.xml” />
<property name=”configLocation” value=”classpath:mybatis-config.xml”/>
</bean>
复制代码
注:org.mybatis.spring.SqlSessionFactoryBean:

SqlSessionTemplate中需要的是SqlSessionFactory,而不是SqlSessionFactoryBean。这个是因为SqlSessionFactoryBean继承了FactoryBean<SqlSessionFactory>

在spring的bean配置文件中我们常可以见到下面的例子:
<bean id=”boss” class=”com.zj.Boss” … 阅读全文

零复制(zero copy)技术

  categories:资料  author:

1.1 背景说明:网络数据传输的全过程

在每一次网络io过程,数据都要经过几个缓存,再发送出去。如下图:

1

以右侧为浏览器,左侧为httpd服务器为例。

  1. 当httpd服务收到浏览器发送的index.html文件的请求时,负责处理请求的httpd子进程/线程总是会先发起系统调用,让内核将index.html从存储设备中加载出来。但是加载到的位置是内核空间的缓冲区kernel buffer,而不是直接给进程/线程的内存区。由于是内存设备和存储设备之间的数据传输,没有CPU的参与,所以这次是DMA操作。
  2. 当数据准备好后,内核唤醒httpd子进程/线程,让它使用read()函数把数据复制到它自己的缓冲区,也就是图中的app buffer。到了app buffer中的数据,已经独属于进程/线程,也就可以对它做读取、修改等等操作。由于这次是使用CPU来复制的,所以会消耗CPU资源。由于这个阶段从内核空间切换到用户空间,所以进行了上下文切换。
  3. 当数据修改完成(也可能没做任何操作)后,按我们所想的,需要把它响应给浏览器,也就是说要通过TCP连接传输出去。但TCP协议栈有自己的缓冲区,要通过它发送数据,必须将数据写到它的buffer中,对于发送者就是send buffer,对于接受者就是recv buffer。于是,通过write()函数将数据再次从app buffer复制到send buffer。这次也是CPU参与进行的复制,所以会消耗CPU。同样也会进行上下文切换。
  4. 非本机数据最终还是会通过网卡传输出去的,所以再使用send()函数就可以将send buffer中的数据交给网卡并通过网卡传输出去。由于这次是内存和设备之间的数据传输,没有CPU的参与,所以这次也是DMA操作。
  5. 当浏览器所在主机的网卡收到响应数据后(当然,数据是源源不断传输的),将它传输到TCP的recv buffer。这次是DMA操作。
  6. 数据源源不断地填充到recv buffer中,但是浏览器却不一定会去读取,而是需要通知浏览器进程使用recv()函数将数据从read buffer中取走。这次是CPU操作(图中忘记标注了)。

需要注意,对于httpd端来说,如果网速很慢,而httpd子进程/线程需要响应出去的数据又足够大(比send buffer还大),很可能会导致socket buffer填满的情况,这时write()函数会返回EWOULDBLOCK或EAGAIN,子进程/线程会进入等待状态。

对于浏览器一端来说,如果浏览器进程迟迟不将数据从socket buffer(recv buffer)中取走,很可能会导致socket buffer被填满。

再来说httpd端网络数据的”经历”。如下图:

2

每次进程/线程需要一段数据时,总是先拷贝到kernel buffer,再拷贝到app buffer,再拷贝到socket buffer,最后再拷贝到网卡上。也就是说,总是会经过4段拷贝经历。

但想想,正常情况下,数据从存储设备到kernel buffer是必须的,从socket buffer到NIC也是必须的,但是从kernel buffer到app buffer是必须的吗?进程一定需要访问、修改这些数据吗?不一定,甚至对于web服务来说,如果不是要修改http响应报文,数据完全可以不用经过用户空间。也就是不用再从kernel buffer拷贝到app buffer,这就是零复制的概念。… 阅读全文

衣服褶皱的画法

  categories:资料  author:

阿汤哥说:褶皱啊,简单简单。

那么,今天要讲的就是衣服褶皱的绘画教程。

为什么要画褶皱?

因为要画衣服。不穿衣服,文章就不能过审。

通过褶皱可以看出衣服的材质、厚度以及身体的曲线。

褶皱类型

01

拉伸褶皱

肩膀有一个撑起的受力点,褶皱的方向从受力点呈放射状,形成拉伸褶皱。

因为重力作用,衣服自然下垂。

02

挤压褶皱

挤压褶皱通常出现在关节内侧。

受到重力和阻力的作用时,以压缩点为基准,呈放射状展开。

特别是牛仔裤,即使是站立姿态,挤压褶皱依旧会出现。

03

管状褶皱

因为裙子的腰部有收缩,下摆自然下垂,会出现管状褶皱。

管状褶皱像很多并排的圆柱体。

04

半锁形褶皱

当褶皱被轻微压缩的时候,会形成半锁形褶皱,一般是出现在宽松的服装轮廓上。

常见于宽松的男友衬衫。

人身上的衣服褶皱就是由前面那些基础褶皱互相叠加形成的,只要始终记住褶皱是朝着力的方向就可以了。

褶皱和力的关系密不可分。

对于受力点,力的方向等相关知识

褶皱表现材质

01

轻薄的衣服

较薄的衣服比较贴身,需要绘制出服装的贴身感。例如在领口处,服装的线条和没穿衣服时的线条差距不大。

较薄的服装形成的褶皱比较纤细。

02

较厚的衣服

较厚的布料褶皱会比较圆润,例如在腰部的褶皱较粗。

在领口处,要画出一定的厚度,而不是紧贴身子的。

注意… 阅读全文

不会画衣褶?教程奉上

  categories:资料  author:

小艺衣褶怎么画

为什么我画出来是这样的

或者是这样的

动态画的不好

连衣褶都是僵硬无规律的

所以今天就来说一下衣褶到底该怎么画

有什么规律

笔法的应用

腰果原理:在具体绘画过程中,关于体块的前后空间,我们可以用腰果的形态特征来理解体块的前后穿插关系。

上肢:包括上臂、前臂和手三个部分,由肩关节、肘关节、腕关节将其连接,使其做出各种动势。

1.上肢的基本形可看作类似粉笔状或者“水滴”状。

2.当手臂运动时,衣纹会随之出现挤压拉伸的形态特征。了解衣纹的走向规律及手臂的结构尤为重要。

3.明确支撑形体的外轮廓,注意衣纹穿插的疏密关系,以及线条的轻重关系,才能更好地将上肢的内外形体表现得更准确。

4.丰富衣纹的细节以及服饰的特征,比如袖口的厚度的表现可加入少许调子,而内部的小调子相对主轮廓而言要浅一点。

下肢:下肢分大腿、小腿和足,由膝关节相连,从任何角度看,大腿和小腿并不处在同一条直线上,并不是头对头的连在一起,从侧面看腿部呈“s”型曲线。

直立状态下,下的鼓点非常明显,宽松的衣纹下一定要理解内部的构。膝盖的衣褶相对而言比较密集。

弯曲状态下,衣会随着下肢的运动呈现出明显的走向,膝盖的受力点尤为明显。

技巧get到了吗?

若您热爱、欣赏艺术,想了解更多,或者想借艺术成就孩子的人生..

 

来源: https://www.jianshu.com/p/d79f2c7fe5e5… 阅读全文

漫画中如何绘制衣褶

  categories:资料  author:

衣褶在漫画中通常是不可缺少的重要组成部分,这些衣褶可以增加画面的丰富度,有助于明确传递人物的动态信息。

素维漫画技法,希望大家多多支持哦:)

素维漫画技法当当网有售

来源: https://www.zcool.com.cn/work/ZMTExNDcwOA==.html… 阅读全文

素描让我教你如何画衬布吧

  categories:儿童画教程  author:

素描在学习过程中先一开始注意力都在静物上,老师也不要求你画下面的衬布。

所以很多很多同学,学了很久很久以后,就已经不会画衬布了

一种视而不见,一种见而不视,一种熟视无睹,

我以为这是一种惯性忽略症。

其实,衬布素描有点小难度,所以很多同学放弃练习。

苍白的石膏体画多了,柔柔的衬布表示无感。

为什么不把画立方体、球体、罐子、水杯的基础素描知识加以应用呢?

来个移花接木,來個潛移默化。

我不是教你投机取巧,而是触类旁通好不好?

这静物下面的衬布还是没有让你多看一眼,

你把它就看做静物好了,

怎么?不会看吗?

其实和静物一样的造型规律。

柔软很难表现吗?你先转换视角感觉,

先看做是一样质感的静物好了。

你心里知道不是,可是你偏偏当静物去画,

怎么样?没问题,你的素描过程就会柔软起来,

因为你的潜意识知道它是软的,

所以放手去画,你越画越柔、越画越软。

还是老办法:構圖、造型、轮廓、结构。

之后就是黑、白、灰、色调关系。

不要把衬布画的过于复杂和沉重,

因为毕竟是衬托和背景哦,

要懂得取舍和主次、虚实、远近的处理。

画衬布是这样的:

要轻和柔就要去掉次要的,弱化结构,重视主要部分。

有虚有实,虚实相互转换要自然温和。

前后虚实的把握,上下的重量感,左右的错落,色调的轻重远近。

注意衬布的结构形状,造型的起伏。

按照其结构找准型,用黑白灰色调制造出体积感。

如何才能画好衬布?记住了:只有把衬布当成物体去画才能画出好的质感!

下面看图具体了解:照片是这样

衬布的静物结构要起型准确,

其实道理都是一样,只有准确的起型才是下一步正确表现衬布的结构。

结构的起落高低,找到其衬布亮面起伏,分析衬布的亮面和灰面,

画灰面比较多,

按照整体结构调整色调排线。

习惯用纸巾,用纸巾可以使整个画面的色调和谐基调统一。… 阅读全文

RequestMapping 用法详解

  categories:资料  author:

简介:

@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

value, method

value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);

method:  指定请求的method类型, GET、POST、PUT、DELETE等;

consumes,produces

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

params,headers

params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

示例:

value  / method 示例

默认RequestMapping(“….str…”)即为value的值;

@Controller  
@RequestMapping("/appointments")  
public class AppointmentsController {  
  
    private AppointmentBook appointmentBook;  
      
    @Autowired  
    
阅读全文

Cas 4.2.7 OAuth+Rest 实现SSO

  categories:资料  author:

关于Cas的认证原理、Rest的使用请参考前面的文章。本文重点阐述使用Rest接口登陆系统和其他单点登录系统打通遇到的问题,及解决问题的思路和过程。

 一: 遇到的问题
        使用Rest接口实现登陆后,再访问其他使用Cas单点登陆的系统时,Cas认定为当前用户未登陆并要求登陆。经过分析发现,当访问其他使用Cas单点登录系统时Cas无法获取到当前客户端Cookie中的TGC,也就是说使用Rest接口实现登陆Cas无法往客户端Cookie写入TGC。有关TGC的解析这里不详述。
     问题适用场景
  1. 部分系统使用授权免登的方式进入到CAS单点登录系统,同时又希望能使用SSO切换到其他系统。
  2. 部分业务系统有自己的登陆页面,在自己的登陆逻辑中调用Cas的Rest接口实现登陆,同时希望能使用SSO切换到其他系统
二: 解决问题过程
  1. 分析Rest接口发现,调用 cas/v1/tickets/ 接口登陆成功后cas返回了用户的身份信息TGT,那么TGT和TGC有什么关联呢?

收发

 

2. 继续分析cas登陆流程,Cas使用spring-webflow控制登陆流程,找到WEB-INF/webflow/login/login-webflow.xml。在flow执行之前Cas先做了些处理,如下配置

<on-start>
      <evaluate expression="initialFlowSetupAction"/>
</on-start>

追踪到InitialFlowSetupAction类的doExecute方法发现核心代码:

WebUtils.putTicketGrantingTicketInScopes(context,this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request));

代码说明:当用户访问Cas登陆页时,程序调用this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request)方法获取TGT并存放入当前作用域中。

         继续追踪到CookieRetrievingCookieGenerator类的retrieveCookieValue方法中:
     try {
            final Cookie cookie = org.springframework.web.util.WebUtils.getCookie(
                    request, getCookieName());
            return cookie == null ? null : 
阅读全文

web.xml的加载过程配置详解

  categories:资料  author:

一:web.xml加载过程

简单说一下,web.xml的加载过程。当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等)。首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的被启动起来。

启动WEB项目的时候,容器首先会去读取web.xml配置文件中的两个节点:<listener> </listener>和<context-param> </context-param>如图:

紧接着,容器创建一个ServletContext(application),这个web项目的所有部分都将共享这个上下文。容器以<context-param></context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext。

容器创建<listener></listener>中的类实例,根据配置的class类路径<listener-class>来创建监听,在监听中会有初始化方法,启动Web应用时,系统调用Listener的该方法 contextInitialized(ServletContextEvent args),在这个方法中获得:

  ServletContext application =ServletContextEvent.getServletContext();

  context-param的值application.getInitParameter(“context-param的键“);

  得到这个context-param的值之后,你就可以做一些操作了。

  举例:你可能想在项目启动之前就打开数据库,那么这里就可以在<context-param>中设置数据库的连接方式(驱动、url、user、password),在监听类中初始化数据库的连接。这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用前释放资源。比如:说数据库连接的关闭,此时,调用contextDestroyed(ServletContextEvent args),关闭Web应用时,系统调用Listener的该方法。

  接着,容器会读取阅读全文

Spring Web Flow 2.0 入门详解

  categories:资料  author:

Spring Web Flow (SWF)是Spring Framework的一个脱离模块。这个模块是Spring Web应用开发模块栈的一部分,Spring Web包含Spring MVC。

Spring Web Flow的目标是成为管理Web应用页面流程的最佳方案。当你的应用需要复杂的导航控制,例如向导,在一个比较大的事务过程中去指导用户经过一连串的步骤的时候,SWF将会是一个功能强大的控制器。

Spring Web Flow 是 Spring 的一个子项目,其最主要的目的是解决跨越多个请求的、用户与服务器之间的、有状态交互问题,比较适合任何比较复杂的、有状态的、需要在多个页面之间跳转的业务过程。

配置SWF需要

  • 装配流程执行器(flow executor)

执行器驱动流程的执行,当用户进入流程时,流程执行器会为用户创建并启动一个流程执行实例,当流程暂停的时候(如为用户展示视图时),流程执行器会在用户执行操作后恢复流程。

目录:

  1. 参考文献
  2. 购物车用例
  3. 什么情况下可以使用 Spring Web Flow?
  4. 配置 Spring Web MVC
  5. 配置 Spring Web Flow 2.0 的基础
  6. 在购物车示例应用中配置 Spring
阅读全文



快乐成长 每天进步一点点      京ICP备18032580号-1