REST
即表述性状态转移(REpresentational State Transfer),是一种基于HTTP的结构原则,一种表示被操作的资源的方法。 REST Web服务完全依赖HTTP方法,每一种方法都会对某一种资源进行操作。GET方法常用来获取某一资源或者资源集合。POST方法则用于创建。PUT方法用于更新。DELETE方法用于从系统中删除资源。
使用REST Web服务进行CRUD操作
本章所用的依赖文件有:
<project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
<modelVersion > 4.0.0modelVersion >
<groupId > org.springframework.samples.service.servicegroupId >
<artifactId > SpringAOPTestartifactId >
<version > 0.0.1-SNAPSHOTversion >
<packaging > warpackaging >
<properties >
<java.version > 1.6java.version >
<project.build.sourceEncoding > UTF-8project.build.sourceEncoding >
<project.reporting.outputEncoding > UTF-8project.reporting.outputEncoding >
<jsp.version > 2.3.1jsp.version >
<jstl.version > 1.2jstl.version >
<servlet.version > 3.1.0servlet.version >
<spring-framework.version > 4.3.10.RELEASEspring-framework.version >
<hibernate.version > 5.2.10.Finalhibernate.version >
<logback.version > 1.2.3logback.version >
<slf4j.version > 1.7.25slf4j.version >
<junit.version > 4.12junit.version >
<aspectj.version > 1.8.10aspectj.version >
<jackson.version > 2.9.0jackson.version >
properties >
<dependencies >
<dependency >
<groupId > org.springframeworkgroupId >
<artifactId > spring-webmvcartifactId >
<version > ${spring-framework.version}version >
dependency >
<dependency >
<groupId > javax.servletgroupId >
<artifactId > jstlartifactId >
<version > ${jstl.version}version >
dependency >
<dependency >
<groupId > javax.servletgroupId >
<artifactId > javax.servlet-apiartifactId >
<version > ${servlet.version}version >
<scope > providedscope >
dependency >
<dependency >
<groupId > javax.servlet.jspgroupId >
<artifactId > javax.servlet.jsp-apiartifactId >
<version > ${jsp.version}version >
<scope > providedscope >
dependency >
<dependency >
<groupId > org.springframeworkgroupId >
<artifactId > spring-txartifactId >
<version > ${spring-framework.version}version >
dependency >
<dependency >
<groupId > org.springframeworkgroupId >
<artifactId > spring-aopartifactId >
<version > ${spring-framework.version}version >
dependency >
<dependency >
<groupId > org.springframeworkgroupId >
<artifactId > spring-coreartifactId >
<version > ${spring-framework.version}version >
dependency >
<dependency >
<groupId > org.springframeworkgroupId >
<artifactId > spring-beansartifactId >
<version > ${spring-framework.version}version >
dependency >
<dependency >
<groupId > org.springframeworkgroupId >
<artifactId > spring-contextartifactId >
<version > ${spring-framework.version}version >
dependency >
<dependency >
<groupId > org.springframeworkgroupId >
<artifactId > spring-webartifactId >
<version > ${spring-framework.version}version >
dependency >
<dependency >
<groupId > org.slf4jgroupId >
<artifactId > slf4j-apiartifactId >
<version > ${slf4j.version}version >
<scope > compilescope >
dependency >
<dependency >
<groupId > ch.qos.logbackgroupId >
<artifactId > logback-classicartifactId >
<version > ${logback.version}version >
<scope > runtimescope >
dependency >
<dependency >
<groupId > org.hibernategroupId >
<artifactId > hibernate-entitymanagerartifactId >
<version > ${hibernate.version}version >
dependency >
<dependency >
<groupId > org.springframeworkgroupId >
<artifactId > spring-testartifactId >
<version > ${spring-framework.version}version >
<scope > testscope >
dependency >
<dependency >
<groupId > junitgroupId >
<artifactId > junitartifactId >
<version > ${junit.version}version >
<scope > testscope >
dependency >
<dependency >
<groupId > org.aspectjgroupId >
<artifactId > aspectjweaverartifactId >
<version > ${aspectj.version}version >
dependency >
<dependency >
<groupId > com.fasterxml.jackson.coregroupId >
<artifactId > jackson-coreartifactId >
<version > ${jackson.version}version >
dependency >
<dependency >
<groupId > com.fasterxml.jackson.coregroupId >
<artifactId > jackson-databindartifactId >
<version > ${jackson.version}version >
dependency >
dependencies >
project >
项目目录结构如下:
首先在com.lonelyquantum.wileybookch11.domain包中创建域类User:
public class User {
private int id;
private String name;
public User () {}
public User (int id, String name){
this .id = id;
this .name = name;
}
public int getId () {
return id;
}
public String getName () {
return name;
}
}
然后去com.lonelyquantum.wileybookch11.repository包中创建文件UserRepository类存储User对象。
@Repository
public class UserRepository {
private Map users = new HashMap();
@PostConstruct
public void setup (){
users.put(1 , new User(1 ,"Madoka Kaname" ));
users.put(2 , new User(2 ,"Homura Akemi" ));
}
public void save (User user){
users.put(user.getId(), user);
}
public List findAll (){
return new ArrayList(users.values());
}
public User find (int id){
return users.get (id);
}
public void update (int id, User user){
users.put(id, user);
}
public void delete (int id){
users.remove(id);
}
}
该类通过Map来存储Id,UserName对,并提供了CRUD方法。 接下来在com.lonelyquantum.wileybookch11.controller包中创建UserRestController类进行控制。
@RestController
@RequestMapping ("/rest" )
public class UserRestController {
@Autowired
private UserRepository userRepository;
@RequestMapping (value = "/users" , method = RequestMethod.POST)
public void save (@RequestBody User user){
userRepository.save(user);
}
@RequestMapping (value = "/users" , method = RequestMethod.GET)
public List list (){
return userRepository.findAll();
}
@RequestMapping (value = "/users/{id}" , method = RequestMethod.GET)
public User get (@PathVariable ("id") int id){
User user = userRepository.find(id);
if (user == null ){
throw new RestException(1 , "User not found!" , "User with id: " + id + " not found in the system" );
}
return user;
}
@RequestMapping (value = "/users/{id}" , method = RequestMethod.PUT)
public void update (@PathVariable ("id") int id, @RequestBody User user){
userRepository.update(id, user);
}
@RequestMapping (value = "/users/{id}" , method = RequestMethod.DELETE)
public ResponseEntity delete (@PathVariable ("id") int id){
userRepository.delete(id);
return new ResponseEntity(Boolean.TRUE, HttpStatus.OK);
}
}
该类将Web请求映射到处理方法上。 接着采用springmvc-servlet.xml来配置servlet。
<beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context ="http://www.springframework.org/schema/context"
xmlns:mvc ="http://www.springframework.org/schema/mvc"
xsi:schemaLocation ="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd" >
<context:component-scan base-package ="com.lonelyquantum.wileybookch11" />
<context:annotation-config />
<mvc:annotation-driven />
beans >
当然,也可以通过在包com.lonelyquantum.wileybookch11.config中创建配置类来配置Servlet:
@Configuration
@ComponentScan (basePackages = {"com.lonelyquantum.wileybookch11" })
@EnableWebMvc
public class AppConfig {
}
然后在web.xml中用URL定义DispatcherServlet:
<web-app xmlns ="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version ="3.1" >
<servlet >
<servlet-name > springmvcservlet-name >
<servlet-class > org.springframework.web.servlet.DispatcherServletservlet-class >
<load-on-startup > 1load-on-startup >
servlet >
<servlet-mapping >
<servlet-name > springmvcservlet-name >
<url-pattern > /*url-pattern >
servlet-mapping >
web-app >
如果是采用Java配置的servlet则应该在配置中引用AppConfig类。
<web-app xmlns ="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version ="3.1" >
<servlet >
<servlet-name > springmvcservlet-name >
<servlet-class > org.springframework.web.servlet.DispatcherServletservlet-class >
<init-param >
<param-name > contextClassparam-name >
<param-value >
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
param-value >
init-param >
<init-param >
<param-name > contextConfigLocationparam-name >
<param-value >
com.lonelyquantum.wileybookch11.config.AppConfig
param-value >
init-param >
<load-on-startup > 1load-on-startup >
servlet >
<servlet-mapping >
<servlet-name > springmvcservlet-name >
<url-pattern > /*url-pattern >
servlet-mapping >
web-app >
将工程部署到Tomcat上运行容器,就可以用SoapUI进行REST调试了。 打开SoapUI后首先File->NEW REST Project
如上填写url。 然后生成如下项目:
之后点击左上角运行图标,将右侧选项卡调整至JSON。可得返回结果:
此处Method为GET,表示采用的是GET方法。在user路径采用该方法返回的是全部用户的User类。 可以右键资源添加新方法以测试其他操作:
我们可以先建立一个名为New User的POST方法来创建新用户:
为了使用这个方法,我们需要输入新用户的参数再执行:
注意输入的数据类型调整正确。左下角会显示相应时间,该方法没有返回值,但是可以再次执行之前的GET方法显示插入的用户。
接下来创建Update方法,采用的是PUT方法,注意,该方法的资源需要指向具体的user,输入类型也应该调整为json。
执行完毕再使用第一个GET方法可以看到user3的内容已经更新:
最后创建DELETE 方法,该方法与UPDATE类似,也需要指定具体user。
执行完毕再用第一个GET方法查看,可发现id=3的user已经被删除。
可以从方法中返回HTTP状态码告知用户方法执行情况。之前delete方法中就返回了return new ResponseEntity(Boolean.TRUE, HttpStatus.OK);
表示成功。状态码如下: 1xx 信息 2xx 成功 3xx 重定向 4xx 客户端错误 5xx 服务器错误
使用XML响应的REST Web服务
刚刚的项目中我们的REST方法返回的都是JSON格式的数据,其实也可以用XML格式返回数据。只要给域类添加如下注解:
@XmlRootElement
public class User {
@XmlElement
private int id;
@XmlElement
private String name;
public User () {}
public User (int id, String name) {
this .id = id;
this .name = name;
}
public int getId () {
return id;
}
public String getName () {
return name;
}
就可以在查找某个user时返回XML格式的输出
使用异常处理机制
先在com.lonelyquantum.wileybookch11.domain创建RestErrorMessage类来表示异常信息。
public class RestErrorMessage {
private HttpStatus status;
private int code;
private String message;
private String detailedMessage;
private String exceptionMessage;
public RestErrorMessage (HttpStatus status, int code, String message, String detailedMessage,
String exceptionMessage) {
super();
this .status = status;
this .code = code;
this .message = message;
this .detailedMessage = detailedMessage;
this .exceptionMessage = exceptionMessage;
}
public int getCode () {
return code;
}
public String getMessage () {
return message;
}
public String getDetailedMessage () {
return detailedMessage;
}
public String getExceptionMessage () {
return exceptionMessage;
}
}
在该项目中创建com.lonelyquantum.wileybookch11.exception包来保存抛出的异常
public class RestException extends RuntimeException {
private int code;
private String message;
private String detailedMessage;
public RestException (int code, String message, String detailedMessage){
this .code = code;
this .message = message;
this .detailedMessage = detailedMessage;
}
public int getCode () {
return code;
}
@Override
public String getMessage () {
return super .getMessage();
}
public String getDetailedMessage () {
return detailedMessage;
}
}
以及com.lonelyquantum.wileybookch11.handler包来保存处理异常的方法。
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler (Exception.class)
protected ResponseEntity handleInvalidRequest (RestException e, ServletWebRequest request){
RestErrorMessage error = new RestErrorMessage(HttpStatus.valueOf(request.getResponse().getStatus()),
e.getCode(), e.getMessage(), e.getDetailedMessage(), e.toString());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return handleExceptionInternal(e, error, headers, HttpStatus.OK, request);
}
}
Controller中的异常处理之前已经写好。 这时我们如果试图查找已经被删除的id=3的user就会返回如下错误信息。
对REST风格服务进行单元测试
通过Spring提供的RestTemplate模板类,我们可以通过测试代码来情锁模拟HTTP请求。二者映射名称如下:
GET:getForObject(string, Class,String…)
PUT: put(String, Object, String)
POST:postForLocation(String, Object, String…)
DELETE:delete(String, String)
HEAD:headForHeaders(String,String)
OPTIONS:optionsForAllow(String, String)
可以在/src/test/java目录下创建com.lonelyquantum.wileybookch11包并在其中创建如下测试类用于测试各个方法:
public class AddUserTest {
@Test
public void addUserWorksOK(){
RestTemplate template = new RestTemplate();
User user = new User(3 ,"Sayaka Miki" );
ResponseEntity resultSave = template .postForEntity("http://localhost:8080/SpringREST/rest/users" , user, Void.class );
assertNotNull(resultSave);
}
}
public class DeleteUserTest {
@Test
public void deleteUserWorksOK(){
RestTemplate template = new RestTemplate();
template .delete ("http://localhost:8080/SpringREST/rest/users/3" );
ResponseEntity resultList = template .getForEntity("http://localhost:8080/SpringREST/rest/users" , List.class );
assertNotNull(resultList);
assertNotNull(resultList.getBody());
assertThat(resultList.getBody().size(), is (2 ));
}
}
public class ListUsersTest {
@Test
public void listUserWorksOK(){
RestTemplate template = new RestTemplate();
ResponseEntity result = template .getForEntity("http://localhost:8080/SpringREST/rest/users" , List.class );
assertNotNull(result);
assertNotNull(result.getBody());
assertThat(result.getBody().size(), is (2 ));
}
}
public class UpdateUserTest {
@Test
public void updateUserWorksOK(){
RestTemplate template = new RestTemplate();
User user = new User(3 , "Sakura Kyouko" );
template .put("http://localhost:8080/SpringREST/rest/users/3" , user);
}
}
@RunWith (Suite.class )
@Suite .SuiteClasses({
ListUsersTest.class ,
AddUserTest.class ,
UpdateUserTest.class ,
DeleteUserTest.class
})
public class UserRestControllerTestSuite {
}
其中最后一个测试类封装了前面四个测试类并按顺序运行他们。这样的顺序保证了运行测试之后不会对数据造成任何修改。
你可能感兴趣的:(Beginning,Spring学习笔记)
Spring学习笔记03——Spring Boot的文件结构
Shaoxi Zhang
Java 学习 笔记 spring boot
Springboot常见的文件结构:src/├──main/│├──java/││└──com.example.demo/││├──DemoApplication.java#主入口││├──config/#配置类││├──controller/#控制器││├──service/#业务逻辑││├──mapper/#数据库操作接口││├──entity/#数据库实体类││├──dto/#数据传输对象│
ELK配置logstash的配置文件
追梦少年888
数据库 运维
input{file{path=>"/srv/web/a/logs/a.*"start_position=>"beginning"type=>"a"}file{path=>"/srv/web/b/logs/b.*"start_position=>"beginning"type=>"b"}file{path=>"/srv/web/c/logs/c.*"start_position=>"beginni
Spring学习笔记_41——@RequestBody
LuckyLay
Spring学习笔记 spring 消息转换器 RequestBody SpringMVC SpringBoot
Spring学习笔记_38——@RequestParamSpring学习笔记_39——@PathVariableSpring学习笔记_40——@RequestHeader@RequestBody1.介绍@RequestBody是Spring框架中用于处理HTTP请求的一个非常关键的注解。它主要用于将客户端发送的HTTP请求体中的JSON、XML或其他格式的数据转换到Java方法参数上,这个转换过程
Kafka
墨咖
笔记
目录1、启动1、启动#启动zookeeper./kafka-console-consumer.sh--zookeeperlocalhost:2181--from-beginning--topict1/opt/kafka_2.13-3.1.0/bin./kafka-console-producer.sh--broker-listip:9092--topictopicTest/opt/kafka_2.
Spring学习笔记——开篇
weixin_30699741
整体架构Spring核心容器Beans包含访问配置文件,通过Spring容器创建和管理Bean,进行依赖注入和控制反转操作相关所有类。Core包含Spring框架的基本核心工具类,Spring其它组件均需要使用该包,是其它组件的基本核心。Context为Spring核心提供扩展,能够找到使用SpringApplicationContext特性时需要的所有类;JNDI特性时需要的所有类;UI方面模板
Spring学习笔记(三)--Spring中的Bean的管理
玛卡巴卡yang
JavaEE企业级应用软件开发 spring 学习 笔记
一、什么是BeanBean是注册到Spring容器中的Java类,控制反转和依赖注入都是通过Bean实现的,任何一个Java类都可以是一个Bean。Bean由Spring进行管理,可以通过xml文件对bean进行配置和管理。二、BeanFactory接口和ApplicationContext接口;Spring提供了几个BeanFactory接口的实现类,其中最常用的是XmlBeanFactory,
Spring学习笔记(二)Spring的控制反转(设计原则)与依赖注入(设计模式)
玛卡巴卡yang
JavaEE企业级应用软件开发 spring 学习
一、控制反转:缩写IoC是一种设计原则,降低程序代码之间的耦合度对象由Ioc容器统一管理,当程序需要使用对象时直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器二、依赖注入:缩写DI依赖注入是一种消除类之间依赖关系的设计模式。例如,A类要依赖B类,A类不再直接创建B类,而是把这种依赖关系配置在外部xml文件(或javaconfig文件)中,然后由Spring容器根据配置信息创建
A New Beginning!
简希i
只做一件事,其他的事都不值一提。想要取得最好的结果,就要缩小目标。时间紧张,成功越来越远。其实一个人做成的事情不在多,只要把事情做好了,就成功了。要摆脱所有可以做但不是必须做的事,专注于应该做的事。事都有轻重缓急,找出最重要的那件事。成功取决于目标是否明确,是否专注。专注一处,必定有所收获。
“失恋之后,我胖了20斤” | 每一次失恋,都是一场渡劫
新青年Ydaily
~Chapter.001~Beginning:失恋的伤,从开裂到黏合,需要多久?有部电影说,治愈失恋的伤,只需要33天就够了;也有人说,失恋后三个月还没有走出来的,那可能一辈子也走不出来;还有一些比较幸运的,一个月、几个月或者是一年,最终还是放下了。失恋就像生了一场重病,虽然不是绝症,但是却能让你痛苦一阵子,挺过去了,免疫力也就增强了。当然,还有很多人,在经历了这场重病之后,留下了很深的后遗症。每
黑马程序员SSM-Spring学习笔记
恰好风扬了帆
spring java 学习 后端
学完Spring之后是SpringMVC文章目录前言一、注解开发1.1注解开发定义bean1.2纯注解开发1.3bean作用范围1.4依赖注入-自动装配1.5第三方bean管理1.6总结二、Spring整合MyBatis2.1.产生SqlSessionFactoryBean2.产生MapperScannerConfigurer三、Spring整合Junit四、AOP4.1AOP入门案例4.2AOP
Logstash 安装与测试数据导入
Splunker
目的:安装Logstash,并且导入Movielens的测试数据集#下载与ES相同版本号的logstash,(7.1.0),并解压到相应目录#修改logstash.conf文件#path修改为,你实际的movies.csv路径input{file{path=>"YOUR_FULL_PATH_OF_movies.csv"start_position=>"beginning"sincedb_path=
Spring学习笔记(一)-spring概述及下载
编程小白_C
spring spring概述及下载 spring java
Spring学习笔记(一)-spring概述及下载一、概述二、三层架构三、Spring框架的主要优点四、Spring的体系结构五、Spring的下载和配置六、测试Spring一、概述 Spring框架是一个开放源代码的J2EE应用程序框架,由RodJohnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweightcontainer)。Spring解决了开发者在J2EE开发中
Spring学习笔记
江南一棵树。
Spring spring java struts
Spring学习笔记以前我们调用对象时,对象通常是调用者主动new出来而现在是IOC容器来完成,就像哆啦A梦的百宝箱负责管理Bean对象。一:Spring的基本概述IOC容器1.什么是IOC容器?Spring=>2003年开始流行框架Spring=IOC+AOPIOC=InversionofControll=>控制反转控制反转到底翻转了什么?依赖对象的创建和依赖关系的形成IOC的核心DI=>依赖注
2018-10-28 Spring学习笔记(四)
惜小八
一.bean的注解要只用注解,必须要开启注解驱动,Spring容器在启动的时候,会自动的创建纳入Spring管理的bean对象,当Spring容器扫描到的时候,会去Spring容器当中管理的bean对应的类当中查看相匹配的注解(一)Resource注解Resource注解既可以加在属性上面,也可以记在set方法上面1.Resource注解加在属性上面packagecom.csii.dao;publ
Spring学习笔记 关于Spring创建Bean的模式-Singleton(单例模式)和Prototype
Arvin_Rong
J2EE All THINGS about JAVA Spring
刚开始接触Spring的时候一些基础的教学在说到Bean的创建时会提到Spring的单例模式,就是说默认情况下Spring中定义的Bean是以单例模式创建的。如果以前了解设计模式中的单例模式的话很容易对这种说法产生先入为主的印象。事实上,Spring中的单例模式还有许多需要注意的地方。在GoF中的单例模式是指一个ClassLoader中只存在类一个实例。而在Spring中的单例实际上更确切的说应该
Spring学习笔记 关于spring 2.x中dependency-check标签与Spring3中的实现方式
Arvin_Rong
All THINGS about JAVA Spring J2EE
在Bean被创建时Bean的属性(property)如果在配置文件Bean的定义中没有进行初始化赋值,默认情况下Spring对于没有进行初始化的属性(property)是不做检查的。但是很多情况下会要求Bean特定的属性必须进行初始化赋值,在Spring2.x中通过在bean标签中使用dependency-check属性设定由Spring进行强制检查的方式。denpendency-check属性有
Spring学习笔记 使用Static Factory(静态工厂类)创建Bean
Arvin_Rong
All THINGS about JAVA Spring bean spring class string 设计模式 encoding
普通定义Bean并且进行初始化的方法一般通过property(属性)的setter方法或者构造方法进行。例如这种定义创建Bean相当于使用newcom.csdn.net.arvin.BeanClass();的方法来新建Bean对象。在实际应用中很多情况下还会使用设计模式中的工厂模式来创建对象。使用静态工厂类即调用工厂类中的静态方法,比如publicstatic类名getInstance()方法返回
一步一步做项目(7)管理用户信息之Web页面构建
ZhangCurie
开发技术 ssh web 网页
一步一步做项目(7)管理用户信息之Web页面构建基本思路显示所有用户列表index.jsp添加新用户add.jsp修改用户信息modify.jsp浏览用户详细信息browse.jsp确认删除用户deleteConfirm.jsp包含的文件和健值引入系统使用的框架beginning-notheme.jsp清空表单数据帮助的处理健值的处理Messages.properties进一步的思考在前面一步一步
pst线第七部分(1):所看到的与其他人有关的景象(Beginning篇)
FlameIvy
31身边有几个小柜子,上面摆满了类似于书的东西。这让我想起了哥哥的书柜,也自然而然的想起了哥哥。“你还有个哥哥?”他问,“我听到你在喊哥哥。”“是。”我说,“不过我再也见不到他了。你说过我们回不了原来的星区。”“……”他没回答,看向右边的书柜,我听到他在呼唤几个名字,那些人一定对他来说都很重要,尽管他知道他们不过是写在他的代码里面的故事。哪怕我们是虚假的,但是我们在世界里与其他的程序产生了一种哥哥
Ending is also a Beginning
布瓜R
很久、很久没有在新年来临之际写过东西了;甚至是很久、很久都没有为了自己再记录文字了。16年的语文学习似乎都用来应付公司的流程文档和述职报告,没再写过东西,没再读过诗文,甚至看书也少的可怜。2020,在疫情的衬托下,于每个人来说都异常难忘,不胜枚举,也不做赘述;2021,可能是近好多年来大家最盼望的一个新年,寄托了太多的祝福与期许。往年,或多或少心底会埋下大大小小的愿望,最后都不了了之;如今,终于鼓
初二的生活开始
蝶落恋猫
告别初一的暑假,交了暑假作业和学费,搬了教室,初二的生活正式开始了。我们的教室搬去了前面综合楼的底层,隔壁是一起上晚自习的三班,前面就只有我们两个班级。四张乒乓球桌就在我们教室的后面,第二节课下课我们不做操的话,我们就可以去抢,中午吃好午饭我们也可以去玩。beginning!图片发自App
i got everything I want from the beginning
乔流涯
18岁真的是个美好的年纪我的十八岁呢在题海中奋战在缺觉中挣扎在发现世界黑暗后仍不面对现实中悔恨
Spring学习笔记(三)-AOP技术(模拟实现利用java中的Proxy和CGlib)
G__yuan
1.利用JDK自带的Proxy和CGlib代理类模拟实现AOP功能1.实现的业务是:1).拦截所有的业务方法2).判断用户是否有权限,有权限就允许它执行业务方法,没有权限就不允许它执行业务方法(是否有权限根据user是否为null来判断)上面的这个就是AOP中所说的“横切性关注点”。使用JDK中提供的Proxy(代理类)类实现上面一段话所讲的拦截。编写代理类,用的是JDK中提供的Proxy,Pro
Spring学习笔记 - 第一章 - IoC(控制反转)、IoC容器、Bean的实例化与生命周期、DI(依赖注入)
Dandelion_000
Spring spring java java-ee 后端
原文地址:Spring学习笔记-第一章-IoC(控制反转)、IoC容器、Bean的实例化与生命周期、DI(依赖注入)Spring学习笔记全系列传送门:【本章】Spring学习笔记-第一章-IoC(控制反转)、IoC容器、Bean的实例化与生命周期、DI(依赖注入)Spring学习笔记-第二章-注解开发、配置管理第三方Bean、注解管理第三方Bean、Spring整合MyBatis和Junit案例文
docker pull 镜像地址 报错error unmarshalling content: invalid character ‘<‘ looking for beginning of valu
为了馒头争口气
FAQ docker docker 容器
dockerpull镜像地址报错errorresponsefromdaemon:errorunmarshallingcontent:invalidcharacter‘<’lookingforbeginningofvalue问题解决思路:1.检查docker的配置文件是否正常,是否有异常字符导致解析异常,但是跟这个关系应该不大,因为如果配置文件有问题,在启动docker的时候就会报错了2.使用cur
Spring学习笔记(二十三)——实现网站微信扫码登录获取微信用户信息Demo
不愿意做鱼的小鲸鱼
Spring java java springboot
目录微信扫码登录介绍开发步骤微信扫码登录示例微信开放文档遇到的问题使用第三方工具实现网站微信扫码登录开发前介绍开发步骤微信扫码登录获取微信用户信息Demo实现流程实现效果实现过程实现源码源码下载微信扫码登录介绍微信扫码登录是指微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(a
Spring学习笔记--父子容器详解
markliwei1
Spring框架学习
此文转至http://www.tianshouzhi.com/api/tutorials/spring容器加载过程RootWebApplicationContext创建过程源码分析ServletWebApplicationContext创建过程源码分析容器加载过程ServletWebApplicationContext:这是对J2EE三层架构中的web层进行配置,如控制器(controller)、
2019-02-14 At the Beginning
夏日de雨倪
日记还是在豆瓣写吧,因为有手机APP,上传图片方便。周记在这里写,方便群里打卡,向大佬们学习,致敬。自律的路上,加油!--By雨倪YuNi
【Spring学习笔记】Spring 注解开发
Augenstern K
Spring spring 学习 笔记
Spring学习——注解开发注解开发注解开发定义bean纯注解开发Bean管理bean作用范围bean生命周期依赖注入自动装配第三方bean管理注解开发总结XML配置与注解配置比较注解开发注解开发定义bean使用@Component定义开发@Component("bookDao")publicclassBookDaoImplimplementsBookDao{}@Componentpubliccl
【Spring学习笔记】Spring 核心容器
Augenstern K
Spring spring 学习 笔记
Spring学习——核心容器Spring介绍初识SpringSpringFramework系统架构图SpringFramework学习路线核心概念IoC入门案例IoC入门案例思路分析IoC入门案例实现Ioc入门案例(XML版)DI入门案例DI入门案例思路分析DI入门案例实现bean配置bean基础配置bean别名配置bean作用范围配置bean实例化bean是如何创建的实例化bean的三种方式构造
安装数据库首次应用
Array_06
java oracle sql
可是为什么再一次失败之后就变成直接跳过那个要求
enter full pathname of java.exe的界面
这个java.exe是你的Oracle 11g安装目录中例如:【F:\app\chen\product\11.2.0\dbhome_1\jdk\jre\bin】下的java.exe 。不是你的电脑安装的java jdk下的java.exe!
注意第一次,使用SQL D
Weblogic Server Console密码修改和遗忘解决方法
bijian1013
Welogic
在工作中一同事将Weblogic的console的密码忘记了,通过网上查询资料解决,实践整理了一下。
一.修改Console密码
打开weblogic控制台,安全领域 --> myrealm -->&n
IllegalStateException: Cannot forward a response that is already committed
Cwind
java Servlets
对于初学者来说,一个常见的误解是:当调用 forward() 或者 sendRedirect() 时控制流将会自动跳出原函数。标题所示错误通常是基于此误解而引起的。 示例代码:
protected void doPost() {
if (someCondition) {
sendRedirect();
}
forward(); // Thi
基于流的装饰设计模式
木zi_鸣
设计模式
当想要对已有类的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能。
自定义的类成为装饰类
模仿BufferedReader,对Reader进行包装,体现装饰设计模式
装饰类通常会通过构造方法接受被装饰的对象,并基于被装饰的对象功能,提供更强的功能。
装饰模式比继承灵活,避免继承臃肿,降低了类与类之间的关系
装饰类因为增强已有对象,具备的功能该
Linux中的uniq命令
被触发
linux
Linux命令uniq的作用是过滤重复部分显示文件内容,这个命令读取输入文件,并比较相邻的行。在正常情 况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如 果输入文件用“- ”表示,则从标准输入读取。
AD:
uniq [选项] 文件
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个
正则表达式Pattern
肆无忌惮_
Pattern
正则表达式是符合一定规则的表达式,用来专门操作字符串,对字符创进行匹配,切割,替换,获取。
例如,我们需要对QQ号码格式进行检验
规则是长度6~12位 不能0开头 只能是数字,我们可以一位一位进行比较,利用parseLong进行判断,或者是用正则表达式来匹配[1-9][0-9]{4,14} 或者 [1-9]\d{4,14}
&nbs
Oracle高级查询之OVER (PARTITION BY ..)
知了ing
oracle sql
一、rank()/dense_rank() over(partition by ...order by ...)
现在客户有这样一个需求,查询每个部门工资最高的雇员的信息,相信有一定oracle应用知识的同学都能写出下面的SQL语句:
select e.ename, e.job, e.sal, e.deptno
from scott.emp e,
(se
Python调试
矮蛋蛋
python pdb
原文地址:
http://blog.csdn.net/xuyuefei1988/article/details/19399137
1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:
IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:
http://www.ibm.com/d
webservice传递自定义对象时函数为空,以及boolean不对应的问题
alleni123
webservice
今天在客户端调用方法
NodeStatus status=iservice.getNodeStatus().
结果NodeStatus的属性都是null。
进行debug之后,发现服务器端返回的确实是有值的对象。
后来发现原来是因为在客户端,NodeStatus的setter全部被我删除了。
本来是因为逻辑上不需要在客户端使用setter, 结果改了之后竟然不能获取带属性值的
java如何干掉指针,又如何巧妙的通过引用来操作指针————>说的就是java指针
百合不是茶
C语言的强大在于可以直接操作指针的地址,通过改变指针的地址指向来达到更改地址的目的,又是由于c语言的指针过于强大,初学者很难掌握, java的出现解决了c,c++中指针的问题 java将指针封装在底层,开发人员是不能够去操作指针的地址,但是可以通过引用来间接的操作:
定义一个指针p来指向a的地址(&是地址符号):
Eclipse打不开,提示“An error has occurred.See the log file ***/.log”
bijian1013
eclipse
打开eclipse工作目录的\.metadata\.log文件,发现如下错误:
!ENTRY org.eclipse.osgi 4 0 2012-09-10 09:28:57.139
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContai
spring aop实例annotation方法实现
bijian1013
java spring AOP annotation
在spring aop实例中我们通过配置xml文件来实现AOP,这里学习使用annotation来实现,使用annotation其实就是指明具体的aspect,pointcut和advice。1.申明一个切面(用一个类来实现)在这个切面里,包括了advice和pointcut
AdviceMethods.jav
[Velocity一]Velocity语法基础入门
bit1129
velocity
用户和开发人员参考文档
http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html
注释
1.行级注释##
2.多行注释#* *#
变量定义
使用$开头的字符串是变量定义,例如$var1, $var2,
赋值
使用#set为变量赋值,例
【Kafka十一】关于Kafka的副本管理
bit1129
kafka
1. 关于request.required.acks
request.required.acks控制者Producer写请求的什么时候可以确认写成功,默认是0,
0表示即不进行确认即返回。
1表示Leader写成功即返回,此时还没有进行写数据同步到其它Follower Partition中
-1表示根据指定的最少Partition确认后才返回,这个在
Th
lua统计nginx内部变量数据
ronin47
lua nginx 统计
server {
listen 80;
server_name photo.domain.com;
location /{set $str $uri;
content_by_lua '
local url = ngx.var.uri
local res = ngx.location.capture(
java-11.二叉树中节点的最大距离
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class MaxLenInBinTree {
/*
a. 1
/ \
2 3
/ \ / \
4 5 6 7
max=4 pass "root"
Netty源码学习-ReadTimeoutHandler
bylijinnan
java netty
ReadTimeoutHandler的实现思路:
开启一个定时任务,如果在指定时间内没有接收到消息,则抛出ReadTimeoutException
这个异常的捕获,在开发中,交给跟在ReadTimeoutHandler后面的ChannelHandler,例如
private final ChannelHandler timeoutHandler =
new ReadTim
jquery验证上传文件样式及大小(好用)
cngolon
文件上传 jquery验证
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="jquery1.8/jquery-1.8.0.
浏览器兼容【转】
cuishikuan
css 浏览器 IE
浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同
问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。
碰到频率:100%
解决方案:CSS里 *{margin:0;padding:0;}
备注:这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的CSS文件开头都会用通配符*来设
Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
daizj
shell $# $? 特殊变量
前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。例如,$ 表示当前Shell进程的ID,即pid,看下面的代码:
$echo $$
运行结果
29949
特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个
程序设计KISS 原则-------KEEP IT SIMPLE, STUPID!
dcj3sjt126com
unix
翻到一本书,讲到编程一般原则是kiss:Keep It Simple, Stupid.对这个原则深有体会,其实不仅编程如此,而且系统架构也是如此。
KEEP IT SIMPLE, STUPID! 编写只做一件事情,并且要做好的程序;编写可以在一起工作的程序,编写处理文本流的程序,因为这是通用的接口。这就是UNIX哲学.所有的哲学真 正的浓缩为一个铁一样的定律,高明的工程师的神圣的“KISS 原
android Activity间List传值
dcj3sjt126com
Activity
第一个Activity:
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import a
tomcat 设置java虚拟机内存
eksliang
tomcat 内存设置
转载请出自出处:http://eksliang.iteye.com/blog/2117772
http://eksliang.iteye.com/
常见的内存溢出有以下两种:
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space
------------
Android 数据库事务处理
gqdy365
android
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。事
Java 打开浏览器
hw1287789687
打开网址 open浏览器 open browser 打开url 打开浏览器
使用java 语言如何打开浏览器呢?
我们先研究下在cmd窗口中,如何打开网址
使用IE 打开
D:\software\bin>cmd /c start iexplore http://hw1287789687.iteye.com/blog/2153709
使用火狐打开
D:\software\bin>cmd /c start firefox http://hw1287789
ReplaceGoogleCDN:将 Google CDN 替换为国内的 Chrome 插件
justjavac
chrome Google google api chrome插件
Chrome Web Store 安装地址: https://chrome.google.com/webstore/detail/replace-google-cdn/kpampjmfiopfpkkepbllemkibefkiice
由于众所周知的原因,只需替换一个域名就可以继续使用Google提供的前端公共库了。 同样,通过script标记引用这些资源,让网站访问速度瞬间提速吧
进程VS.线程
m635674608
线程
资料来源:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397567993007df355a3394da48f0bf14960f0c78753f000 1、Apache最早就是采用多进程模式 2、IIS服务器默认采用多线程模式 3、多进程优缺点 优点:
多进程模式最大
Linux下安装MemCached
字符串
memcached
前提准备:1. MemCached目前最新版本为:1.4.22,可以从官网下载到。2. MemCached依赖libevent,因此在安装MemCached之前需要先安装libevent。2.1 运行下面命令,查看系统是否已安装libevent。[root@SecurityCheck ~]# rpm -qa|grep libevent libevent-headers-1.4.13-4.el6.n
java设计模式之--jdk动态代理(实现aop编程)
Supanccy2013
java DAO 设计模式 AOP
与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
&
Spring 4.2新特性-对java8默认方法(default method)定义Bean的支持
wiselyman
spring 4
2.1 默认方法(default method)
java8引入了一个default medthod;
用来扩展已有的接口,在对已有接口的使用不产生任何影响的情况下,添加扩展
使用default关键字
Spring 4.2支持加载在默认方法里声明的bean
2.2
将要被声明成bean的类
public class DemoService {