• 关于

    Java本地接口怎么用

    的搜索结果

问题

java web做好的接口怎么给别人用?

小旋风柴进 2019-12-01 20:07:13 1768 浏览量 回答数 1

问题

java怎样转发xml

蛮大人123 2019-12-01 19:55:59 811 浏览量 回答数 1

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

问题

关于服务端JAVA SDK

y.you 2019-12-01 21:23:01 1598 浏览量 回答数 2

问题

电商网站的商品详情页系统架构【Java问答学堂】61期

剑曼红尘 2020-07-20 13:08:17 1 浏览量 回答数 1

问题

分布式事务了解吗?你们是如何解决分布式事务问题的?【Java问答学堂】58期

剑曼红尘 2020-07-16 15:11:28 5 浏览量 回答数 1

问题

【精品问答】Java技术1000问(1)

问问小秘 2019-12-01 21:57:43 38419 浏览量 回答数 12

问题

Java技术1000问(3)【精品问答】

问问小秘 2020-06-02 14:27:10 42 浏览量 回答数 1

问题

java方法参数中定义Boolean,传入null,报错呢!!?报错

爱吃鱼的程序员 2020-06-22 10:45:07 0 浏览量 回答数 1

问题

如何自己设计一个类似 Dubbo 的 RPC 框架?【Java问答学堂】54期

剑曼红尘 2020-07-09 10:30:28 30 浏览量 回答数 1

回答

[上海-java-白夜] 前端跨域用jsonp封装js回调 [健] 天猫和淘宝使用同一个SSO服务器。不管token  cookie 什么机制。同一个标识符,两个网站的辨识逻辑都是一样的**[重庆-后端-谭鹏] **这个标识符是什么呀 肯定的得前端携带了什么东西的在服务端进行鉴别的 不然服务端是怎么确定用户身份的,直到他已经在淘宝登陆过了 [上海-java-白夜] 天猫,淘宝的认证中心都在一起的,cookie信息是在你客户端的,通过请求传到服务器去的localstorage 或者 cookie 的 一个token。 是什么无所谓。重要的是两个网站去同一个地方去校验token  所以结果是一样的。不管你哪个域,服务端的认证中心是同一个,阿里都是中台,怎么可能每个项目一个认证中心,基础服务都统一出来了你用它旗下的网站的服务,用的cookie里面的那个表示你身份的信息key都可以是同一个,你回调的时候把token作为js传过去不就行了,正常情况下,你认证成功,直接会把你的token跟在你要跳转的新页面一起跳转过去**[重庆-后端-谭鹏] 嗯 假设这一次是登陆了淘宝嘛,那我再访问天猫的时候 前端怎么携带淘宝登陆后返回的票据?如果不携带的话 认证服务 肯定就认为你没有登陆[上海-java-白夜] 或者你后端将cros设置一下也是可以跨域接收资源的,这个票据在你的cookie里面,cookie是在你的客户端浏览器储存的[重庆-后端-谭鹏] 哪一个的cookie ?淘宝登陆了的话肯定这个token是存在淘宝域名下的。 天猫怎么能拿到这个token的 这就是我的这个疑问点,还是说前端有这样的技术 可以拿跨主域名的的cookie信息吗[上海-java-白夜] **或者服务器端cros设置一下就可以跨了,或者nginx代理一下也是可以跨的 [深圳-后端-章鱼] 说了半天,不如一张图清楚,关键在第七步,单点登录系统将ticket加载A系统的URL后面,A系统使用过滤器,将ticket写到自己域名下,应该没问题吧[成都-java-creed] 关键是输入用户名成功后,会生成sso认证的cookice,这个cookie就是跨域名访问的关键了[java-刘锦] 这个cookie是全局的?[杭州-后端-xinhe] 不是,每个域名各自维护自己的cookie,通过ticket传递用户身份[java-刘锦****] ticket是全局?[北京-java-犀利豆] ticket只用一次,session是全局的[杭州-后端-xinhe] 是的,我当时做的session各应用独立管理本地部分,但是生命周期会统一管理,全局统一登录登出和保活[深圳-后端-章鱼] 很强,关键就在sso.com认证中心自己的cookie[成都-java-creed] 我认证sso自己的cookie是认证里面的关键,没有这玩不了的[杭州-后端-xinhe] 对,这个把整个流程串起来了 [北京-JAVA-阿轩] 当我访问b系统,ticket哪里来的[成都-java-creed]1 用户在www.a.com正常上网,突然想访问www.b.com,于是发起访问www.b.com的请求。2 www.b.com接收到请求,发现第一次访问,于是给他一个重定向的地址,让他去找认证中心登录。3 浏览器根据返回的地址,发起重定向,因为之前访问过一次了,因此这次会携带上次返回的Cookie:认证中心。4 认证中心收到请求,发现cookie内容能取到对应的认证信息,生成ticket,并且返回给浏览器,让他重定向到www.b.com[北京-java-犀利豆] 登录了a系统 说明 你已经登录了oss。等你登录b的时候,b会让你先到oss那里领一个ticket。你用ticket到b那里验证,验证成功了,b给你种上cookie[北京-JAVA-阿轩] 同一个session去oss索取的ticket是一样的呗[北京-java-犀利豆] @北京-JAVA-阿轩 不一定一样。[深圳-后端-章鱼] session会被状态限制,cookie则是时间限制[北京-JAVA-阿轩] 那b是通过解析ticket来确认是不是a登录过么[北京-java-犀利豆] 用户从oss拿到ticket,然后去b访问,b也会在后端 问一下oss,这个ticket是不是他发的。如果验证成功,b会给用户种上cookie。ticket就可以作废了。这个是后你去c,c会让你先去oss看看有没有ticket,如果有,就回到上面我说的流程。[java-刘锦] 那session干了啥[深圳-后端-章鱼] session只是用于获取token后,各自服务器里存用户的登录状态和权限等,方便后续的访问[北京-JAVA-阿轩] 那单点登录难点,和安全性,是哪里!感觉不难啊,安全也不太安全,窃取到了ticket,不就谁都可以登录了[北京-java-犀利豆] ticket是一次性的。[java-刘锦] 怎么保证一次性[北京-java-犀利豆] 在ticket里面,你可以加上ip之类的标识,加上时间,次数的限制,比ticket只能被校验一次,再来校验就不行了。手机充值卡怎么保证只能充一次,ticket就怎么保证只用一次。 [北京-JAVA-阿轩] 跨域原理是什么[福建-后端-Rule] 浏览器同源策略[北京-java-犀利豆] ticket 你可放在url。或者header里面。就不存在跨越问题[北京-JAVA-阿轩] 这可以避免同源策略么[北京-JAVA-阿轩] 浏览器怎么做到同源策略的,怎么和服务器配合支持和不支持跨域的!跟TCP协议有关么[北京-java-犀利豆] 跨域是浏览器实现的安全策略[北京-JAVA-阿轩] 原来测试的时候,发现前端会有一个预请求!确认,接口无感知!这个是和什么打交道的[北京-java-犀利豆] option?[上海-JAVA开发] 这个一般解决跨服务器请求的,如果程序里面有第三方服务器的话会先发个option探探情况 来源:云原生后端社区https://www.yuque.com/server_mind/answer

montos 2020-04-20 20:44:31 0 浏览量 回答数 0

问题

dubbo 的工作原理?注册中心挂了的问题?说说一次 rpc 请求的流程?【Java问答】47期

剑曼红尘 2020-06-30 09:02:47 8 浏览量 回答数 1

回答

请问怎么测试服务器ws://这个接口是否正常######刚才试了下,本地测试连接正常,到服务器就是连不上,服务器有端口限制的,请问这个默认需要开设什么端口?######@jfinal 大神 请赐教 @hutool######要用sockjs的服务端  https://github.com/projectodd/sockjs-servlet ######回复 @tianxia007 : 还有注解 现在java写代码,就象是在写配置文件######大神,后台服务只需要把那个jar包导入即可是吗######WebSocketServlet 我在本地部署测试都正常,放到服务器连接失败,我们服务器有端口限制的,我怀疑WebSocketServlet这个类有默认端口要求是吗,求大神指点######没有没可能跟flash socket一样有安全策略方面的问题???

kun坤 2020-05-29 23:08:03 0 浏览量 回答数 0

回答

一、接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } } Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。 Formula formula = new Formula() { @Override public double calculate(int a) { return sqrt(a * 100); } }; formula.calculate(100); // 100.0 formula.sqrt(16); // 4.0 文中的formula被实现为一个匿名类的实例,该代码非常容易理解,6行代码实现了计算 sqrt(a * 100)。在下一节中,我们将会看到实现单方法接口的更简单的做法。 译者注: 在Java中只有单继承,如果要让一个类赋予新的特性,通常是使用接口来实现,在C++中支持多继承,允许一个子类同时具有多个父类的接口与功能,在其他语言中,让一个类同时具有其他的可复用代码的方法叫做mixin。新的Java 8 的这个特新在编译器实现的角度上来说更加接近Scala的trait。 在C#中也有名为扩展方法的概念,允许给已存在的类型扩展方法,和Java 8的这个在语义上有差别。 二、Lambda 表达式 首先看看在老版本的Java中是如何排列字符串的: List<String> names = Arrays.asList("peter", "anna", "mike", "xenia"); Collections.sort(names, new Comparator<String>() { @Override public int compare(String a, String b) { return b.compareTo(a); } }); 只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。 在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式: Collections.sort(names, (String a, String b) -> { return b.compareTo(a); }); 看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短: Collections.sort(names, (String a, String b) -> b.compareTo(a)); 对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点: Collections.sort(names, (a, b) -> b.compareTo(a)); Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。接下来我们看看lambda表达式还能作出什么更方便的东西来 三、函数式接口 Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。 我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。 @FunctionalInterface interface Converter<F, T> { T convert(F from); } Converter<String, Integer> converter = (from) -> Integer.valueOf(from); Integer converted = converter.convert("123"); System.out.println(converted); // 123 需要注意如果@FunctionalInterface如果没有指定,上面的代码也是对的。 译者注 将lambda表达式映射到一个单方法的接口上,这种做法在Java 8之前就有别的语言实现,比如Rhino JavaScript解释器,如果一个函数参数接收一个单方法的接口而你传递的是一个function,Rhino 解释器会自动做一个单接口的实例到function的适配器,典型的应用场景有 org.w3c.dom.events.EventTarget 的addEventListener 第二个参数 EventListener。 四、方法与构造函数引用 前一节中的代码还可以通过静态方法引用来表示: Converter<String, Integer> converter = Integer::valueOf; Integer converted = converter.convert("123"); System.out.println(converted); // 123 Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法: converter = something::startsWith; String converted = converter.convert("Java"); System.out.println(converted); // "J" 接下来看看构造函数是如何使用::关键字来引用的,首先我们定义一个包含多个构造函数的简单类: class Person { String firstName; String lastName; Person() {} Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } } 接下来我们指定一个用来创建Person对象的对象工厂接口: interface PersonFactory<P extends Person> { P create(String firstName, String lastName); } 这里我们使用构造函数引用来将他们关联起来,而不是实现一个完整的工厂: PersonFactory<Person> personFactory = Person::new; Person person = personFactory.create("Peter", "Parker"); 我们只需要使用 Person::new 来获取Person类构造函数的引用,Java编译器会自动根据PersonFactory.create方法的签名来选择合适的构造函数。 五、Lambda 作用域 在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。 六、访问局部变量 我们可以直接在lambda表达式中访问外层的局部变量: final int num = 1; Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num); stringConverter.convert(2); // 3 但是和匿名对象不同的是,这里的变量num可以不用声明为final,该代码同样正确: int num = 1; Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num); stringConverter.convert(2); // 3 不过这里的num必须不可被后面的代码修改(即隐性的具有final的语义),例如下面的就无法编译: int num = 1; Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num); num = 3; 在lambda表达式中试图修改num同样是不允许的。 七、访问对象字段与静态变量 和本地变量不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的: class Lambda4 { static int outerStaticNum; int outerNum; void testScopes() { Converter<Integer, String> stringConverter1 = (from) -> { outerNum = 23; return String.valueOf(from); }; Converter<Integer, String> stringConverter2 = (from) -> { outerStaticNum = 72; return String.valueOf(from); }; } } 八、访问接口的默认方法 还记得第一节中的formula例子么,接口Formula定义了一个默认方法sqrt可以直接被formula的实例包括匿名对象访问到,但是在lambda表达式中这个是不行的。 Lambda表达式中是无法访问到默认方法的,以下代码将无法编译: Formula formula = (a) -> sqrt( a * 100); Built-in Functional Interfaces JDK 1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上。 Java 8 API同样还提供了很多全新的函数式接口来让工作更加方便,有一些接口是来自Google Guava库里的,即便你对这些很熟悉了,还是有必要看看这些是如何扩展到lambda上使用的。 Predicate接口 Predicate 接口只有一个参数,返回boolean类型。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非): Predicate<String> predicate = (s) -> s.length() > 0; predicate.test("foo"); // true predicate.negate().test("foo"); // false Predicate<Boolean> nonNull = Objects::nonNull; Predicate<Boolean> isNull = Objects::isNull; Predicate<String> isEmpty = String::isEmpty; Predicate<String> isNotEmpty = isEmpty.negate(); Function 接口 Function 接口有一个参数并且返回一个结果,并附带了一些可以和其他函数组合的默认方法(compose, andThen): Function<String, Integer> toInteger = Integer::valueOf; Function<String, String> backToString = toInteger.andThen(String::valueOf); backToString.apply("123"); // "123" Supplier 接口 Supplier 接口返回一个任意范型的值,和Function接口不同的是该接口没有任何参数 Supplier personSupplier = Person::new; personSupplier.get(); // new Person Consumer 接口 Consumer 接口表示执行在单个参数上的操作。 Consumer greeter = (p) -> System.out.println("Hello, " + p.firstName); greeter.accept(new Person("Luke", "Skywalker")); Comparator 接口 Comparator 是老Java中的经典接口, Java 8在此之上添加了多种默认方法: Comparator comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName); Person p1 = new Person("John", "Doe"); Person p2 = new Person("Alice", "Wonderland"); comparator.compare(p1, p2); // > 0 comparator.reversed().compare(p1, p2); // < 0 Optional 接口 Optional 不是函数是接口,这是个用来防止NullPointerException异常的辅助类型,这是下一届中将要用到的重要概念,现在先简单的看看这个接口能干什么: Optional 被定义为一个简单的容器,其值可能是null或者不是null。在Java 8之前一般某个函数应该返回非空对象但是偶尔却可能返回了null,而在Java 8中,不推荐你返回null而是返回Optional。 Optional optional = Optional.of("bam"); optional.isPresent(); // true optional.get(); // "bam" optional.orElse("fallback"); // "bam" optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b" Stream 接口 java.util.Stream 表示能应用在一组元素上一次执行的操作序列。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样你就可以将多个操作依次串起来。Stream 的创建需要指定一个数据源,比如 java.util.Collection的子类,List或者Set, Map不支持。Stream的操作可以串行执行或者并行执行。 首先看看Stream是怎么用,首先创建实例代码的用到的数据List: List stringCollection = new ArrayList<>(); stringCollection.add("ddd2"); stringCollection.add("aaa2"); stringCollection.add("bbb1"); stringCollection.add("aaa1"); stringCollection.add("bbb3"); stringCollection.add("ccc"); stringCollection.add("bbb2"); stringCollection.add("ddd1"); Java 8扩展了集合类,可以通过 Collection.stream() 或者 Collection.parallelStream() 来创建一个Stream。下面几节将详细解释常用的Stream操作: Filter 过滤 过滤通过一个predicate接口来过滤并只保留符合条件的元素,该操作属于中间操作,所以我们可以在过滤后的结果来应用其他Stream操作(比如forEach)。forEach需要一个函数来对过滤后的元素依次执行。forEach是一个最终操作,所以我们不能在forEach之后来执行其他Stream操作。 stringCollection .stream() .filter((s) -> s.startsWith("a")) .forEach(System.out::println); // "aaa2", "aaa1" Sort 排序 排序是一个中间操作,返回的是排序好后的Stream。如果你不指定一个自定义的Comparator则会使用默认排序。 stringCollection .stream() .sorted() .filter((s) -> s.startsWith("a")) .forEach(System.out::println); // "aaa1", "aaa2" 需要注意的是,排序只创建了一个排列好后的Stream,而不会影响原有的数据源,排序之后原数据stringCollection是不会被修改的。 System.out.println(stringCollection); // ddd2, aaa2, bbb1, aaa1, bbb3, ccc, bbb2, ddd1 Map 映射 中间操作map会将元素根据指定的Function接口来依次将元素转成另外的对象,下面的示例展示了将字符串转换为大写字符串。你也可以通过map来讲对象转换成其他类型,map返回的Stream类型是根据你map传递进去的函数的返回值决定的。 stringCollection .stream() .map(String::toUpperCase) .sorted((a, b) -> b.compareTo(a)) .forEach(System.out::println); // "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1" Match 匹配 Stream提供了多种匹配操作,允许检测指定的Predicate是否匹配整个Stream。所有的匹配操作都是最终操作,并返回一个boolean类型的值。 boolean anyStartsWithA = stringCollection .stream() .anyMatch((s) -> s.startsWith("a")); System.out.println(anyStartsWithA); // true boolean allStartsWithA = stringCollection .stream() .allMatch((s) -> s.startsWith("a")); System.out.println(allStartsWithA); // false boolean noneStartsWithZ = stringCollection .stream() .noneMatch((s) -> s.startsWith("z")); System.out.println(noneStartsWithZ); // true Count 计数 计数是一个最终操作,返回Stream中元素的个数,返回值类型是long。 long startsWithB = stringCollection .stream() .filter((s) -> s.startsWith("b")) .count(); System.out.println(startsWithB); // 3 Reduce 规约 这是一个最终操作,允许通过指定的函数来讲stream中的多个元素规约为一个元素,规越后的结果是通过Optional接口表示的: Optional reduced = stringCollection .stream() .sorted() .reduce((s1, s2) -> s1 + "#" + s2); reduced.ifPresent(System.out::println); // "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2" 并行Streams 前面提到过Stream有串行和并行两种,串行Stream上的操作是在一个线程中依次完成,而并行Stream则是在多个线程上同时执行。 下面的例子展示了是如何通过并行Stream来提升性能: 首先我们创建一个没有重复元素的大表 int max = 1000000; List values = new ArrayList<>(max); for (int i = 0; i < max; i++) { UUID uuid = UUID.randomUUID(); values.add(uuid.toString()); } 然后我们计算一下排序这个Stream要耗时多久, 串行排序: long t0 = System.nanoTime(); long count = values.stream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("sequential sort took: %d ms", millis)); // 串行耗时: 899 ms 并行排序: long t0 = System.nanoTime(); long count = values.parallelStream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("parallel sort took: %d ms", millis)); // 并行排序耗时: 472 ms 上面两个代码几乎是一样的,但是并行版的快了50%之多,唯一需要做的改动就是将stream()改为parallelStream()。 Map 前面提到过,Map类型不支持stream,不过Map提供了一些新的有用的方法来处理一些日常任务。 Map<Integer, String> map = new HashMap<>(); for (int i = 0; i < 10; i++) { map.putIfAbsent(i, "val" + i); } map.forEach((id, val) -> System.out.println(val)); 以上代码很容易理解, putIfAbsent 不需要我们做额外的存在性检查,而forEach则接收一个Consumer接口来对map里的每一个键值对进行操作。 下面的例子展示了map上的其他有用的函数: map.computeIfPresent(3, (num, val) -> val + num); map.get(3); // val33 map.computeIfPresent(9, (num, val) -> null); map.containsKey(9); // false map.computeIfAbsent(23, num -> "val" + num); map.containsKey(23); // true map.computeIfAbsent(3, num -> "bam"); map.get(3); // val33 接下来展示如何在Map里删除一个键值全都匹配的项 map.remove(3, "val3"); map.get(3); // val33 map.remove(3, "val33"); map.get(3); // null 另外一个有用的方法 map.getOrDefault(42, "not found"); // not found 对Map的元素做合并也变得很容易了: map.merge(9, "val9", (value, newValue) -> value.concat(newValue)); map.get(9); // val9 map.merge(9, "concat", (value, newValue) -> value.concat(newValue)); map.get(9); // val9concat Merge做的事情是如果键名不存在则插入,否则则对原键对应的值做合并操作并重新插入到map中。 九、Date API Java 8 在包java.time下包含了一组全新的时间日期API。新的日期API和开源的Joda-Time库差不多,但又不完全一样,下面的例子展示了这组新API里最重要的一些部分: Clock 时钟 Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数。某一个特定的时间点也可以使用Instant类来表示,Instant类也可以用来创建老的java.util.Date对象。 Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date Timezones 时区 在新API中时区使用ZoneId来表示。时区可以很方便的使用静态方法of来获取到。 时区定义了到UTS时间的时间差,在Instant时间点对象到本地日期对象之间转换的时候是极其重要的。 System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00] LocalTime 本地时间 LocalTime 定义了一个没有时区信息的时间,例如 晚上10点,或者 17:30:15。下面的例子使用前面代码创建的时区创建了两个本地时间。之后比较时间并以小时和分钟为单位计算两个时间的时间差: LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239 LocalTime 提供了多种工厂方法来简化对象的创建,包括解析时间字符串。 LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); System.out.println(leetTime); // 13:37 LocalDate 本地日期 LocalDate 表示了一个确切的日期,比如 2014-03-11。该对象值是不可变的,用起来和LocalTime基本一致。下面的例子展示了如何给Date对象加减天/月/年。另外要注意的是这些对象是不可变的,操作返回的总是一个新实例。 LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY 从字符串解析一个LocalDate类型和解析LocalTime一样简单: DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); System.out.println(xmas); // 2014-12-24 LocalDateTime 本地日期时间 LocalDateTime 同时表示了时间和日期,相当于前两节内容合并到一个对象上了。LocalDateTime和LocalTime还有LocalDate一样,都是不可变的。LocalDateTime提供了一些能访问具体字段的方法。 LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439 只要附加上时区信息,就可以将其转换为一个时间点Instant对象,Instant时间点对象可以很容易的转换为老式的java.util.Date。 Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 格式化LocalDateTime和格式化时间和日期一样的,除了使用预定义好的格式外,我们也可以自己定义格式: DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13 和java.text.NumberFormat不一样的是新版的DateTimeFormatter是不可变的,所以它是线程安全的。 关于时间日期格式的详细信息:http://download.java.net/jdk8/docs/api/java/time/format/DateTimeFormatter.html 十、Annotation 注解 在Java 8中支持多重注解了,先看个例子来理解一下是什么意思。 首先定义一个包装类Hints注解用来放置一组具体的Hint注解: @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } Java 8允许我们把同一个类型的注解使用多次,只需要给该注解标注一下@Repeatable即可。 例 1: 使用包装类当容器来存多个注解(老方法) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} 例 2:使用多重注解(新方法) @Hint("hint1") @Hint("hint2") class Person {} 第二个例子里java编译器会隐性的帮你定义好@Hints注解,了解这一点有助于你用反射来获取这些信息: Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2 即便我们没有在Person类上定义@Hints注解,我们还是可以通过 getAnnotation(Hints.class) 来获取 @Hints注解,更加方便的方法是使用 getAnnotationsByType 可以直接获取到所有的@Hint注解。 另外Java 8的注解还增加到两种新的target上了: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

日你dady哟 2019-12-02 03:08:13 0 浏览量 回答数 0

回答

跨域请求需要用webservice,远程方法调用!######能详细一些吗?怎么跨域的意思,我http请求不也就行了吗?怎么存在跨域了...还有远程方法调用,###### 传统的webservice是提供wsdl格式的内容,通过解析这样的返回内容可以得到一些对象和方法。需要特定的client去接收并解析 而广义上的webservice则可以将SpringMVC 遵循rest规范的API也纳入范畴,对于controller提供的API可以通过简单的httpclient进行接收和请求 ######那你意思上,广义来说,他们都是一个样咯。哈。###### 有一个地方很明显不一样: webService可以调用其他系统中的class的一个方法。controller中调用不了其他系统中的类的方法吧? 另外一个上面上面提到的一个跨域问题,一般都是js出现跨域问题。不用webService也可以解决(webService可以解决这个问题吗?一直不清楚。)。js请求本地controller,controller再通过httpClient请求其他域的接口。或者js请求jsp,jsp再请求其他的域接口都行。 ######【webService可以调用其他系统中的class的一个方法】,调用都是做一些业务处理,数据库操作吧,开放一个接口出来也可以呀。会不会因为安全问题,不对外开放接口,只允许代码调用??? 对,关于跨域的,如你所说就可以解决啦,只是代码任务上多了些操作...###### 首先,WebService肯定不是MVC里的Controller,虽然这两种东西都具有接口的性质,但这不代表他们就可以用“类似”来比较。 其次,WebService本身就是编程实现的,你用不同的程序语言当然也能实现了。但是注意,这里不是说用Struts、SpringMVC之类的某某框架去实现,因为你实现的过程就已经撇开了框架,是建立在Java(或者某种语言)的基础上,这个关系也不要混淆。 最后,那为什么不自己去实现呢?自己去实现当然是可以的,但是你真正觉得你能做到专门做WebService团队的水平吗?开发的时间能保证不会得不偿失吗?代码质量和运行速度有保证吗?显然是不行的,将WebService独立出来,其实是模块化的一个例子,这些东西留给WebService去考虑,而不是你来考虑。 ######像你所说的,比如一个快递公司,它内部一个查询快递单号的系统, 这个系统只对内使用。但对外互联网用户就重新的弄一套WebService应用使用???######mark

kun坤 2020-05-29 23:09:26 0 浏览量 回答数 0

问题

dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?【Java问答学堂】49期

剑曼红尘 2020-07-02 17:35:03 17 浏览量 回答数 1

问题

为什么要进行系统拆分?如何进行系统拆分?拆分后不用 dubbo 可以吗?【Java问答学堂】46期

剑曼红尘 2020-06-29 16:39:00 6 浏览量 回答数 1

回答

一定要网页下载吗?可以考虑ftp方式下载吗?比如mget ------------------------- 嗯,网页访问只有java和php,如果是windows命定行可以用python,也可以自己做个window程序,好像有c的oss开发包; ------------------------- 回 6楼(nbeliu) 的帖子 PHP怎么实现多文件打包下载? 可以在php里调用system运行服务器命令行,把多个文件打包成一个文件,如system ("tar -xzvf...");,然后给压缩后的文件建立个下载链接在页面上,不知道这个是不是你的需求; 网站如何实现OSS上的多文件下载?一次调用GetObject接口,吧多文件下载到本地,然后,再传给用户; ------------------------- 嗯,打包文件放OSS,流量大还有被收费的风险;

洵云 2019-12-02 00:33:05 0 浏览量 回答数 0

回答

请问怎么测试服务器ws://这个接口是否正常刚才试了下,本地测试连接正常,到服务器就是连不上,服务器有端口限制的,请问这个默认需要开设什么端口?<aclass="referer"target="_blank">@jfinal大神请赐教@hutool要用sockjs的服务端 <atarget="_blank"rel="nofollow">https://github.com/projectodd/sockjs-servlet回复<aclass="referer"target="_blank">@tianxia007:还有注解现在java写代码,就象是在写配置文件大神,后台服务只需要把那个jar包导入即可是吗<spanstyle="color:#111111;font-family:'PingfangSC',STHeiti,'LantingheiSC','OpenSans',Arial,'HiraginoSansGB','MicrosoftYaHei','WenQuanYiMicroHei',SimSun,sans-serif;font-size:14px;line-height:22.4px;background-color:#FFFFFF;">WebSocketServlet我在本地部署测试都正常,放到服务器连接失败,我们服务器有端口限制的,我怀疑WebSocketServlet这个类有默认端口要求是吗,求大神指点没有没可能跟flashsocket一样有安全策略方面的问题???

爱吃鱼的程序员 2020-06-08 20:11:43 0 浏览量 回答数 0

问题

平台接口问题

mickly 2019-12-01 21:08:02 4735 浏览量 回答数 1

问题

19年BAT常问面试题汇总:JVM+微服务+多线程+锁+高并发性能

游客pklijor6gytpx 2020-01-09 10:31:29 1271 浏览量 回答数 3

问题

批量计算

黄一刀 2020-04-04 03:16:01 71 浏览量 回答数 1

问题

MaxCompute百问集锦

yq传送门 2019-12-01 20:16:47 2404 浏览量 回答数 1

回答

ReOSS如何访问?如何使用? 上传文件,如果你是文件上传管理,目前官方和民间都有比较方便使用的工具了;如果是要集成到自己的程序你,需要使用官方对应语言的SDK。 URL签名的例子,在每个语言的SDK包里面都已经提供好了,可以参考SDK;如果希望自己实现,就参考官方API文档,里面有详细说明签名应该怎么计算出来。 关于访问权限,官方API文档的描述: OSS 提供 ACL (Access Control List Access Control ListAccess Control ListAccess Control List Access Control List Access Control List Access Control ListAccess Control List )权限控制方法, OSS ACL ACL提供 BucketBucket Bucket Bucket级别的权限访问控制, BucketBucket Bucket Bucket目前有三种访问权限: 目前有三种访问权限: public public-read readread-writewrite ,public public-read readread和 private private ,它们的含义如下: ,它们的含义如下:  publicpublic public -readread -writewrite write:任何人(包括匿名访问)都可以对该 bucket bucket bucket中的 object object进行 PUTPUT ,Get Get和 Delete Delete 操作;所有这些产生的费用由该 操作;所有这些产生的费用由该 bucket bucket bucket的创建者承担,请慎用该权限。  publicpublic public -readread :只有该 bucket bucket bucket的创建者可以对该 的创建者可以对该 bucket bucket bucket内的 Object ObjectObject进行 写操作(包括 写操作(包括 PutPut 和 Delete Object Delete Object Delete Object Delete ObjectDelete Object);任何人(包括匿名访问)可以对该 );任何人(包括匿名访问)可以对该 );任何人(包括匿名访问)可以对该 );任何人(包括匿名访问)可以对该 );任何人(包括匿名访问)可以对该 );任何人(包括匿名访问)可以对该 bucket bucket bucket中的 object object进行读操作( Get Object Get Object Get Object)。  privateprivate private private:只有该 bucket bucket bucket的创建者可以对该 bucket bucketbucket bucket内的 Object ObjectObject进行读写 操作(包括 操作(包括 PutPut 、Delete Delete 和 Get Object Get Object Get Object);其他人无法访问该 );其他人无法访问该 );其他人无法访问该 );其他人无法访问该 BucketBucket Bucket Bucket内的 Object ObjectObject。 用户新 创建一个BucketBucket Bucket Bucket时,如果不指定 BucketBucket Bucket Bucket权限, OSS 会自动为该 会自动为该 BucketBucket Bucket Bucket设置 private private 权限。对于一个已经存在的 权限。对于一个已经存在的 BucketBucket Bucket Bucket,只有它的创建者可以 ,只有它的创建者可以 通 过 OSS 的 Put Bucket AclPut Bucket Acl Put Bucket Acl Put Bucket Acl Put Bucket Acl Put Bucket AclPut Bucket AclPut Bucket Acl接口 修改该 BucketBucket BucketBucketBucket的 ------------------------- ReOSS如何访问?如何使用? 你的运行环境如果是Linux,可以直接使用我们的cloudfs for oss。你的phpwind一行代码也不用写,就可以把OSS作为一个无限大的硬盘来使用。 参考这个帖子,Linux下把OSS存储变成本地的硬盘   http://bbs.aliyun.com/read/233791.html?spm=5176.7189909.0.0.c8rww5 免费,强大,有问题有专人支持解答。 ------------------------- ReOSS如何访问?如何使用? 你如果使用官方的Java或者PHP SDK,这个签名的工作已经内置在SDK内部了,你不需要去关心签名的事情,只需要按照SDK文档调用相应的文件上传接口就可以。 官方提供的OSS API文档,其目的是描述OSS各种接口(这里的接口指的是OSS基于http协议定义的各种操作接口,区别于SDK中对应的各种编程语言的编程接口)的详细字段以及构建方法,用于指导第三方SDK开发;比如OSS目前官方没有C/C++ SDK,如果需要C/C++程序想要访问OSS,就需要自己去编程实现OSS的接口。 回到你的问题,你现在用JAVA或者PHP,官方都有SDK,详细去看官方的SDK文档会更快和更有帮助。 希望能够解答你的问题。

云语科技 2019-12-02 01:56:51 0 浏览量 回答数 0

问题

安卓与iOS百问,开发者系统指南

yq传送门 2019-12-01 20:14:48 27317 浏览量 回答数 26

问题

MaxCompute百问集锦(持续更新20171011)

隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

问题

ios9字体、阿里云oss、个人企业域名备案等常见问题和答案汇总

问问小秘 2020-01-02 10:31:59 36 浏览量 回答数 1

问题

【javascript学习全家桶】934道javascript热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:22 6202 浏览量 回答数 1

问题

程序员报错行为大赏-配置报错

问问小秘 2020-06-11 13:18:25 6 浏览量 回答数 1

问题

函数计算

黄一刀 2020-04-04 03:07:45 80 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站