IDEA常用插件 Mybatis源码分析(1) - Mybatis包目录简介 tair 1:tair学习 dataflow论文阅读笔记 Polysh的安装使用 SnappyData排序函数比较 Squirrel-sql客户端连接SnappyData手册 在虚拟机里显示Hello World spark学习博客推荐 SnappyData学习博客和官网文章 Docker常用命令 MyBatis支持的OGNL语法 mysql性能优化 mysql性能优化-优化Sql语句 java各版本新特性 mac上命令行操作 explain输出格式 从文件中读取zk配置——ZooKeeper编程技能(1) git进阶经验-从项目中删除移除的目录 Mongodb 学习之shell命令操作(3) mysql命令 git进阶经验-从多模块项目中分理子模块 从零学hadoop-搭建基础(单点)的Hdfs环境 ZooKeeper集群操作脚本 Vue安装使用 2 初学JVM之问答式记住类加载机制 2 初学JVM之问答式记住虚拟机性能监控与故障处理工具 2 初学JVM之问答式记住垃圾收集器 log4j2 按天生成日志文件 1 初学JVM之问答式记住java自动内存管理 MapReduce学习心得之MapReduce初识 log4j2 日志发送到kafka配置实战 log4j2 日志配置实战 Mongodb 学习之shell命令操作(二) Mongodb 学习之linux版本安装(一) Dubbo的初级使用 ServiceLoader内部实现分析 ServiceLoader 初级应用 log4j日志发送邮件配置实战 红黑树笔记 IDEA首次使用之前的配置 java源码学习之Enum java源码学习之String 自定义Spring tag标签 编写一键发布脚本 记一次Spring Scheduler莫名不执行的一次堆栈分析 kafka的基本操作 nginx 5:Nginx内部变量 nginx 4:Nginx日志管理 提高hadoop配置效率的shell脚本 Hive编程指南之一 Hive的安装 Ambari服务器安装 Ambari服务器管理集群 HBase分布式安装 windows下Eclipse远程调试运行MR程序 基于MapReduce新的API的编程Demo-wordCount window下Eclipse远程只读HDFS上的文件 YARN上节点标签 编写第一个MapReduce的wordcount程序 NodeManager的重启 搭建JStorm集群 YARN上的web应用代理 YARN上的ResourceManager的高可用方案 配置vmware中的虚拟机使用宿主机的共享网络 YARN架构简述 HDFS 架构 Spring的统一异常处理机制 Tomcat 配置服务 HDFS的viewfs指南 HDFS的Federation之路 HDFS基于QJM的HA之路 nginx 3:Nginx反向代理 mybatis操作主体流程 1.正则表达式学习-基础篇 log4j日志配置详解 mysql的时间函数 nginx 2:Nginx模块配置理论及实战 HashMap相关解析和测试文章 工作一年后的面试 用私有构造器或枚举类型强化Singleton属性 java中比较重要的图 mybatis处理枚举类 mybatis集成进spring Spring比较重要的几个截图 21.hadoop-2.7.2官网文档翻译-使用NFS的HDFS高可用性 20.hadoop-2.7.2官网文档翻译-使用仲裁日志管理器的HDFS高可用性 markdown在jekyll中支持的一些操作 Spring项目中配置sl4j和log4j的日志配置 19.hadoop-2.7.2官网文档翻译-HDFS命令指南 Spring的profile机制介绍 mybatis-generator反向生成 18.hadoop-2.7.2官网文档翻译-HDFS用户指南 17.hadoop-2.7.2官网文档翻译-实现Hadoop中Dapper-like追踪 16.hadoop-2.7.2官网文档翻译-Hadoop的KMS(key 管理服务器)-文档集 15.hadoop-2.7.2官网文档翻译-Hadoop的http web认证 14.hadoop-2.7.2官网文档翻译-服务级别的授权指南 13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop 09.hadoop-2.7.2官网文档翻译-Hadoop命令行微型集群 12.hadoop-2.7.2官网文档翻译-机架感知 11.hadoop-2.7.2官网文档翻译-代理用户-超级用户对其他用户的代表 10.hadoop-2.7.2官网文档翻译-原生库指南 08.hadoop-2.7.2官网文档翻译-文件系统规范 07.hadoop-2.7.2官网文档翻译-Hadoop接口类别 (转)浅析 Decorator 模式,兼谈 CDI Decorator 注解 06.hadoop-2.7.2官网文档翻译-Hadoop的兼容性 05.hadoop-2.7.2官网文档翻译-文件系统命令 04.hadoop-2.7.2官网文档翻译-Hadoop命令指南 03.hadoop-2.7.2官网文档翻译-集群安装 02.hadoop-2.7.2官网文档翻译-单节点集群安装 01.hadoop-2.7.2官网文档翻译-概述 Http 协议相应状态码大全及常用状态码 IDEA快捷键 JDBC Type与Java Type redis 12:redis 操作集合 mybatis-generator错误集合 redis 11:redis 错误集合 nginx 1:nginx的安装 redis 10:redis cluster命令操作 redis 9:redis实例集群安装 java设计模式 hadoop集群学习笔记(1) Apache Shiro 简介 vim编辑神器的进阶命令 Eclipse配置 Eclipse快捷键 Linux 测试题 Linux脚本学习(1) Linux启动简要过程 Centos7上安装Mysql hadoop集群学习笔记(1) (转)分布式发布订阅消息系统 Kafka 架构设计 maven 命令 Kafka集群安装 Kafka初步使用 redis 8:redis server 和 scripting命令操作 redis 7:redis transaction 和 connection命令操作 redis 6:redis hash 命令操作 redis 5:redis sorted_set 命令操作 搭建本地Jekyll+Markdown+Github的开发环境 Spring源码阅读笔记(2) redis 4:redis set命令操作 Spring添加任务调度配置 redis 3:Redis list命令操作 redis 2:redis 一般命令操作 redis 1:redis单机安装笔记 redis 0:redis配置属性描述 Spring源码阅读笔记(1) spark 错误集锦 spark集群安装 Linux 基本命令操作 Hadoop错误信息处理 Hadoop代码拾忆 从零开始搭建spring-springmvc-mybatis-mysql和dubbo项目 java知识点札记 java排错 Google Java Style 中文版 git进阶经验 github使用经验 MongoDB用户角色授权与AUTH启用 MongoDB 命令 MongoDB 特定规范 Spring MVC实现跳转的几种方式 史上最全最强SpringMVC详细示例实战教程 Spring 零星笔记 js中(function(){…})()立即执行函数写法理解 如何解决跨域问题 创建ajax简单过程 前端定位 设置MYSQL允许通过IP访问 mybatis异常 :元素内容必须由格式正确的字符数据或标记组成 如何为 WordPress 绑定多个域名的方法s WordPress工作原理之程序文件执行顺序(传说中的架构源码分析) Spring源码导入Eclipse中 基于PHPnow搭建Eclipse开发环境 解决wordpress首页文章内容截断处理的几种方法 ZooKeeper理论知识 ZooKeeper集群安装配置 Git常用命令速查表 Linux 4:磁盘与文件系统管理 Linux 3:文件与目录管理 Linux 2:文件权限与目录配置 Markdown输入LaTeX数学公式
从零学hadoop-搭建基础(单点)的Hdfs环境 MapReduce学习心得之MapReduce初识 Ambari服务器安装 Ambari服务器管理集群 windows下Eclipse远程调试运行MR程序 基于MapReduce新的API的编程Demo-wordCount window下Eclipse远程只读HDFS上的文件 YARN上节点标签 编写第一个MapReduce的wordcount程序 NodeManager的重启 YARN上的web应用代理 YARN上的ResourceManager的高可用方案 YARN架构简述 HDFS 架构 HDFS的viewfs指南 HDFS的Federation之路 HDFS基于QJM的HA之路 21.hadoop-2.7.2官网文档翻译-使用NFS的HDFS高可用性 20.hadoop-2.7.2官网文档翻译-使用仲裁日志管理器的HDFS高可用性 19.hadoop-2.7.2官网文档翻译-HDFS命令指南 18.hadoop-2.7.2官网文档翻译-HDFS用户指南 17.hadoop-2.7.2官网文档翻译-实现Hadoop中Dapper-like追踪 16.hadoop-2.7.2官网文档翻译-Hadoop的KMS(key 管理服务器)-文档集 15.hadoop-2.7.2官网文档翻译-Hadoop的http web认证 14.hadoop-2.7.2官网文档翻译-服务级别的授权指南 13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop 09.hadoop-2.7.2官网文档翻译-Hadoop命令行微型集群 12.hadoop-2.7.2官网文档翻译-机架感知 11.hadoop-2.7.2官网文档翻译-代理用户-超级用户对其他用户的代表 10.hadoop-2.7.2官网文档翻译-原生库指南 08.hadoop-2.7.2官网文档翻译-文件系统规范 07.hadoop-2.7.2官网文档翻译-Hadoop接口类别 06.hadoop-2.7.2官网文档翻译-Hadoop的兼容性 05.hadoop-2.7.2官网文档翻译-文件系统命令 04.hadoop-2.7.2官网文档翻译-Hadoop命令指南 03.hadoop-2.7.2官网文档翻译-集群安装 02.hadoop-2.7.2官网文档翻译-单节点集群安装 01.hadoop-2.7.2官网文档翻译-概述 hadoop集群学习笔记(1) hadoop集群学习笔记(1) Hadoop错误信息处理 Hadoop代码拾忆

Spring 零星笔记

2016年01月12日
摘要:不定期更新

1. 注入三种类型

构造方法注入、属性注入和接口注入    

2. Spring 资源加载

Spring提供了强大的加载资源的机制,不但能够通过“classpath:”、“file:”等资源地质前缀识别不同的资源类型,还支持Ant风格带有通配符的资源地址。

资源类型的地址前缀:

地址前缀 示例 对应资源类型
classpath: classpath:com/test/bao/bean.xml 从类路径中加载资源,classpath:和classpath:/是等价的。都是相对于类的根路径。资源文件可以在标准的FS中,也可以在jar或zip的类包中
file: file:/conf/com/test/bao/bean.xml 使用URLResource从FS中加载资源,可采用绝对和相对路径
http:// http://www.bao.com/resource/bean.xml 使用URLResource从WEB服务器加载资源
ftp:// ftp://www.bao.com/resource.bean.xml 使用URLResource从ftp服务器加载资源
没有前缀 com/test/bao/bean.xml 根据applicationContext具体实现类采用对应类型的Resource

特殊说明:

classpath*:和classpath:两者比较:

"classpath:"只会在第一个加载的com.test.bao包下查找;

"classpath*:"会扫描到所有的jar包及类路径下出现的com.test.bao包路径

Ant风格资源地址支持3中匹配符

"?":匹配文件中的一个字符

"\*":匹配文件名中的任意个字符

"\*\*":匹配多层路径

3.加载配置

如果使用web监听器,必须将Log4jConfiglistener放置在ContextLoaderListener前面

如果使用@Configuration的java类提供配置信息,则web.xml配置如下:

<!-- 通过指定context参数,让spring使用指定的启动器-->
<context-param>
	<param-name>contextClass</param-name>
	<param-value>org.springframework.web.context.support.AnnotatinConfigWebApplicationContext</param-value>
</context-param>
<!-- 标注@Configuration的配置类,多个可以使用逗号或者空格分隔 -->
<context-param>
	<param-name>contextConfigClass</param-name>
	<param-value>com.test.bao.config</param-value>
</context-param>

4. Spring MVC默认加载配置

  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定mvc配置文件 -->
    <init-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>classpath*:springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

默认情况下,springmvc根据servlet的名字查找WEB-INF下的<servlet-name>-servlet.xml作为springmvc的配置文件。 通过参数contextConfigLocation可以指定springmvc配置文件的位置

5. spring日志自动加载

log4j.properties放置在类路径下

6. spring url后缀

struts中以".do"结尾,struts2中以".action"结尾,也可以使用".html"

使用”.html”的好处:

1.用户不能通过URL直接知道我们采用的那种服务端技术;

2.”.html”是静态网页的后缀,也可以骗过搜索引擎。

3.对于真正的无需动态处理的静态网页则可以使用.htm后缀加以区分避免被框架拦截。

7. SpringMVC @RequestBody接收Json对象字符串

7.1 配置jackson为解析器

配置springMVC配置文件,需要的jar包spring-web-4.xx.jar

	<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
			
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
	   <property name="messageConverters">
	      <list>
	         <ref bean="jacksonMessageConverter" />
	      </list>
	   </property>
	</bean>

maven中引入依赖:

	<jackson.version>2.6.1</jackson.version>

	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-core</artifactId>
		<name>Jackson-core</name>
		<version>${jackson.version}</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>${jackson.version}</version>
		<name>jackson-databind</name>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-annotations</artifactId>
		<name>Jackson-annotations</name>
		<version>${jackson.version}</version>
	</dependency>
	<dependency>
	<groupId>org.codehaus.jackson</groupId>
		<artifactId>jackson-lgpl</artifactId>
		<packaging>jar</packaging>
		<name>Jackson</name>
		<version>0.9.5</version>
	</dependency>

	<dependency>
		<groupId>org.codehaus.jackson</groupId>
		<artifactId>jackson-asl</artifactId>
		<packaging>jar</packaging>
		<name>Jackson</name>
		<version>0.9.5</version>
	</dependency>

7.2 配置fastjson为解析器

配置依赖:

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.7</version>
</dependency>

配置文件:

	<bean id="stringConverter"
		class="org.springframework.http.converter.StringHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>text/plain;charset=UTF-8</value>
			</list>
		</property>
	</bean>

	<!-- 输出对象转JSON支持 -->
	<bean id="jsonConverter"
		class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json;charset=UTF-8</value>  
                <value>text/html;charset=UTF-8</value><!-- 避免IE出现下载JSON文件的情况 -->  
                <value>text/plain;charset=UTF-8</value>
			</list>
		</property>
	</bean>

	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="stringConverter" />
				<ref bean="jsonConverter" />
			</list>
		</property>
	</bean>

jackson和fastjson公用的java和js代码

java代码:

	//produces = "plain/text; charset=UTF-8"
	@RequestMapping(value="/add",produces={MediaType.APPLICATION_JSON_VALUE})
	@ResponseBody
	public int  createProject(@RequestBody Project project,HttpServletRequest request) {//
		project.setStartdate(new Date());
		project.setEnddate(new Date());
		project.setEntryDatetime(new Date());
		int num = projectService.createProject(project);
		 return num;
	}

js代码:

$("#createProject").on('click',function(){
		var param = {
				"id":"22",
				"entryId":"33",
				"entryDatetime":null,
				"updateId":"334",
				"updateDatetime":null,
				"name":"eeeee",
				"master":"222",
				"description":"werwer",
				"startdate":null,
				"enddate":null,
		}
		var data = JSON.stringify(param);
		alert(data);
		var url = "http://localhost:8080/web-server/service/project/add";
		alert("当前url:"+url);
		$.ajax({
			type:"post",
			dataType: "json",
			contentType:"application/json",
			url:url,
			data:data,
			success:function(data,e){
				alert("创建项目成功"+JSON.stringify(data)+e);
			},
			error:function(data,e){
				console.log(data);
				alert("创建项目失败"+JSON.stringify(data)+e);
			}
		});
		
	});

8.任务调度

注意:任何方式的调度配置都需要首先引入spring-context-4.1.7.RELEASE.jarspring-task-4.1.7.RELEASE.jar

注意:spring主配置文件中应该有配置如<context:component-scan base-package="cn.followtry" />,以便spring扫描注解

8.1 注解+配置方式任务调度

在springContext.xml(spring主配置文件)配置

 	<!-- 任务注解驱动 -->
    <task:annotation-driven/>

java代码处调用

	@Scheduled(cron="*/1 * * * * ?")
	public void springTaskSchedule(){
		System.out.println("springTaskSchedule--->date:"+DateFormat.getInstance().format(new Date()));
	}

这种方式只能提供两种可能,即要么带@Scheduled注解的方法全部按约定执行,要么全部不执行(注释掉<task:annotation-driven/>)

8.2 纯注解方式任务调度

纯注解方式是只在java代码中添加注解,而不再配置<task:annotation-driven/> java代码处调用

@EnableScheduling
public class QuartzTest {
	@Scheduled(cron="*/1 * * * * ?")
	public void springTaskSchedule(){
		System.out.println("springTaskSchedule--->date:"+DateFormat.getInstance().format(new Date()));
	}
}

这种方式不需手动改动配置,但当调度任务的需求更改时,需要修改源码

8.3 纯配置方式任务调度

在spring主配置文件中添加

	<task:scheduled-tasks> 
        <task:scheduled ref="quartzTest" method="springTaskSchedule2" cron="*/1 * * * * ?"/> 
	</task:scheduled-tasks>
	<bean id="quartzTest" class="cn.jingzztech.prac.quartz.QuartzTest" />

这样就会将cn.followtry.quartz.QuartzTest.springTaskSchedule2设置为调度方法,按照指定cron调度

这种方式可以通过配置动态的决定开启哪些调度和关闭哪些调度,灵活度大

9.springMVC 的@response 中文乱码问题

解决办法:

@RequestMapping 中添加 produces = MediaType.APPLICATION_JSON_VALUE或者produces = "plain/text; charset=UTF-8",解决@ResponseBody乱码问题

@RequestMapping(value = "/msgFlowAnal/{flag}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String  msgFlowAnal(@PathVariable("flag") int flag,HttpServletRequest request){
    //逻辑代码
}

10.springMVC restFul 形式url,即url中包含参数

@RequestMapping(value = "/day_active/{year}/{month}/{day}", produces = MediaType.APPLICATION_JSON_VALUE)

//{day:.+}包含所有的"."及其后的内容
@RequestMapping(value = "/day_active/{year}/{month}/{day:.+}", produces = MediaType.APPLICATION_JSON_VALUE)

11.注解使用属性文件中的值

@Value("${name}")
private String name;

@Value():为属性赋值

${name} :占位符,获取配置文件中对应属性name的值