2023年3月

基本上所有的Java教程都会告诉我们Java接口的方法都是public、abstract类型的,没有方法体的。

但是在JDK8里面,你是可以突破这个界限的哦。

== 一个类实现某个接口,必须重写接口中的所有方法吗?

如果子类是非抽象类,则必须实现接口中的所有方法;
如果子类是抽象类,则可以不实现接口中的所有方法,因为抽象类中允许有抽象方法的存在!

public interface ItfTest {//定义一个接口
  public void test();//定义接口的方法
}public abstract class AbsTest implementsItfTest {//实现一个抽象类,继承ItfTest接口,可以不重写test方法,由AbsTest的子类实现
}

== 上面是之前的定义了,jdk8开始,接口中有方法体的方法 子类不需要实现。举例:

MyInterface.java:interfaceMyInterface{
String myNewName(String newName);
defaultString myOldName(){return "chao";
}

}

GetName.java:
public class GetName implementsMyInterface{public static voidmain(String args[]){
GetName getName
= newGetName();//可以直接调用接口中的默认方法myOldName() System.out.println("my old name is "+getName.myOldName());
String newName
= "超人";
getName.myNewName(newName);
}
//只需要实现接口中没有方法体的方法即可; publicString myNewName(String newName){
System.out.println(
"my new name is "+newName);return "my new name is "+newName;
}
}
运行结果:
my old name is chao
my
new name is 超人

拓展:

dt.jar是关于运行环境的类库,主要是swing的包
tools.jar是关于一些工具的类库
rt.jar包含了jdk的基础类库,也就是你在java doc里面看到的所有的类的class文件

编译和运行需要的都是toos.jar里面的类 , 分别是
sun.tools.java.*;
sun.tools.javac.*;

==以上背景:


为什么是.class,难道我的环境可以看到.class的源码??

某天在看public interface Map<K,V> 接口( java.util.Map<K, V>)时发现 1、里面有一个内部接口 java.util.Map.Entry<K, V>

2、该接口的方法 java.util.Map.replaceAll(BiFunction<? super K, ? super V, ? extends V>) 等方法都有方法体,如:貌似要加上 default

     * @since 1.8
     */
    defaultV replace(K key, V value) {
V curValue;
if (((curValue = get(key)) != null) ||containsKey(key)) {
curValue
=put(key, value);
}
returncurValue;
}

-------


     * @since 1.8
     */
    default booleanremove(Object key, Object value) {
Object curValue
=get(key);if (!Objects.equals(curValue, value) ||(curValue== null && !containsKey(key))) {return false;
}
remove(key);
return true;
}

default boolean remove(Object key, Object value)

Map.class是在package java.util 中的,而他们又在 rt.jar包中的
C:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar

==网文1,还不错,感觉比较老旧
springMVC中controller的几种返回类型 - CSDN博客
http://blog.csdn.net/qq_16071145/article/details/51222372

Controller方法的返回值可以有以下几种:
1、返回ModelAndView
返回ModelAndView时最常见的一种返回结果。需要在方法结束的时候定义一个ModelAndView对象,并对Model和View分别进行设置。
2、返回String
1):字符串代表逻辑视图名
真实的访问路径=“前缀”+逻辑视图名+“后缀”
注意:如果返回的String代表逻辑视图名的话,那么Model的返回方式如下:
public String testController(Model model){
model.addAttribute(attrName,attrValue);//相当于ModelAndView的addObject方法
return "逻辑视图名";
}
2):代表redirect重定向
redirect的特点和servlet一样,使用redirect进行重定向那么地址栏中的URL会发生变化,同时不会携带上一次的request
案例:
public String testController(Model model){
return "redirect:path";//path代表重定向的地址
}
3):代表forward转发
通过forward进行转发,地址栏中的URL不会发生改变,同时会将上一次的request携带到写一次请求中去
案例:
public String testController(Model model){
return "forward:path";//path代表转发的地址
}
3、返回void
返回这种结果的时候可以在Controller方法的形参中定义HTTPServletRequest和HTTPServletResponse对象进行请求的接收和响应
1)使用request转发页面
request.getRequestDispatcher("转发路径").forward(request,response);
2)使用response进行页面重定向
response.sendRedirect("重定向路径");
3)也可以使用response指定响应结果
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter.write("json串");
以上三种返回值没有什么重要和不重要的分别,一般来说都会使用到, 只不过有的时候使用的方式会有一些细微的差别

==网文2 此文有代码,对上方的拓展

SpringMVC学习(七)——Controller类的方法返回值 - CSDN博客
http://blog.csdn.net/yerenyuan_pku/article/details/72511844

== 很多返回类型很陌生

springMVC教程(八)controller中方法的返回值类型 - CSDN博客
http://blog.csdn.net/baidu_16702581/article/details/32695519

== 很不错,但是里面多了很多<span> 多余的标签了,应该是博主从其他地方拷贝过来的

SpringMVC的Controller层参数绑定以及返回值 - CSDN博客
http://blog.csdn.net/nuowei_senlin/article/details/53695956


当客户端通过get或post请求发送来的参数通过Controller中方法的参数接受,叫做参数绑定
Controller方法的返回值1:返回void类型

@RequestMapping(
"/test_void.action")public void controller01(HttpServletRequest request,HttpServletResponse response) throwsException{
request.setCharacterEncoding(
"utf-8");
String username
= request.getParameter("username");//通过HttpServletRequest获得请求参数 System.out.println("用户名:"+username);
request.setAttribute(
"username",username);
User u
= newUser();
u.setUsername(username);
userService.insertUser(u);
//插入数据库 request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);//转发 }
Controller方法的返回值2:返回ModelAndView

@RequestMapping(
"/test_modelandview.action")public ModelAndView controller02(HttpServletRequest request) throwsException{
request.setCharacterEncoding(
"utf-8");//转码,Tomcat默认是iso-8859-1 String username = request.getParameter("username");
System.out.println(
"用户名:"+username);
ModelAndView modelAndView
= new ModelAndView();//new一个ModelAndView modelAndView.addObject("username",username);//相当于request.setAttribute(attrName,attrValue); modelAndView.setViewName("WEB-INF/jsp/success.jsp");//视图跳转 returnmodelAndView;
}
Controller方法的返回值3:返回String类型(逻辑视图)

@RequestMapping(
"/test_string.action")public String controller03(HttpServletRequest request) throwsException{
request.setCharacterEncoding(
"utf-8");//转码 String username = request.getParameter("username");
request.setAttribute(
"username",username);//设置请求参数 System.out.println("用户名:"+username);return "/WEB-INF/jsp/success.jsp";//返回String类型,代表逻辑视图 }
Controller方法的返回值4:方法的参数是Model,返回值是String类型(逻辑视图)
[html] view plain copy
@RequestMapping(
"/test_model.action")public String controller04(HttpServletRequest request,Model model) throwsException{
request.setCharacterEncoding(
"utf-8");
String username
= request.getParameter("username");
model.addAttribute(
"username", username);//等价于request.setAttribute(attrName,attrValue); System.out.println("用户名:"+username);return "/WEB-INF/jsp/success.jsp";//返回String类型,跳转到逻辑视图 }
Controller方法的返回值5:返回重定向redirect后的逻辑视图名

@RequestMapping(
"/test_redirect.action")public String controller05(HttpServletRequest request) throwsException{
request.setCharacterEncoding(
"utf-8");
String username
= request.getParameter("username");
User u
= newUser();
u.setUsername(username);
userService.insertUser(u);
request.setAttribute(
"username",username);//由于是redirect,所以请求参数失效 return "redirect:/controller/test_model.action";//redirect:重定向到一个Controller里 }
Controller方法的返回值6:返回farward转发后的逻辑视图名

@RequestMapping(
"/test_forword.action")public String controller06(HttpServletRequest request) throwsException{
request.setCharacterEncoding(
"utf-8");
String username
= request.getParameter("username");
User u
= newUser();
u.setUsername(username);
userService.insertUser(u);
System.out.println(
"用户名:"+username);
request.setAttribute(
"username",username);//由于是转发,所以请求参数有效 return "forward:/controller/test_model.action";//转发,跳转到一个Controller里 }

参数绑定
参数绑定的第一种方法:绑定普通类型
//参数绑定的第一种方法:客户端提交的请求的input的name属性会和Controller方法的参数名字一致才会绑定 @RequestMapping("/test_parambinding01.action")public void controller07(HttpServletRequest request,HttpServletResponse response,String username,String password) throwsException{//必须进行转码 username = new String(username.getBytes("iso8859-1"),"UTF-8");
request.setAttribute(
"username",username);
request.getRequestDispatcher(
"/WEB-INF/jsp/success.jsp").forward(request, response);
}

参数绑定的第二种方法:绑定pojo类
//参数绑定的第二种方法:客户端的input标签的那么属性必须和User的属性名对应才可以映射成功 @RequestMapping("/test_parambinding02.action")public ModelAndView controller08(HttpServletRequest request,User user) throwsException{//必须进行转码 user.setUsername(new String(user.getUsername().getBytes("iso-8859-1"),"utf-8"));
userService.insertUser(user);
ModelAndView modelAndView
= newModelAndView();
request.setCharacterEncoding(
"utf-8");
modelAndView.addObject(
"username",user.getUsername());
modelAndView.addObject(
"password",user.getPassword());
modelAndView.setViewName(
"/WEB-INF/jsp/success.jsp");returnmodelAndView;
}

参数绑定的第三种方法:当input的name与controller的参数名不一致时,可以采用@RequestParam注解

@RequestMapping(
"test_RequestParam.action")//将客户端的请求参数"username"与"uname"绑定 public ModelAndView controller09(@RequestParam(value="username") String uname,@RequestParam(value="password")String pwd) throwsException{
uname
= new String(uname.getBytes("iso-8859-1"),"utf-8");
ModelAndView modelAndView
= newModelAndView();
modelAndView.addObject(
"username",uname);
modelAndView.setViewName(
"/WEB-INF/jsp/success.jsp");returnmodelAndView;
}

原文

===此文 里面的小结感觉很实用,但本人理解不完全

SpringMVC Controller 返回值的可选类型 - xiepeixing - 博客园
http://www.cnblogs.com/xiepeixing/p/4243801.html

小结:
1.使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很大的灵活性,而模型数据又可以通过 ModelMap 控制。
2.使用void,map,Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+视图名称 +suffix后缀组成。
3.使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。

==以前一直以为平时所用的邮箱是绝对安全的,没有深思它的安全性。

然而你要“犯罪”不留任何痕迹的话,呵呵。

国内应该没有类似 ProtonMail 的邮箱,--》去了解一下

==========

PGP工作原理及其密钥管理体制的安全应用
http://tech.hqew.com/news_1535512

推荐安全且匿名的邮箱 ProtonMail
https://zhuanlan.zhihu.com/p/25085337?utm_source=tuicool&utm_medium=referral

TED演讲集:科技 - 网易云课堂 课时3你的私人电邮不私密

http://study.163.com/course/courseLearn.htm?courseId=1003681032#/learn/video?lessonId=1004218116&courseId=1003681032

==注册

Secure email: ProtonMail is free encrypted email.
https://protonmail.com/

点击右上角的 sign up  ,选择免费版 free ,


填写国内的邮箱提示不可以用,有些人是用 雅虎的邮箱来;

可惜本人没有国外邮箱,最后没有申请下去 。 gmail, yahoo, aol 都比较好

==有人提出疑问,应该是楼主不懂

对于这个邮箱的几点疑问【protonmail吧】_百度贴吧
https://tieba.baidu.com/p/3622293992?red_tag=2986998836&traceid=

$("#alarmWav").append(
$(
'<audio id="alarmAudio" autoplay loop src="../js/Alarm.wav">wav</audio>'));//动态添加 有自动播放属性function alarmclick() { //checkbox 点击 var audio = $("#alarmAudio");if (audio != null) {if ($("#alarmSelect").is(':checked')) {
if(audio[0].paused){
audio[
0].play();}
}
else{
audio.removeAttr(
"autoplay"); //如果有自动播放autoplay属性,pause()方法不起作用,这个方式去除只是把autoplay变成FALSE audio[0].pause();
}

}
}

有人碰到过这个问题吗?? checkbox取消时,暂停不了。还在一直播放

如果动态添加的播放器没有自动播放属性时,pause()就可以停止,play()可以播放

不可变类且线程安全 LocalDate 、java.time.LocalTime 和LocaldateTime  新的Date和Time类

DateTimeFormatter

==https://www.cnblogs.com/blog5277/p/6407463.html

JDK8中增加了一系列时间的类,

(据说)是为了干掉过去的Date,Calendar类的,

过去的Date类(据说)有着线程不安全等诸多弊端,

至于我的个人感受就是用起来实在是很麻烦,我一般封装成几个常用的方法以后每次就调方法,再也不想看里面是怎么实现的了.

而发现了LocalDateTime这种新类以后,经过我的简单的试用,觉得完全可以取代掉之前使用时间的
一切
方法.非常好用,太好用了.

下面是简单的使用教程:

1,按照自由格式获取当前时间

public static String getTodayByFormat(String timeFormat){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(timeFormat));
}

简直优雅,甚至我都不想封装成方法了,想用随时写,就是这么容易.

2,获取当前年/月/日

一张图说明,想怎么取,想怎么拼,都随便

3,获取前一天

从前我的笨方法是:

复制代码
public static String getYesterdayByFormat(String timeFormat){
//获取当前日期
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat(timeFormat);
//通过秒获取下一天日期
long time = (date.getTime() / 1000) - 60 * 60 * 24;//秒
date.setTime(time * 1000);//毫秒
String yesterday = sf.format(date).toString();
return yesterday;
}
复制代码

如今有了新方法:

public static String getYesterdayByFormat(String timeFormat){
return LocalDateTime.now().plusDays(1).format(DateTimeFormatter.ofPattern(timeFormat));
}

同理,我都不想为获取X天后/X小时后单独写方法了,就在下面(以增加为例):

返回值是LocalDateTime,也就意味着可以一直链式点下去,想要多少天以后的数据尽管开口,一句写不完算我输.

4,获取已经度过的毫秒/秒

===

看看新的LocalDate怎么用:
// 取当前日期:
LocalDate today = LocalDate.now(); // -> 2014-12-24
// 根据年月日取日期,12月就是12:
LocalDate crischristmas =
LocalDate.of
(2014, 12, 25); // -> 2014-12-25

// 根据字符串取:
LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
LocalDate.parse
("2014-02-29"); // 无效日期无法通过:DateTimeParseException: Invalid date

日期转换经常遇到,比如:
// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2014-12-01
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2014-12-02
// 取本月最后一天,再也不用计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2014-12-31
// 取下一天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2015-01-01
// 取2015年1月第一个周一,这个计算用Calendar要死掉很多脑细胞:
LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05

==

java8 LocalDate LocalDateTime等时间类用法实例分析_java_脚本之家
http://www.jb51.net/article/110343.htm

本文实例讲述了java8 LocalDate LocalDateTime等时间类用法。分享给大家供大家参考,具体如下:

这篇文章主要是java8中新的Date和Time API的实战。
新的Date和Time类是Java开发者社区千呼万唤始出来的
。Java8 之前存在的Date类一直都受人诟病,很多人都会选择使用第三方的date库joda-time。Java8中的date和time api是jodatime的作者参与开发的,实现了JSR310的全部内容。这些新的api都在包java.time下。

既然第三方的joda-time,date4j都已经足够强大了,为什么java8还要重新实现他呢,一部分的原因是这些第三方的库是
存在兼容问题的
,比如标准的JSF日期转化器与joda-time api,就不兼容,每次使用都需要编写自己的转换器,所以标准化api是必须的,就有了JSR310,java8中就实现了他全部的规定内容。

新Date类和Time类背后的设计原则:

不可变类

java8之前,Date类都是可变类。当我们在多线程环境下使用它,编程人员应该确认Date对象的线程安全。Java8的Date和Time API提供了线程安全的不可变类。编程人员不用考虑并发的问题。

领域模型驱动设计方法

新的日期和时间的类别遵循“域驱动设计”。对于开发者来说,理解方法和类的功能是很容易的。

java.time.LocalDate:

LocalDate只提供日期不提供时间信息。它是不可变类且线程安全的。

java.time.LocalTime:

LocalTime只提供时间而不提供日期信息,它是不可变类且线程安全的。

java.time.LocalDateTime:

LocalDateTime提供时间和日期的信息,它是不可变类且线程安全的

java.time.Year:

Year提供年的信息,它是不可变类且线程安全的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
import
java.time.Year;
import
java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public
class
DateTimeDemonstration {
/**
* @param args
*/
public
static
void
main(String[] args) {

//Get year

Year year = Year.now();

System.out.println(
"Year ::"
+ year);

//know the year is leap year or not

System.out.println(
"Is year["
+year+
"] leap year?"
+ year.isLeap());

}
}

运行结果:

java.time.Duration:

Duration是用来计算两个给定的日期之间包含多少秒,多少毫秒,它是不可变类且线程安全的

java.time.Period:

Period是用来计算两个给定的日期之间包含多少天,多少月或者多少年,它是不可变类且线程安全的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
import
java.time.LocalDate;
import
java.time.Period;
import
java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public
class
DateTimeDemonstration {
/**
* @param args
*/
public
static
void
main(String[] args) {

LocalDate localDate = LocalDate.now();

Period period = Period.between(localDate, localDate.plus(
2
, ChronoUnit.DAYS));

System.out.println(period.getDays());

}
}

运行结果: