《经久不衰的Spring框架:Spring+SpringMVC+MyBatis 整合》
前言
主角即Spring、SpringMVC、MyBatis,即所谓的SSM框架,大家应该也都有所了解,概念性的东西就不写了,有万能的百度。之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目重新搭建了一次,而且比项目搭建的要更好一些。以前解决问题的过程和方法并没有及时记录,以后在自己的小项目中遇到我再整理分享一下。个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助。
工作环境:JDK 1.7、Mysql 5.6、Myeclipse 10、Tomcat 7、Maven
框架版本:Spring 4.2.6.RELEASE、SpringMVC 4.2.6.RELEASE、MyBatis 3.2.8
一、整体文件结构设计
项目目录结构:
1、类文件和资源文件分开存放,类文件分为六层,其中common存放公共和框架部分,controller存放项目控制层,service存放项目业务逻辑层,model存放项目实体类,mapper存放数据层接口,test存放测试相关类。
注:若涉及到多业务模块的情况,分层可以在各层内部进行划分,当然对于大模块建议采用Maven多模块项目方式搭建。
2、前端在webapp下分出了common和project,common存放公共部分,project内部用于存放多个子模块,common以及各子模块内部分别新建images,js,css和view四个文件夹,用于归类不同资源。
二、项目入口web.xml
构建好整体结构后,接下来应该把目光看下web.xml文件,无论是何种JavaEE框架,入口总是在web.xml,认准这边就没错了。
web.xml 内容很多,SSM整合相关的关键部分就是加载Spring配置文件spring-config.xml,以及将SpringMVC核心调度器DispatcherServlet注册为servlet(配置文件为mvc-config.xml),其他部分有注释,选择性观看即可。
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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- ================站台名称,站台描述,大小图标================ -->
<display-name>SpringMVC</display-name>
<description>柴可夫斯基模板</description>
<icon>
<small-icon>/common/images/favicon.ico</small-icon>
<large-icon>/common/images/favicon.ico</large-icon>
</icon> <!-- 支持分布式 -->
<!-- <distributable/> --> <!-- 应用路径,如果不设置,缺省为"webapp.root",当tomcat加载多个项目时,会发生名称冲突 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>spring4.root</param-value>
</context-param> <!-- ================log4j配置开始================ -->
<!-- log4j2不需要在这边做额外的配置 -->
<!-- ================log4j配置结束================ --> <!-- ================Spring配置开始================ -->
<!-- 设置Spring容器加载所有的配置文件的路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-config.xml</param-value>
<!-- <param-value>classpath:/spring-*.xml</param-value> -->
</context-param>
<!-- 配置Spring监听器,可以在容器启动时,加载contextConfigLocation的context-param节点的配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- ================Spring配置结束================ --> <!-- 配置监听器,定义在服务器启动和关闭时,需要执行的方法 -->
<listener>
<listener-class>com.demo.common.startup.InitListener</listener-class>
</listener> <!-- 防止Struts和Quartz等内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener> <!-- 监听HTTP请求事件,为Bean的request,session,globalsession等作用域提供支持 -->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener> <!-- Spring 字符编码配置 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 自定义登录过滤器,拦截JSP页面,不允许直接访问 -->
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.demo.common.filter.LoginFilterSpring</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>contentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping> <!--包装request过滤器-->
<filter>
<filter-name>wrapRequestFilter</filter-name>
<filter-class>com.demo.common.filter.WrapParameterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>wrapRequestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 激活Tomcat的defaultServlet来处理静态文件(效率较高) -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.gif</url-pattern>
<url-pattern>*.png</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.ico</url-pattern>
<url-pattern>*.eot</url-pattern>
<url-pattern>*.svg</url-pattern>
<url-pattern>*.ttf</url-pattern>
<url-pattern>*.woff</url-pattern>
<url-pattern>*.mp3</url-pattern>
<url-pattern>*.html</url-pattern>
</servlet-mapping> <!-- ================配置SpringMVC核心调度器================ -->
<!-- 不指定具体文件的话,默认为"/WEB-INF/<servlet name>-servlet.xml" -->
<!-- load-on-startup代表启动顺序,设置为大于等于0表示容器在应用启动时就加载并初始化这个servlet -->
<!-- 推荐拦截/,风格优雅 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <!-- 随服务器启动的servlet -->
<servlet>
<servlet-name>initServlet</servlet-name>
<servlet-class>com.demo.common.startup.InitServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet> <!-- 阿里巴巴数据源配置启用Web监控统计功能 -->
<!-- 通过 http://ip:port/druid/ 地址访问即可 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<param-name>allow</param-name>
<param-value>127.0.0.1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping> <!-- CXF服务发布配置 -->
<servlet>
<servlet-name>CXFService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFService</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping> <!-- 设置session过期时间为60分钟 -->
<session-config>
<session-timeout>60</session-timeout>
</session-config> <!-- 指定错误404和500的处理页面 -->
<error-page>
<error-code>404</error-code>
<location>/common/view/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/common/view/500.jsp</location>
</error-page> <!-- 欢迎页面 -->
<welcome-file-list>
<welcome-file>common/view/index.jsp</welcome-file>
</welcome-file-list> </web-app>
三、Spring 框架配置
这块涉及内容也很多,从何说起呢,先上一下文件内容好了:
spring-config.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <!-- 加载配置属性文件 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:constant.properties"/> <!-- 开启异步任务(同时开启定时器注解扫描) -->
<task:annotation-driven /> <!-- 使用@AspectJ风格的切面声明 -->
<!-- <aop:aspectj-autoproxy/> --> <!-- 使用Annotation自动注册Bean -->
<!-- 在主容器中不扫描@Controller注解,在SpringMvc中只扫描@Controller注解 -->
<context:component-scan base-package="com.demo"><!-- base-package 如果多个,用“,”分隔 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan> <!-- 引入Mybatis配置 -->
<import resource="spring-mybatis.xml"/> <!-- 引入Socket配置 -->
<import resource="spring-socket.xml"/> <!-- 引入MongoDB配置 -->
<import resource="test/mongo-config.xml"/> <!-- 引入定时器任务配置 -->
<!-- <import resource="classpath*:com/demo/config/spring-job.xml"/> --> <!-- 引入hibernate4配置 -->
<!-- <import resource="spring-hibernate.xml"/> --> <!-- 引入缓存配置 -->
<!-- <import resource="spring-cache.xml"/> --> <!-- 引入CXF配置 -->
<import resource="test/spring-cxf.xml"/> <!-- 引入Redis配置(无需如此配置,直接使用RedisUtil即可) -->
<!-- <import resource="test/spring-jedis.xml"/> -->
</beans>
上面内容很多,但是并不全是SSM框架的,需要关注的点只有下面几个:
1、context:component-scan 包扫描
这个注解不用多说了,要注意的就是主容器中不扫描@Controller注解,因为@Controller将会在SpringMVC扫描。
2、import 标签和多文件配置
在团队开发时候,每个人都常去改动Spring配置文件,不科学,使用这个技巧方便,每个都有各自的配置文件了。项目较大,有较多的bean时,可以将其分散到子文件中。虽然Spring还有自动扫描的功能,但我感觉也不怎么好,需要去扫描,影响性能;而且各个Bean分散在不同包中,不好配置。
多文件配置通常有两种做法:
2.1 在 web.xml配置中的contextConfigLocation节点配置多个值。
具体代码如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/context1.xml,
/WEB-INF/classes/context2.xml,
/WEB-INF/classes/context3.xml
</param-value>
</context-param>
其中分隔符可以是","也可以是" "等,也可以用通配符application-*,这样配置的要求是,你的Spring配置文件必须是applicationContext-*****.xml这样的形式存在,*号代表通配符,具体就不说了。
2.2 在一个application.xml中配置多个import标签引入其他文件。
个人喜欢这种方式,清晰明了,总得有一个主入口吧(估计受了webpack和SeaJS的影响)。
从这边也不难看到Spring框架在其中扮演的角色:管理容器,有效地组织你的中间层对象(无节操得集成其他框架)。
3、引入mybatis配置:spring-mybatis.xml
这个文件就是用来完成spring和mybatis的整合的。这里面也没多少行配置,主要的就是自动扫描,自动注入,配置数据库。注释也很详细,大家看看就明白了。
spring-mybatis.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> <!-- 1. 数据源配置 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc.properties" /> <!-- Druid方式配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password -->
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="10" />
<property name="minIdle" value="20" />
<property name="maxActive" value="100" /> <!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="6000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" /> <!-- 验证是否回收 -->
<property name="validationQuery" value="SELECT 'x' FROM DUAL" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" /> <!-- 开启Druid的监控统计功能 -->
<property name="filters" value="stat" />
</bean> <!-- 2. 创建SqlSession的工厂 -->
<!-- dataSource:引用数据源,统一加载配置-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" ></property> <!-- 自动配置别名-作用类似mybatis-config.xml的别名 -->
<property name="typeAliasesPackage" value="com.demo.model" /> <!-- 设置别名的类加上父类限定 -->
<property name="typeAliasesSuperType" value="com.demo.common.base.BaseEntity"/> <!-- 当mybatis的xml文件和mapper接口不在相同包下时,需要用mapperLocations属性指定xml文件的路径 -->
<!-- *是个通配符,代表所有的文件,**代表所有目录下 -->
<property name="mapperLocations" value="classpath*:mappings/**/*.xml"/> <!-- 指定mybatis核心配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean> <!-- 3. 自动扫描加载Sql映射文件/接口 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- sqlSessionFactoryBeanName:代表延迟加载-->
<!-- 这个配置的前提条件是:映射接口类文件(.java)和映射XML文件(.xml)需要放在相同的包下(com.demo.mapper)-->
<!-- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <!-- basePackage:指定sql映射文件/接口所在的包(自动扫描)-->
<property name="basePackage" value="com.demo.mapper"></property> <!-- 扫描basePackage下所有以@MyBatisDao注解的接口 -->
<property name="annotationClass" value="com.demo.common.persistence.annotation.MyBatisDao"/>
</bean> <!-- 4. 事务管理 -->
<!-- dataSource:引用上面定义的数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 5. 使用声明式事务 -->
<!-- transaction-manager:引用上面定义的事务管理器 -->
<!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> <!-- 定义JdbcTemplate的Bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource"></bean> </beans>
四、SpringMVC 框架配置
这块配置里面的注释也很详细,在此就不说了,主要是自动扫描控制器,视图模式,注解的启动这三个。
mvc-config.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <!-- 打开使用注解自动检测功能自动注册Bean,只扫描@Controller -->
<context:component-scan base-package="com.demo" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan> <!-- 文件上传表单的视图解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="2097152"></property><!--限制文件上传2M内 -->
<property name="maxInMemorySize" value="40960"></property>
</bean> <!-- 默认的注解映射的支持 - 增加String类型中文解析 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven> <!-- 使用自定义Spring拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.demo.common.core.SpringMVCInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors> <!-- 视图配置 -->
<!-- 对转向页面的路径解析,指定输出视图的前后缀,controller返回的视图直接加上此前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/project/" p:suffix=".jsp" /> </beans>
这部分内容也可以参考上一篇博文:《经久不衰的Spring框架:SpringMVC 统括》
五、部署与测试
到此,已经完成了SSM三大框架的整合了,接下来测试一下,如果成功了,那么恭喜你,如果失败了,继续调试吧,作为程序员就是不停的与BUG做斗争!
测试的话,无非就是新建对应的view、controller、service、mapper ,测试一下SpringMVC和Mybatis的功能,很简单,就不罗嗦了。
部署的话,就干到tomcat里面去,启动,访问localhost即可,也不赘述了。
至此,SSM三大框架的整合就完成了,在此基础上可再添加其他功能。
编后语
由于这只是SSM整合的文章,所以上面很多文件内容没有面面俱到,比如日志处理、socket、ws、bean定制等等,后续觉得有用得会继续放上来,请继续关注山人行博客。
《经久不衰的Spring框架:Spring+SpringMVC+MyBatis 整合》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- access 随机选取数据
access随机读取数时 用order by rnd(id) 发现每次获取的数据顺序都是一致的,必须要加上随机数才可以,如下: Random r = new Random(); ...
- 理解Twisted与非阻塞编程
先来看一段代码: # ~*~ Twisted - A Python tale ~*~ from time import sleep # Hello, I'm a developer and I mai ...
- java web开发中的奇葩事web.xml中context-param中的注释
同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步 ...
- 【拓扑排序】【线段树】Gym - 101102K - Topological Sort
Consider a directed graph G of N nodes and all edges (u→v) such that u < v. It is clear that this ...
- UVa 757 - Gone Fishing
题目大意:John有h的时间可以去钓鱼,有n湖可钓鱼,以5分钟为时间单位,每个湖初始每个单位时间可钓f条鱼,每下一个时间单位数量减少d条.同时,John只能从1号湖往后走进行钓鱼,湖之间的距离需要t个 ...
- Dictionary使用(转)
1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib)2.描述 1).从一组键(Key)到一组值(Value)的 ...
- IE6滤镜在实战测试中能让父层里面的子元素产生阴影
1.写法一: <div class="cornerbg"> <p class="title-file">------</p& ...
- 解决Centos 7 下 tomcat字体异常 Font '宋体' is not available to the JVM
错误提示: SEVERE: Servlet.service() for servlet [example] in context with path [/myproject] threw except ...
- BOM总结
一.BOM概念 BOM:Browser Object Model 浏览器对象模型,定义了JS操作浏览器的一些方法和属性 二.BOM方法 (在BOM里面大部分的方法都是调用window对象下的方法得到 ...
- ThinkPHP--IS_AJAX
增加IS_GET,IS_POST,IS_PUT,IS_DELETE,IS_AJAX常量,方便除控制器外的地方判断方法,Action类的isGet isPost等方法暂时保留,但不建议使用.