Spring+SpringMVC+MyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)
1.非注解的处理器映射器和适配器
1.1非注解的处理器映射器
前面我们配置的org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping是非注解的处理器映射器。这种映射器其实有一个问题就是要一个bean里面配置一个url。
现在我们再配置另一个非注解映射器
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,它会将url和handler集中进行配置。
- <!-- 配置Handler -->
- <bean id="ItemsController1" name="/queryItems.action" class="joanna.yan.ssm.controller.ItemsController1"/>
- <!-- 配置处理器映射器
- 将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
- -->
- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
- <!-- 简单url映射
- simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版,
- 它可以将url和处理器bean的id进行统一映射配置。
- -->
- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <!-- 对ItemsController1进行url映射,url是/queryItems1.action -->
- <prop key="/queryItems1.action">ItemsController1</prop>
- <prop key="/queryItems2.action">ItemsController1</prop>
- </props>
- </property>
- </bean>
疑问:可以同时配置这两个映射器吗?
解答:多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。
1.2非注解的处理器适配器
前面我们配置的org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter是一个非注解的适配器。它要求你编写的Handler要实现Controller接口。
再说另一个非注解的适配器:
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter。它要求编写的Handler实现HttpRequestHandler接口。
- public class ItemsController2 implements HttpRequestHandler{
- @Override
- public void handleRequest(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //调用service查找数据库,查询商品列表,这里使用静态数据模拟
- List<Items> itemsList=new ArrayList<Items>();
- Items items_1=new Items();
- items_1.setName("联想笔记本");
- items_1.setPrice(6000f);
- items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
- Items items_2 = new Items();
- items_2.setName("苹果手机");
- items_2.setPrice(5000f);
- items_2.setDetail("iphone6苹果手机!");
- itemsList.add(items_1);
- itemsList.add(items_2);
- //设置模型数据
- request.setAttribute("itemsList", itemsList);
- //设置转发的视图
- request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);
- // 从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,可通过response修改定义响应内容,比如返回json数据:
- // response.setCharacterEncoding("utf-8");
- // response.setContentType("application/json;charset=utf-8");
- // response.getWriter().write("json串");
- }
- }
在springmvc.xml中配置:
2.DispatcherServlet.properties
前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,则使用默认加载的。
3.注解的处理器映射器和适配器
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。
3.1配置注解映射器和适配器
- <!--注解映射器 -->
- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
- <!--注解适配器 -->
- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
- <!--使用mvc:annotation-driven代替上边注解映射器和注解适配器 配置
- mvc:annotation-driven默认加载很多的参数绑定方法,
- 比如json转换解析器就默认加载了,如果使用mvc:annotation-driven就不用配置上面的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
- 实际开发时使用mvc:annotation-driven
- -->
- <!-- <mvc:annotation-driven></mvc:annotation-driven> -->
3.2开发注解Handler
使用注解的映射器和注解的适配器。(注解的映射器和注解的适配器必须配对使用,理解为不能使用非注解映射器进行映射)
- /**
- * 开发注解Handler
- * 使用@Controller标明它是一个控制器
- * @author Joanna.Yan
- *
- */
- @Controller
- public class ItemsController3{
- //商品查询列表
- //@RequestMapping实现对queryItems方法和url进行映射,一个方法对应一个url
- //一般建议将url和方法名写成一样,方便维护
- @RequestMapping("/queryItems")
- public ModelAndView queryItems() throws Exception{
- //调用service查找数据库,查询商品列表,这里使用静态数据模拟
- List<Items> itemsList=new ArrayList<Items>();
- Items items_1=new Items();
- items_1.setName("联想笔记本");
- items_1.setPrice(6000f);
- items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
- Items items_2 = new Items();
- items_2.setName("苹果手机");
- items_2.setPrice(5000f);
- items_2.setDetail("iphone6苹果手机!");
- itemsList.add(items_1);
- itemsList.add(items_2);
- //返回ModelAndView
- ModelAndView modelAndView=new ModelAndView();
- modelAndView.addObject("itemsList", itemsList);
- //指定视图
- modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
- return modelAndView;
- }
- //定义其它方法
- //商品添加
- //商品修改
- }
3.3在spring容器中加载Handler
- <!-- 对于注解的Handler可以单个配置
- 实际开发中建议使用组件扫描
- -->
- <!-- <bean class="joanna.yan.ssm.controller.ItemsController3" /> -->
- <!-- 可以扫描controller、service、...
- 这里让扫描controller,指定controller的包
- -->
- <context:component-scan base-package="joanna.yan.ssm.controller"></context:component-scan>
使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用<context:component-scan/>自动扫描标记@Controller的控制类。
3.4 部署调试
访问:http://localhost:8080/SpringMVC/jyqueryItems.action
注意:在测试过程中单个配置注解的Handler运行没有问题,在配置组件扫描器运行时,启动Tomcat报错:
- 严重: Context initialization failed
- java.lang.IllegalArgumentException
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
- at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
- at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
- at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
- at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
- at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
- at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
- at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
- at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
- at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
- at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
- at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
- at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
- at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
- at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
- at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
- at javax.servlet.GenericServlet.init(GenericServlet.java:158)
- at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
- at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
- at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
- at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5266)
- at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5554)
- at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
- at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
- at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
- at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
- at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1258)
- at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1918)
- at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
- at java.util.concurrent.FutureTask.run(Unknown Source)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
- at java.lang.Thread.run(Unknown Source)
- 六月 14, 2017 4:43:03 下午 org.apache.catalina.core.ApplicationContext log
- 严重: StandardWrapper.Throwable
- java.lang.IllegalArgumentException
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
- at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
- at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
- at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
- at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
- at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
- at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
- at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
- at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
- at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
- at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
- at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
- at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
- at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
- at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
- at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
- at javax.servlet.GenericServlet.init(GenericServlet.java:158)
- at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
- at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
- at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
- at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5266)
- at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5554)
- at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
- at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
- at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
- at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
- at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1258)
- at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1918)
- at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
- at java.util.concurrent.FutureTask.run(Unknown Source)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
- at java.lang.Thread.run(Unknown Source)
- 六月 14, 2017 4:43:03 下午 org.apache.catalina.core.StandardContext loadOnStartup
- 严重: Servlet [springmvc] in web application [/SpringMVC] threw load() exception
- java.lang.IllegalArgumentException
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.asm.ClassReader.<init>(Unknown Source)
- at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
- at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
- at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
- at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
- at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
- at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
- at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
- at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
- at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
- at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
- at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
- at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
- at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
- at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
- at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
- at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
- at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
- at javax.servlet.GenericServlet.init(GenericServlet.java:158)
- at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
- at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
- at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
- at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5266)
- at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5554)
- at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
- at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
- at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
- at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
- at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1258)
- at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1918)
- at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
- at java.util.concurrent.FutureTask.run(Unknown Source)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
- at java.lang.Thread.run(Unknown Source)
原因是:我的Tomcat的jdk是1.8,项目的jdk版本是1.7,两者不一样造成的。记得要统一版本!
4.前端控制器源码分析
通过前端控制器源码分析springmvc的执行过程。
第一步:前端控制器接收请求
调用doDispatch
第二步:前端控制器调用处理器映射器查找Handler
第三步:调用处理器适配器执行Handler,得到执行结果ModeAndView
第四步:视图渲染,将model数据填充到request域。
视图解析,得到view:
调用view的渲染方法,将model数据填充到request域。
渲染方法:
5.视图解析器配置前缀和后缀
springmvc.xml中:
- <!-- 配置视图解析器
- 解析jsp视图,默认使用jstl标签,所有classpath下得有jstl的包
- -->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!--配置jsp路径的前缀 -->
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <!--配置jsp路径的后缀 -->
- <property name="suffix" value=".jsp"/>
- </bean>
程序中不用指定前缀和后缀:
- //指定视图
- // modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
- //下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
- modelAndView.setViewName("items/itemsList");
Spring+SpringMVC+MyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)的更多相关文章
- Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6985816.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十)--My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十四)——SpringMVC和MyBatis整合
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7010363.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十三)--S ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)--S ...
- Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6908763.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(四)——My ...
随机推荐
- php curl 的几个实例
使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并把 ...
- javaSE_08Java中static、继承、重写
一.Static 学习静态这个关键字,关键是抓住两个点: 1,关注其语法特点 2,关注其使用场景 案例讲解: 我们先从静态变量开始,当一个成员变量加上static修饰之后,会是一个什么效果? 比如创建 ...
- Ubuntu安装genymotion模拟器步骤
1.安装VitrualBox genymotion模拟器需要有VirtualBox环境,打开终端(ctrl + alt + T),执行以下命令: sudo apt-get install virtua ...
- android设计,图标等概述
作者:郦橙 锦妖 链接:https://www.zhihu.com/question/36813390/answer/87029428 著作权归作者所有,转载请联系作者获得授权. 简单复制,用于记录, ...
- SQL Server Alwayson读写分离配置
标签:MSSQL/只读路由 概述 Alwayson相对于数据库镜像最大的优势就是可读副本,带来可读副本的同时还添加了一个新的功能就是配置只读路由实现读写分离:当然这里的读写分离稍微夸张了一点,只能称之 ...
- Unslider Web前端框架之图片轮播
前端框架,前端组件,前端库,都是一个意思,能看源码. 最近做H5小游戏,用到了图片轮播的组件,而且要求支持移动端触屏滑动.一开始用的是nivo slider,但是对大小不一样的图不支持box 的参数设 ...
- logging模块
要想使用好logging模块首先要知道它的使用流程: logging类的实例化:logger=logging.getLogger('') 设置logger的级别,logger.setLevel(log ...
- [1] Entity Framework
开发框架之Entity Framework
- Myeclipse中隐藏jar包
在package explorer的右上角有一个向下的小三角 点击选择Filter 在打开的对话框中 第一个选框中打上对勾 文字框中填上 *.jar 然后点击OK就行了 多个隐藏内容之间用逗号隔开 如 ...
- Testlink研究小结
1.Redmine与Testlink的关联 (1)redmine中的项目对应testlink的测试项目 (2)testllink执行用例时发现的问题可以记录到redmine中 2.Testlink优点 ...