在当前的版本(4.*), id 与 name 几乎是等效的。它们最大的区别在于, id 只能定义一个标识符, 而 name 可以同时定义 bean 的多个标识符, 在上下文环境中, 它们都要求是唯一的。我们通常用 id 为 bean 定义一个唯一的标识符, 如果 bean 需要一个以上的标识符, 可以使用 name 来定义额外的别名, 同时, id 和 name 是可以共存的, id 和 name 都可以用来查找得到 bean . . .
org.apache.log4j.Level 提供了 8 种日志信息的级别, 它们按从小到大的关系为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。假设配置的日志级别为 X, 使用的级别为 Y, 当且仅当 Y >= X 时, 日志请求才会被处理,否则被忽略 . . .
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'address' in 'class java.lang.String' . . .
<if> 实现的是 if 逻辑。凡是符合条件的语句都会被执行。但 <if> 不能实现 if/else 的逻辑。choose-when-otherwise 实现的是 if、else if、else 的逻辑 . . .
<association> 映射一个复杂的类型, 用来处理 "有一个" 的类型关系。如一首音乐有一个歌词。property 指明关联属性的名称, javaType 指明为属性装配的数据类型 ( 类的完全限定名或别名 )。试验得出, 如果不手工配置查询结果列与实体类属性之间的映射关系, 即使类的属性名称与查询结果列的名称一致, 也无法自动映射查询结果的列到类的属性, 即查询结果列的值无法赋到类的属性上 . . .
首先需要配置好一个 Tomcat 的账户, 并给该账户分配管理权限的角色, 角色列表可在 %tomcat7%\webapps\manager\WEB-INF\web.xml 配置文件中找到 . . .
注意这里的 resultType 和 resultMap 用法的区别。resultType 表明返回的结果的数据类型, 是查询结果的列映射到的类型, 如我们的实体类、Map 等。resultMap 是外部 ResultMap 的引用, 使用的前提是必须先配备 <resultMap>, <resultMap> 定义了数据库表的列与 JavaBean 属性之间的映射关系。
另外, resultType 和 resultMap 不能共存, 两者只能选其一, 查询的结果要么是 resultType, 要么是 resultMap . . .
mybatis sql 参数的语法有两种 :#{} 与 ${}。${} 是不经任何处理将传入的值直接替换掉参数变量拼接到 SQL 语句中。#{} 是经过预编译处理, 传入到 SQL 参数中的值是安全的 . . .
mybatis 的前身是 ibatis, 在 ibatis 中 namespace 是可选的。在 mybatis 中, namespace 是必须项, 它用于将当前的 XML 映射文件与指定的 Mapper 接口绑定起来。namespace 的值为需要绑定的 Mapper 接口的完全限定名 . . .
@WebAppConfiguration 用于声明为集成测试环境加载的 ApplicationContext 是一个 WebApplicationContext 类型。
@WebAppConfiguration 标注的 value 注解用于指定 web 应用的根路径, 默认是 @WebAppConfiguration("src/main/webapp")。
@WebAppConfiguration 注解需要 @ContextConfiguration 的支持。其余注解可参考本站点 junit 和 spring-test 相关文章 . . .
Spring MVC Test Framework 没有自动引入 jsonpath 依赖。如果使用到 MockMvcResultMatchers.jsonPath, 需要手动引入 jsonpath 依赖 . .
Spring MVC Test Framework 4.0 或以上版本使用需要 Servlet 3.0 或以上版本。解决方法, 将 Servlet 2.x 改成 Servlet 3.x . . .
@TransactionConfiguration 是 @TransactionConfiguration(defaultRollback = true) 的简写。@TransactionConfiguration 能够管理类范围内的事务, 与 @Rollback 一样, 它也需要 @Transactional 标注的支持, 否则事务不受 @TransactionConfiguration 的控制 . . .
测试执行结果的信息已经用不同的颜色标识了出来, 仔细阅读, 你可以获得 testInsert 在执行期间的详细信息 :方法开始 --> 事务开始 --> 事务回滚 --> 事务结束 --> 方法结束。
使用 @Rollback 的好处是, 测试数据不会对数据库造成污染, 这一点是很重要的。但 @Rollback 其实也不是真正意义上的数据零污染, 如果数据库表的主键是自增长类型, 虽然发生了事务回滚, 但是主键的索引还是会递增的。
执行这个测试, 数据库是不会插入记录的, 如果把 @Rollback 改成 @Rollback(false), 数据库就会插入一条数据。
@Rollback 需要 @Transactional 的支持, 如果没有 @Transactional 标注, 则事务就不会受 @Rollback 的控制 . . .
SpringJUnit4ClassRunner 是 Spring 针对 Junit4 测试环境提供的扩展, 在 Junit4 测试环境中可以获得 Spring 上下文支持的好处。这样可以在 Junit4 测试环境中使用依赖注入以及执行事务等。
@ContextConfiguration 用于确定如何为集成测试环境装载 Spring 上下文, 典型的是 xml 配置文件的方式 . . .
这是父模块 kitty-parent 的配置片段, 以上声明依赖的方式与以往稍有不同, 上面用了 dependencyManagement 节点, 这样配置完成之后, 实质上, 子模块不会引入任何的构件依赖, 这样做只是为了让子模块能够继承得到这些配置, 这样做的好处是, 在子模块中只需要声明 groupId 和 artifactId 就能准确无误的获取得到依赖的构件。可以想象的到, 这样一来, 不仅能够使子模块配置依赖变得简单, 还能使项目范围内所有依赖的构件的版本能够得到统一, 而且还能在父模块中统一的来管理, 这样就不会发生在多个子模块项目中使用构件的版本不一致的问题 . . .
kitty
|
|— pom.xml (pom)
|
|— kitty-parent
| |
|— pom.xml (pom)
|
|— kitty-app
| |
| |— src
| |— pom (war)
|
|— kitty-core
| |
| |— src
| |— pom (jar)
|
http://www.sonatype.org/nexus/archivednexus 2.6 及 2.6+ 版本要求 jdk 1.7 或 1.7+ 版本。根据你现有的环境来选择合适的版本。这里选择
nexus-2.11.0 ( 如果无法打开下载, 可将新开标签页地址栏中的地址复制到迅雷等进行下载 )。下载得到 nexus-2.11.0-bundle.zip 压缩包。解压缩里面的 nexus-2.11.0-02 目录, 如我的 E:\setup\dev\servers\nexus\2.11.0, 最终得到的目录结构为 E:\setup\dev\servers\nexus\2.11.0\nexus-2.11.0-02 . . .
当我们在 pom.xml 中配置依赖时, 依赖所需的构件, maven 均去本地仓库中取。如果本地仓库还没有所需的构件, maven 会尝试到远程仓库中取回到本地仓库, 然后再从本地仓库中取所需的构件。在这个过程中, 如果 maven 在远程仓库获取不到所需的构件 ( 可能是这些构件不存在, 或者是构件存在但由于网络原因取不回来, 又或者是人为的中途强制终止了等待 ), 那么构建就会失败, 项目会报错 ( 通常是报 artifactId 的错 )。这个时候, 你应该去本地仓库中, 找到这些构件所在的目录, 然后删除这些目录, 再重新构建, 如果顺利, 也许构建会成功。配置镜像通常是为了提高获取构件的速率, 镜像往往能提供比中央仓库更快的服务 ( 通常选择地理位置上与自己较近的镜像 ), 从而提高下载速度, 最终达到提高构建效率的目的 . . .
@Ignore 用法非常简单, 如果你的测试用例还没有准备好而不想被执行, 又不想删掉或注释掉, 可以使用 @Ignore 标注来忽略测试 . . .
Assert 是 Junit 提供的一套断言机制, 用于检查测试的结果与预期结果是否吻合, 以快速检查开发的代码功能与意图是否匹配。Assert.assertThat 是 Junit 4.4 开始提供的新的断言语法。Junit 4.4 开始引入了 Hamcrest 匹配机制, Hamcrest 是一个测试的框架,它提供了一套通用的匹配符,可以更加的灵活和准确的设定测试的条件。Assert.assertThat 可以替代所有其他的断言语句, 并且语义更加清晰, 代码风格也可以得到统一 . . .
介绍 TestRule、@Rule、@ClassRule、RuleChain。TestRule 类似于拦截器的作用, 它允许你在测试用例执行前后添加一些额外的操作。@Rule 要求必须为 public 修饰符修饰, 且不能是静态以及类型必须为 TestRule 类型 . . .
使用 @RunWith(Suite.class) 标注, 表明这是一个 Aggregating test。@SuiteClasses 注解用于将分布在多个类中的测试用例聚集起来 . . .
测试类需要使用 @RunWith(Parameterized.class) 标注, 表明这是一个 Parameterized test。
由 @Parameters 注解标注的 public static Collection<Object[]> 方法提供一组测试数据, 测试用例执行时, 通过有参的构造方法将测试数据依次入参, 如第一组 {1, 2, 3}, 则构造器参数 x=1, y=2, z=3。最后执行测试方法 . . .
@BeforeClass 和 @AfterClass 注解标注的方法要求是 public static void 修饰的无参方法。
@BeforeClass 在整个单元测试过程中仅执行一次, 并且是在测试开始之前执行。
@AfterClass 在整个单元测试过程中也仅执行一次, 并且是在测试结束之后执行。
BasicTest 每个测试用例执行时都会新创建一个当前类的实例, 可以从执行结果中看到, BasicTest 的构造器被执行了 2 次。
@Test 测试用例, 由 public void 修饰的无参方法。
@Before 在 @Test 执行之前执行。
@After 在 @Test 执行之后执行
timeout :毫秒为单位, 若方法执行完成耗时超出给定的数值, 则视为失败。
expected :预测方法抛出的异常, 若方法执行过程中没有抛出给定的异常, 则视为失败 . . .
配置作用 :拷贝 src/main/webapp/WEB-INF/config 目录下的资源文件到类路径 target/classes。phase :maven 构建的生命周期的阶段。goal :可选值 [resources|testResources|copy-resources]。filtering :默认为 false。若为 true, 资源文件中可以通过 ${variable} 来引用 maven properties。encoding :与 filtering=true 一起作用, 指变量替换的字符集编码。directory :资源文件所在的目录。include :包含的文件。exclude :排除的文件。outputDirectory :拷贝到的目录 . . .
介绍 Jetty 插件常用配置, 端口修改、取消静态资源文件锁定、自动热部署、手动重加载、访问日志记录、webApp 上下文配置、部署多运用等 . . .
介绍 test、-e、site、package、install、compile、test-compile、clean、-Dmaven.test.skip、-Dmaven.test.failure.ignore、dependency:sources、dependency:tree、project-info-reports:dependencies、help:effective-pom、help:describe、dependency:resolve、idea:idea、eclipse:eclipse、archetype:create 命令功能及其使用 . . .
介绍 ${basedir}、${project.*}、${project.build.*}、${settings.*}、${env.*}、java properties、properties . . .
默认环境下, 新建 maven 项目, 项目左下方出现一个感叹号, JRE 显示的是 1.5。打开 %maven%/conf/settings.xml 文件并编辑它, 找到 <profiles> 节点, 添加第 2 至第 13 行的配置, 保存并关闭。重启 eclipse . . .
到文章最后下载 eclipse-maven-plugin.zip 离线安装包。解压缩到任意目录。在 eclipse 安装目录新建一个 links 文件夹。在 links 文件夹内新建一个文本文件, 并重命名为 maven.link。用文本编辑器打开 maven.link 并编辑它 . . .
1> maven 3.3, 要求 jdk 1.7 或 jdk 1.7+
2> maven 3.2, 要求 jdk 1.6 或 jdk 1.6+
3> maven 3.1, 要求 jdk 1.5 或 jdk 1.5+
4> maven 3.0, 要求 jdk 1.5 或 jdk 1.5+
RequestMappingHandlerAdapter 负责处理请求参数到处理方法参数的绑定以及数据类型转换等工作。
介绍数据绑定配置、防止 JSON 数据中文乱码配置 . . . . . .
@RequestMapping 用于处理请求与处理方法之间的映射关系。RequestMappingHandlerMapping 负责分发请求, 它自动的查找控制器中所有的 @RequestMapping 注解, 当一个请求到来时, 它决定调用哪个方法来处理这个请求。
请求被 MethodAccessInterceptor 截获。可以看到, HandlerInterceptor.preHandle 在处理方法执行前执行, HandlerInterceptor.postHandle 在处理方法执行后执行, 当请求处理完成后执行 HandlerInterceptor.afterCompletion。若 HandlerInterceptor.preHandle 返回 false, 则终止后续逻辑的执行。HandlerInterceptor 的这 3 个方法提供了足够的灵活性来做各种各样预处理和后处理操作 . . . . . .
spring mvc 控制器里的所有处理方法的逻辑视图由视图解析器来解析。spring mvc 支持多种视图技术, 并提供了多种视图解析器。
1.UrlBasedViewResolver 支持 "redirect:" 和 "forward:" 前缀。每个逻辑视图名称被解析成 :prefix + [logical-view-name] + suffix, 如逻辑视图名称为 home, 则视图的逻辑位置为 :/WEB-INF/pages/home.jsp, 并通过创建一个具体的 viewClass 实例来渲染该视图。
2.InternalResourceViewResolver 是 UrlBasedViewResolver 的一个扩展类, 它使用 InternalResourceView 来渲染视图。
3.FreeMarkerViewResolver 是 UrlBasedViewResolver 的一个扩展类, 它使用 FreeMarkerView 来渲染视图。
4.VelocityViewResolver 是 UrlBasedViewResolver 的一个扩展类, 它使用 VelocityView 来渲染视图。
5.ContentNegotiatingViewResolver 用于支持同一资源的多种不同的表现形式, 如 jsp、json、xml 等。具体采用何种方式来表现, 取决于 Http Accept Header . . . . . .
当 org.springframework.web.servlet.DispatcherServlet 配置 / 拦截所有请求, 项目中的图片、脚本、样式等资源文件无法直接的来访问。<mvc:resources> 允许你为特定的 url 配置特定的静态资源文件的访问列表 . . . . . .
当请求不需要执行控制器逻辑时, 可通过 直接配置静态视图页面。它是 ParameterizableViewController 的一种快捷配置方式, ParameterizableViewController 总是返回一个预设的视图页 . . . . . .
spring mvc 中使用 redirect: 前缀可完成重定向的动作。"redirect:/user/home" 表明重定向到 /user/home, RedirectAttributes.addFlashAttribute(key, value) 可以携带参数到重定向的 url, 并且参数不会显式的出现在重定向的 url 中。实际上, 这样的参数数据是暂存在用户 session 中, 这些参数数据可以作为一个对象被保持着, 直至下一次请求发起时, 这些数据才会被清掉。RedirectAttributes.addAttribute(key, value) 可以携带字符串格式参数到重定向的 url, 并且参数会显式的出现在重定向的 url 中。若参数中含有中文, 会出现中文乱码, 可通过转码的方式来解决 ( 如上 ) . . . . . .
@InitBinder 注解允许你在 Controller 中配置 命令/表单 属性和所有请求参数的绑定方式, 并且不能有返回值。 一般而言, Http GET 请求参数绑定到的对象称为命令对象, Http POST 请求参数绑定到的对象称为表单对象。命令/表单 属性则是指这类对象的属性。这里的 @InitBinder 标注用了 value 注解, 若 value 注解缺省, 则绑定规则在当前 Controller 内有效。若标注 value 注解, 则只有当命令/表单属性和所有的请求参数名称与该 value 注解标注的名称一致时, 绑定才起效 . . . . . .
@SessionAttributes 注解在类级别上, 表明属性的作用域是 session。介绍如何通过 @SessionAttributes 注解将一个属性放入 session 域, 以及放入 session 域后如何来删除这个属性。展示 @SessionAttributes 属性未初始化时, 如何防止 500 异常 . . . . . .
@RequestBody 注解表明处理方法的参数的值是绑定到 Http Request Body, 处理方法执行时从 Http Request Body 中读取绑定的数据到参数。
示例展示 jquery 如何提交 pojo, list, map 类型的 json 数据 . . . . . .
@ResponseBody 注解表明处理方法的返回值不作为视图名称来解析, 而直接写出到 Http Response Body。
示例展示 jquery 如何解析 pojo, list, map 类型的 json 数据 . . . . . .
@PathVariable 注解用于绑定处理方法的参数到 URI 模板变量中。
{id} 是一个变量, 使用 @PathVariable 注解可以将该变量绑定到处理方法参数中。如 GET /product/find/31100042, 处理方法 find 执行时, 31100042 将作为处理方法参数 id 的值被设置进去。
@RequestMapping 注解在 URI 模板变量中支持正则表达式, 语法 :{变量名:正则表达式}。通过 @PathVariable 注解即可绑定该模板变量到处理方法的参数中 . . . . . .
@RequestParam 注解用于绑定请求中的参数到处理方法的参数中。
@RequestParam 注解标注的参数默认是必须的 ( required = true ), 不可缺省。就基本数据类型而言, 其值要求是必须的, 如果允许空值, 需要用包装类型来替代 ( required = true )。
若处理方法的参数名与绑定的请求的参数名称不一致, 需要在处理方法中用 value 注解显式的指明绑定的请求的参数的名称 . . . . . .
涉及 @RequestMapping, @ResponseBody, @RequestBody, @PathVariable 注解以及正则表达式的运用。
@RequestMapping 注解用于将请求映射到控制器的某个具体的处理方法上。它可以标注在方法级别上, 也可以标注在类级别上, 标注在类级别上不是必须的。
value 用于映射请求的 url 表达式, 以缩小映射的范围。 参数类型 String[], 如 value = "/pathname", value = {"/", "/pathname"}。
当注解只有一个参数 value 时, value 可以省略。@RequestMapping("/class-level-mapping") 完整的写法是 @RequestMapping(value = "/class-level-mapping") . . . . . .
在 web.xml 中需要配置 DispatcherServlet, 它用于处理符合规则的外部请求, 并将请求分发给合适的控制器来处理。
这里使用默认的 /WEB-INF/[servlet-name]-servlet.xml ( /WEB-INF/mvc-dispatcher-servlet.xml ) 作为 spring mvc 的配置文件。
除此之外, 还可以通过 init parameter 来指定 spring mvc 的配置文件 . . . . . .