关于springMVC中component-scan的问题以及springmvc.xml整理
关于springMVC中component-scan的问题以及springmvc.xml整理
一、component-scan问题和解决办法
最近在学习使用springMVC+mybatis开发程序的时候,遇到了一些问题,这些问题有的很容易就解决了,可是有一个问题废了我一上午的时间,那就是spring中的组件扫描技术, <context:component-scan base-package="***.***.***"></context:component-scan>这个技术可以让我们少些很多javabean,还是很方便的,可是我在使用了这样的技术之后就一直报java.lang.illegalargumentexception这样的错误,很是苦恼,哪里有参数不合法了,接下来我注释掉了这个component-scan条目,然后使用了普通的javabean来进行暴露,没想到竟然成功了,因此我可以断定问题一定出在这个组件扫描component-scan上,看了很多的资料,都是讲的component-scan的相关内容,可是很少会提及component-scan与java.lang.illegalargumentexception的错误,最终,我总算找到了原因所在,那就是我是用的是spring3.2的大版本,jdk使用的是1.8大版本,这样问题就出来了,版本不匹配,在执行jre的时候就不能相互兼容了,一定要注意在使用组件扫描的时候必须使用jdk和spring的版本相对应的jar,不然的话就会出现不合法的参数错误,真正正确的搭配版本应该是这样的:jdk1.7+spring-context-support-3.2.0.RELEASE.jar或者jdk1.8+spring 4.*来搭配,在这里我使用了前者来解决!解决方法是首先卸载了电脑上的jdk环境,这点可以通过控制面板的“程序和功能”来完成,剩下的就是下载搭配的jdk版本,然后安装,安装之后一般还要重启一下电脑,当然也可以不启动,之后再打开程序,将新的环境jre导入程序中,这样就可以了。因为我的这一点疏忽,让我吃尽了苦头,费了好长时间,在这里我不得不说采用xml的方法进行数据即代码配置,好处是非常大的,但是错误就是难以找到哪个地方出问题了,一旦出现了一个这种相关度非常低的错误,往往是非常费时间的,不利于测试和排错,因此在这里做一整理和总结。
二、注解和非注解的方式总结
2.1、非注解的方式
2.1.1、 方法一
<!-- 第一种配置handler的方法,通过beanname来配置,处理器映射器需要配置为beanname
特别注意这里处理器适配器不能为HttpRequestHandlerAdapter,只能为SimpleControllerHandlerAdapter-->
<bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" /> <!-- 处理器映射器 将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url) 所有的映射器都实现 HandlerMapping接口。-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- 处理器适配器 所有处理器适配器都实现 HandlerAdapter接口 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
2.1.2、 方法二
这里注意,我们在上面定义了handler1,并且映射方式是beanname,而这里我们不加改变的,只是利用了其中的一部分信息,id,在这里使用 SimpleUrlHandlerMapping和SimpleControllerHandlerAdapter同样完成了访问对应上面handler的功能的网址的功能,并且同一个handler还可以映射成不同的网址! 值得注意的是,我们使用这两种映射器和SimpleControllerHandlerAdapter适配器只能实现具有public class ItemsController1 implements Controller {。。。}这样生成的handler 。而对于public class ItemsController2 implements HttpRequestHandler {。。。}则无能为力。这种情况需要使用org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter另外,对于handler来说使用什么映射器和是用什么适配器之间并没有什么强定义的关系,但是适配器一定要和handler的定义保持一致,映射器只与映射器的定义方法有关!!!!
<!-- 配置Handler2 -->
<bean id="itemsController2" class="cn.itcast.ssm.controller.ItemsController2" />
<!--简单url映射 -->
<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>
<prop key="/queryItems3.action">itemsController2</prop>
</props>
</property>
</bean>
<!-- 非注解的适配器 ,适用于public class ItemsController2 implements HttpRequestHandler {。。}方法-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
package cn.itcast.ssm.controller; import java.util.ArrayList;
import java.util.List; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller; import cn.itcast.ssm.po.Items; public class ItemsController1 implements Controller { @Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception { //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>();
//向list中填充静态数据 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();
//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList); //指定视图
modelAndView.setViewName("items/itemsList"); return modelAndView;
}
}
ItemsController1代码
package cn.itcast.ssm.controller; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.HttpRequestHandler;
import org.springframework.web.servlet.ModelAndView; import cn.itcast.ssm.po.Items; public class ItemsController2 implements HttpRequestHandler { @Override
public void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>();
//向list中填充静态数据 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); //使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
/*
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");*/
}
}
ItemsController2代码
2.2、注解的方式
<!-- 注解的方式 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 一定要注意在使用组件扫描的时候必须使用jdk和spring的版本相对应的jar,不然的话就会出现不合法的参数错误,
比如说我本来使用的jdk1.8+spring-context-support-3.2.0.RELEASE.jar就是一个错误的搭配,特别的坑,
废了我一个上午的时间去调试最佳的搭配是使用jdk1.7+spring-context-support-3.2.0.RELEASE.jar或者jdk1.8+spring 4.*来搭配,
在这里我采用了前者来解决! -->
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
package cn.itcast.ssm.controller; import java.util.ArrayList;
import java.util.List; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import cn.itcast.ssm.po.Items; //使用Controller标识 它是一个控制器
@Controller
public class ItemsController3 { //商品查询列表
//@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
//一般建议将url和方法写成一样
@RequestMapping("/queryItems")
public ModelAndView queryItems()throws Exception{ //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>();
//向list中填充静态数据 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();
//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList); //指定视图
//下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
//上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
modelAndView.setViewName("items/itemsList");
return modelAndView;
}
}
ItemsController3代码
需要注意的是使用<mvc:annotation-driven></mvc:annotation-driven>可以代替
<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
并且mvc:annotation-driven默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,如果使用mvc:annotation-driven就不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter,实际开发时使用mvc:annotation-driven。
总结,无论使用哪种方法都要使用处理器映射器、处理器适配器这两个基本的方式来对handler(controller)进行控制,处理器映射器解决的是找到URL对应的处理方法,而处理器适配器解决的是到底要怎么去处理我们的事务,这个handler的输入输出到底是什么样子的,需不需要继承一个父类等问题。因此这两个东西和handler是关联非常大的,在实际开发中我们都使用注解开发,除了形式上的简单之外,容易配置,并且在原理上来说,非注解的开发方法只能在一个类中写一个方法,做一件事情,这样就会建立非常多的文件,而使用注解的开发方法方便灵活,便于控制,并且一个handler中可以包含很多个方法来暴露给不同的URL来访问,这点非常方便。
三、视图解析器
<!-- 视图解析器 解析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("items/itemsList");的原因。
四、日期类型的转换(FormattingConversionServiceFactoryBean)
在某些情况下,我们需要对UI上输入的日期格式进行相应的转换,变成我们数据库中对应的格式并存储,然后再显示,这是很常见的,因此我们需要使用mvc:annotation-driven工具进行一定的配置。
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 自定义参数绑定 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<!-- 日期类型转换 -->
<bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
</list>
</property>
</bean>
package cn.itcast.ssm.controller.converter; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.springframework.core.convert.converter.Converter;
public class CustomDateConverter implements Converter<String,Date>{ @Override
public Date convert(String source) { //实现 将日期串转成日期类型(格式是yyyy-MM-dd HH:mm:ss) SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try {
//转成直接返回
return simpleDateFormat.parse(source);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果参数绑定失败返回null
return null;
}
}
CustomDateConverter 代码
Converter<String,Date>是一个模板,在这里我们将String类型转换成Date类型来存储到数据库中。
五、解析静态资源
<!-- 静态资源解析包括 :js、css、img、..使得网页可以访问这些地址-->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/img/" mapping="/img/**"/>
六、校验器
<mvc:annotation-driven validator="validator"></mvc:annotation-driven> <!-- 校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- hibernate校验器-->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" />
</bean>
七、全局异常处理器
<!-- 全局异常处理器,只要实现HandlerExceptionResolver接口就是全局异常处理器-->
<bean class="cn.itcast.ssm.exception.CustomExceptionResolver"></bean>
package cn.itcast.ssm.exception;
public class CustomException extends Exception { //异常信息
public String message; public CustomException(String message){
super(message);
this.message = message;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}
CustomException
package cn.itcast.ssm.exception; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView; public class CustomExceptionResolver implements HandlerExceptionResolver { @Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//handler就是处理器适配器要执行Handler对象(只有method) // 解析出异常类型
// 如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示
// String message = null;
// if(ex instanceof CustomException){
// message = ((CustomException)ex).getMessage();
// }else{
//// 如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
// message="未知错误";
// } //上边代码变为
CustomException customException = null;
if(ex instanceof CustomException){
customException = (CustomException)ex;
}else{
customException = new CustomException("未知错误");
} //错误信息
String message = customException.getMessage(); ModelAndView modelAndView = new ModelAndView(); //将错误信息传到页面
modelAndView.addObject("message", message); //指向错误页面
modelAndView.setViewName("error"); return modelAndView;
} }
CustomExceptionResolver
八、文件上传
<!-- 文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
九、拦截器
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<!-- 登陆认证拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- /**表示所有url包括子url路径 -->
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
package cn.itcast.ssm.interceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class HandlerInterceptor1 implements HandlerInterceptor { //进入 Handler方法之前执行
//用于身份认证、身份授权
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception { System.out.println("HandlerInterceptor1...preHandle"); //return false表示拦截,不向下执行
//return true表示放行
return true;
} //进入Handler方法之后,返回modelAndView之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor1...postHandle"); } //执行Handler完成执行此方法
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception { System.out.println("HandlerInterceptor1...afterCompletion");
} }
HandlerInterceptor1
package cn.itcast.ssm.interceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class HandlerInterceptor2 implements HandlerInterceptor { //进入 Handler方法之前执行
//用于身份认证、身份授权
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception { System.out.println("HandlerInterceptor2...preHandle"); //return false表示拦截,不向下执行
//return true表示放行
return true;
} //进入Handler方法之后,返回modelAndView之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor2...postHandle"); } //执行Handler完成执行此方法
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception { System.out.println("HandlerInterceptor2...afterCompletion");
} }
HandlerInterceptor2
package cn.itcast.ssm.interceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor implements HandlerInterceptor { //进入 Handler方法之前执行
//用于身份认证、身份授权
//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception { //获取请求的url
String url = request.getRequestURI();
//判断url是否是公开 地址(实际使用时将公开 地址配置配置文件中)
//这里公开地址是登陆提交的地址
if(url.indexOf("login.action")>=0){
//如果进行登陆提交,放行
return true;
} //判断session
HttpSession session = request.getSession();
//从session中取出用户身份信息
String username = (String) session.getAttribute("username"); if(username != null){
//身份存在,放行
return true;
} //执行这里表示用户身份需要认证,跳转登陆页面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); //return false表示拦截,不向下执行
//return true表示放行
return false;
} //进入Handler方法之后,返回modelAndView之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor1...postHandle"); } //执行Handler完成执行此方法
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception { System.out.println("HandlerInterceptor1...afterCompletion");
} }
LoginInterceptor
十、小记
SpringMVC博大精深,是Spring的一个模块,是一种web框架,将MVC应用于B/S模式中,将每一个步骤进行了详细而彻底的解耦合,虽然步骤复杂了一些,真正需要我们实现的地方还是可以承受的,最重要的就是xml的配置文件了,比如说关于DispatcherServlet运行的配置文件(一般命名为springmvc.xml)就包含了这个思想内涵的很多地方,同样这一框架也有强大的安全性和可扩展性,诸如面向切面编程(AOP)等思想都是有着强大生命力的,再加上和mybatis结合,适合一些大中型的企业级项目,学会SpringMVC有着很大的现实意义和使用价值。
关于springMVC中component-scan的问题以及springmvc.xml整理的更多相关文章
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- SpringMVC 中的Interceptor 拦截器
1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors> <!-- 日志拦截器 --> <mvc:interceptor> ...
- SpringMVC中使用Jcaptcha实现校验码验证
SpringMVC中使用Jcaptcha实现校验码验证:http://www.tuicool.com/articles/rMzAFj 本文将使用Jcaptcha实现校验码验证,并演示在Spring/S ...
- JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术
在上篇博客中,我们聊了<JavaEE开发之SpringMVC中的自定义拦截器及异常处理>.本篇博客我们继续的来聊SpringMVC的东西,下方我们将会聊到js.css这些静态文件的加载配置 ...
- 2 将mybatis配置到springmvc中
为了更方便的连接数据库,将mybatis配置到springMVC中 1). 首先是jar包 多了3个jar druid 这个是阿里的数据库连接包 mybatis和 mybatis- ...
- SpringMVC注解@Component、@Repository、@Service、@Controller区别
SpringMVC中四个基本注解: @Component.@Repository @Service.@Controller 看字面含义,很容易却别出其中三个: @Controller 控制层, ...
- SpringMVC中与Spring相关的@注解
一.Spring的常用组件类注解 @Component 被该注解所修饰的类是一个普通的spring bean类,该注解可以替代@Controller.@Service.@Repository.在 ...
- Spring|SpringMVC中的注解
文章目录 一.Spring注解 @Controller @ResuController @Service @Autowired @RequestMapping @RequestParam @Model ...
- SpringMvc中的数据校验
SpringMvc中的数据校验 Hibernate校验框架中提供了很多注解的校验,如下: 注解 运行时检查 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素 ...
- 【Spring】SpringMVC中浅析Date类型数据的传递
在控制器中加入如下代码: @InitBinder public void initBinder(ServletRequestDataBinder bin){ SimpleDateFormat sdf ...
随机推荐
- scrapy_Response and Request
scrapy中重要的两个类是什么? Requests.Response 什么是Requests? 网页下载 有哪些参数? url callback headers # 头部信息 cookie ...
- MS SQL 监控磁盘空间告警
这几天突然有个想法:希望能够自动监控.收集数据库服务器的磁盘容量信息,当达到一个阀值后,自动发送告警邮件给DBA,将数据库磁盘详细信息告知DBA,提醒DBA做好存储规划计划,初步的想法是通过作业调用存 ...
- html页面不显示中文
问题:HTML编辑中文后无法在网页上显示中文 原因:是适用的 Cufon字体包不支持中文造成的. 简单粗暴的解决方法:如果你本来打算是去掉Cufon,可以看一看<如何禁用Cufon功能>. ...
- [python] 2、python使用pyaudio进行录音,及其在python虚拟环境virtualenv中安装遇到的问题
1.pyaudio安装大背景 最近在做智能音箱,需要编写声音拾取代码,我先是百度两篇比较常见的用python进行录音的操作的文章: python写一个录音小程序:http://blog.csdn.ne ...
- linux 搭建PPTP
pptp简介 PPTP,Point to Point Tunneling Protocol,点对点隧道协议,这是一种支持多协议虚拟专用网络(VPN)技术.远程用户能够通过装有点对点协议的系统安全访问公 ...
- linux上的组管理
上一次我们谈了CentOS上的用户管理,现在我们再来谈下CentOS上的用户组管理. groupadd创建一个新的组 用法如下: groupadd [选项] groupname 常用选项: -f 强制 ...
- 自动化测试KPI考评的一种方法
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6856204.html 众所周知,在IT ...
- javascript 中 dom.getAttribute("value") 与dom.value的差异
dom 是一个 input type="text" 手动修改 input 的值, 使用 dom.getAttribute("value") 只能得到 html ...
- iOS-image图片压缩
///压缩图片 + (NSData *)imageCompressToData:(UIImage *)image{ NSData *data=UIImageJPEGRepresentation(ima ...
- Tomcat日志与Log4j日志
一:日志作用 更好的调试,分析问题. 普通的一个请求处理10秒钟,日志10秒钟,总共就得20秒钟,这肯定是不行的,因为日志严重影响了性能.所以,我们就有必要了解日志的实现方式,以及它是如何降低IO的时 ...