伙伴们,Java一直以来都是一门非常热门的编程语言,本话题以分享学习Java知识为例,带领大家从0到1学习Java。
你可以从以下几个方面着手(不强制),或者根据自己对话题主题的理解创作,参考如下:

一、为什么要捕获异常?Java异常处理、finally 、throw和throws的区别?

0、为什么要捕获异常
可以预防错误的程序代码所造成的不可预期的结果发生
把握代码的灵活性等

1、Java异常处理
1 try…catch、try…catch…finally、try…finally
2 throws + 异常类型

3、finally 不管try…catch是否捕获异常,fianlly包含的语句一定会执行

4、throw和throws的区别?

throw和throws都是在异常处理中使用的关键字,区别如下:

throw:指的是在方法中人为抛出一个异常对象;
throws:在方法的声明上使用,表示此方法在调用时必须处理异常。
//批量物理删除改为逻辑删除
BaseResponse baseResponse = swRemoteService.deleteMch(mchUserDelReq1);
if (!baseResponse.isOk()) {
throw BizException.buildException(baseResponse.getCode(), baseResponse.getMsg());
}
//1、变更对象负责人、执行人 勘店任务及后台记录 店铺 开店项目 网规项目 报告 待勘任务 流程审批配置 待审批流程及后台记录
BaseResponse migrateData = surveyShopRemoteService.migrateData(mchUserDelReq);
if (!migrateData.isOk()) {
throw BizException.buildException(migrateData.getCode(), migrateData.getMsg());
}

request和requestScope的区别


在看param和requestScope之前,不妨先了解下在java下request的情况:

  1. request对象通常用来接收客户端提交到服务端的数据,如:在servlet或者action中可以用request.getParameter()的方法获取获取参数内容;
  2. requestScope通常是在servlet或者action的服务端中通过request.setAttribute()方法把数据放到request对象中供客户端获取,然后客户端获取的方法就是requestScope.getAttribute()。
  3. getParameter:

可以获取URL中传递过来的String参数,如:http://www.baidu.com?username=abc 中的abc;

提示:对于POST/GET提交的表单,在服务器端我们都可以通过request.getParameter获取表单中的值。

当我们在进行一个请求重定向(redirect)的时候,我们可以通过request.setParameter传递参数,如果用request.setAttribute在重定向页面是取不到值的。

(待验证,因为HttpServletRequest中没有setParameter方法。)

  1. getAttribute:

获取的是一个对象(Object)。

当我们进行一个请求转发(forward)的时候,可以使用request.setAttribute传递参数。

  1. requestScope作为El表达式中的使用:

是EL表达式中的一个隐含对象,类似request,如:${requestScope.username} 表示在request域中取得username属性所对应的值,相当于request.getAttribute(“username”)。

  1. param,El表达式中的使用:

${param.username} 可理解为:request.getParameter(“username”);

结论:

${param.name} 等价于 request.getParamter(“name”),这两种方法一般用于服务器从页面或者客户端获取的内容,这些内容都是String的。

${requestScope.name} 等价于 request.getAttribute(“name”),一般是从服务器传递结果到页面,在页面中取出服务器端保存的值!


doPost()方法与doGet的区别

doPost()处理post方法

doGet处理get方法

post与get的区别为

get安全性不高,密码暴露在url地址中,post安全性相对更高

get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串。post的参数是通过另外的流传递的,不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。

doGet与doPost一般情况下在前端method中一个是get,一个是post。而在后端Servlet方法中基本上差不多

public class XXXXX extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse esponse) throws IOException,ServletException {
request.setCaracterEncoding(“gb2312”);//汉字转码
PrintWriter out = response.getWriter();
out.println(“XXXXXX”+request.getParameter(“name”));
} }public class XXXXX extends HttpServlet {
public void doPost(HttpServletRequest request,HttpServletResponse esponse) throws IOException,ServletException {
request.setCaracterEncoding(“gb2312”);//汉字转码
PrintWriter out = response.getWriter();
out.println(“XXXXXX”+request.getParameter(“name”));
} }-----》我们写servlet的时候经常两个都写,想调用doPost()、doGet都可以
public class XXXXXX extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
request.setCaracterEncoding(“gb2312”);
PrintWriter out = response.getWriter();
out.println(“…”+request.getParameter(“name”)); }public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
this.goGet(request,response);//调用doGet()方法
} }

NullPointerException空指针异常?堆栈与队列的区别?

1、NullPointerException空指针异常如数组a[0]值为Null,需要sout(a[0].toString)是即会报空指针异常

避免空指针异常是基本的素养,一般解决思路为对变量进行初始化

可能原因
1 字符串变量未初始化

(数据库查出来的对象,get方法可能就没有初始化,一般为空就会报空指针异常,还会影响到log相关的日志)
2 接口类型的对象没有用具体的类初始化
3 a1.equals(“a”);容易抛NullPointerException
—>“a”.equals(a1);4 。。。。。。

2、堆栈(stack) 限定在一端进行插入和删除的线性表 先进后出队列(Queue)一端插入,另一端删除的线性表 先进先出

谷歌kaptchaa图片验证码的使用

使用步骤

1、导入谷歌验证码的jar包

kaptcha-2.3.2.jar

2、在web.xml中去配置—>Servlet


<servlet> <servlet-name>KaptchaServlet</servlet-name>

<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> </servlet>

<servlet-mapping> <servlet-name>KaptchaServlet</servlet-name>

<url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping>

3.在前端jsp导入kaptcha.jpg显示出来


<img id="code_img" alt="" src="kaptcha.jpg" style="float: right; margin-right: 40px; width: 110px; height: 30px;">


4、写对应的Servlet

doGet…
//1 获取Session的验证码
String token = (String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY);
//删除Session中的验证码
req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
String code = req.gerParameter(“code”);
if(token != null && token.equalsIgnoreCase(code)){
resp.sendRedirect(req.getContextPath() + “/…”)
}else{
///请不要重复提交表单
}
r然后用户点击图片的时候应该刷新验证码
所以切换验证码
单击事件
$(“#code_img”).click(function(){
this.src = “${basePath}kaptcha.jpg?d” + new Date();
});
###for遍历输出

for (Order order:items

) {

System.out.println(order.toString());



}

二维数组的定义


1、二维数组的定义

1 int[][] a3 = new int[][]{{1,2,2},{1,2,2},{3,3,3}};

或 int[][] a3 = new int[][]{{1,2},{1,2,2},{3,3,3}};

2 String[][] a3 = new String[3][3];

或 String[][] a3 = new String[3][];

3 int[] a4[] = new int[][]{{1,2,2},{4,5},{6,7,6}};

[一起学Java]_多态

4、int[] a4[] = new int[][]{{1,1,2},{4,5},{6,7,7}};int[] a5[] = {{1,1,2},{4,5},{6,7,7}};

5、常见问题
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 2数组越界-----》指使用非法索引访问数组。索引为负值或大于或等于数组的大小。

—》index从0开始,并且看看保证自己不要访问超过数组大小的元素

Java多态性是什么?怎么理解和使用多态,为什么要用多态?(2.0))

1、多态性:即一个事物多种形态

2、实现的两种方式为
1 继承
2 接口

3、实例
Fruit a1 = new Apple();

这就是多态。

父类new子类。
父类的引用指向子类的对象,Fruit超类new对象时指向子类Apple。

多态只适用方法,不适用属性。

4、使用

Fruit a1 = new Apple();

a1.超类和子类都有的方法
实际调用的事子类的方法,子类重写父类方法。
比如eat(),sole()…

子类独有的方法(如account())不能调用了*,这是与Apple a1 = new Apple()的主要区别!

5、为什么要用多态的好处:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对水果类工作,对苹果,橙子也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性,可扩充功能。新加子类更容易获得多态功能。例如,在实现苹果的多态基础上,很容易增添水果类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中有着灵活的操作,提高了工作效率
5.简化性(simplicity)。多态简化代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

多表查询的三种方式

  1. from table1, table2 where table1.col=table2.col
    慎用第一种,对于数据量大的来说,是先查询所有的表在查询后面的条件,相当于n*n
  2. left join 会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
    左连接,
  3. from table1 where table1.uid in (select … from table2)
    在过去ssm系统中常使用改语句,但建议优化

说说先进先出、先进后出

先进先出:堆,队列
场景:买票,只有100张,全抢完了,后面有30个人在抢票,现在突然出现这种情况:有人退票了,
那么先来先到的原则,给第101个人

队列可以完全想象在排队的场景:火车站要排队、餐厅吃饭也要排队、图书馆借书也要排队、医院挂号排队,这都是先进先出。比如用队列做缓冲、kafka、rabbitMQ等等。

先进后出:栈
场景:手机点页面进入另一个页面,又进入另一个页面,点返回应该返回上一个操作。

泛型的了解

1、泛型,即“参数化类型”
2、没有泛型之前

List arrayList = new ArrayList();
arrayList.add("aaaa");
arrayList.add(100);

for(int i = 0; i< arrayList.size();i++){
String item = (String)arrayList.get(i);
Log.d("泛型测试","item = " + item);
}

崩溃

ArrayList可以存放任意类型,例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,因此程序崩溃了。

所以需要泛型来解决这个问题,泛型将所有类型,对象带过来,以<>的定义来表示泛型。
3、泛型的类型有哪些?
T、<>比较常见

E - Element (在集合中使用,因为集合中存放的是元素)

T - Type(Java 类)
K - Key(键)

V - Value(值)
N - Number(数值类型)

? - 表示不确定的java类型
S、U、V - 2nd、3rd、4th types

java异常中throw和throws的区别

throws和throw
throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw:则是用来抛出一个具体的异常类型。
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
分别介绍
throws在方法后边声明异常,其实就是自己不想对异常做出任何的处理,告诉别人自己可能出现的异常,交给别人处理,然别人处理

package com.xinkaipu.Exception;
class Math{
public int div(int i,int j) throws Exception{
int t=i/j;
return t;
}
}public class ThrowsDemo {
public static void main(String args[]) throws Exception{
Math m=new Math();
}
}
throw:就是自己处理一个异常,有两种方式要么是自己捕获异常try…catch代码块,要么是抛出一个异常(throws 异常)
package com.xinkaipu.Exception;public class TestThrow
{
public static void main(String[] args)
{
try
{
//调用带throws声明的方法,必须显式捕获该异常
//否则,必须在main方法中再次声明抛出
throwChecked(-3);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
//调用抛出Runtime异常的方法既可以显式捕获该异常,
//也可不理会该异常
throwRuntime(3);
}
public static void throwChecked(int a)throws Exception
{
if (a > 0)
{
//自行抛出Exception异常
//该代码必须处于try块里,或处于带throws声明的方法中
throw new Exception(“a的值大于0,不符合要求”);
}
}
public static void throwRuntime(int a)
{
if (a > 0)
{
//自行抛出RuntimeException异常,既可以显式捕获该异常
//也可完全不理会该异常,把该异常交给该方法调用者处理
throw new RuntimeException(“a的值大于0,不符合要求”);
}
}
}

FinalShell(比Xshel更好用的 FinalShell)

FinalShell == Xshell + Xftp
从2016年第一个版本开始到至今

FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求.特色功能:云端同步,免费海外服务器远程桌面加速

下载地址:​​http://www.hostbuf.com/t/988.html​

哪种开源许可证下的软件可以用于商业

哪种开源许可证下的软件可以用于商业
  开源的软件大家应该不会陌生,它帮助我们可以迅速的了解一个技术的实现过程。并且可以加快我们的开发速度。但是不同的

开源软件遵守各自的许可证协议,有些开源软件是不能用作商业用途的。经过Open Source Initiative 组织通过批准的开源协议目前

有60多种,那么哪种许可证下的开源软件可以用于商业,哪种又不能呢?下面就我个人的理解做个介绍。

下面这个博客介绍的非常详细:

​http://univasity.iteye.com/blog/1292658​

拜读了上面这个链接的博客后,我整理一下:

1.常用的开源协议:
Apache License 2.0
要点:Apache Licence是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

BSD开源协议(Berkerley Software Distribution)
要点:商业软件可以使用,也可以修改使用BSD协议的代码。

GPL ( GNU General Public License )
要点:商业软件不能使用GPL协议的代码。

LGPL ( GNU Library or “Lesser” General Public License )
要点:商业软件可以使用,但不能修改LGPL协议的代码。

MIT ( MIT license )
要点:商业软件可以使用,也可以修改MIT协议的代码,甚至可以出售MIT协议的代码。

MPL ( Mozilla Public License 1.1 )
要点:商业软件可以使用,也可以修改MPL协议的代码,但修改后的代码版权归软件的发起者。

CDDL (Common Development and Distribution License )
要点:商业软件可以使用,也可以修改CDDL协议的代码。

EPL (Eclipse Public License 1.0 )
要点:商业软件可以使用,也可以修改EPL协议的代码,但要承担代码产生的侵权责任。
2.总结
  从上面的总结看出来,常用的开源软件协议中,只有GPL许可证的开源软件是不能作为商业用途的,其他虽然有限制但是也是可以的。

所以如果你要为一个商业软件寻找一个开源的软件工具,那么最好不要使用GPL许可证下的软件。否则,在以后产品商业化的时候就会遇到麻烦。

两种获取URL,重定向(sendRedirect)和请求转发(forward) 区别

HttpServletResponse的sendRedirect() 和RequestDispater的forward()可以让浏览器获得另一个URL的相关资源,但两者有所不同

请求转发和重定向的区别:

请求转发是一个请求一次响应,而重定向是两次请求两次响应。

请求转发地址不变化,而重定向会显示后一个请求的地址

请求转发只能转发到本项目其它Servlet,而重定向不只能重定向到本项目的其它Servlet,还能定向到其它项目

请求转发是服务端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,既包含项目名!

1.sendRedrect()重定向:不仅可以重定向到同一web应用中的组件,可以重定向到其他站点资源,重定向后浏览器的URL会发生变化,因为重定向的实质 是 server端发送一个消息给浏览器端,使重新浏览新的URL

2.forward() 请求转发:forward只能请求转发给同一web应用中的组件,转发后浏览器的url不会发生改变,forward实质是 站内转发,获取其他server资源,不会给浏览器端发送消息

如注册失败,跳回到注册界面

req.getRequestDispatcher(path).forward(req, resp); path取值:“/pages/user/regist.html”

面向对象怎么理解

《Java编程思想》中提到“万物皆为对象”的概念。它将对象视为一种奇特的变量,它除了可以存储数据之外还可以对它自身进行操作。它能够直接反映现实生活中的事物,例如人、车、小鸟等,将其表示为程序中的对象。每个对象都具有各自的状态特征(也可以称为属性)及行为特征(方法),java就是通过对象之间行为的交互来解决问题的。
面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为。
类是面向对象中的一个很重要的概念,因为类是很多个具有相同属性和行为特征的对象所抽象出来的,对象是类的一个实例。
类具有三个特性:封装、继承和多态。

封装:核心思想就是“隐藏细节”、“数据安全”,将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。
继承:子类可以继承父类的属性和方法,并对其进行拓展。
多态:同一种类型的对象执行同一个方法时可以表现出不同的行为特征。通过继承的上下转型、接口的回调以及方法的重写和重载可以实现多态。

商场倒序程序逻辑实现

competeMarketRespList = competeMarketRespList.stream()
.sorted(Comparator.comparing((Function<CompeteMarketResp, Double>) market ->
Double.valueOf(StringUtils.isEmpty(market.getMarketArea()) ? "0"
: market.getMarketArea()), Comparator.nullsFirst(Double::compareTo))
.reversed()).collect(Collectors.toList());

有人会问为什么不在mysql实现呢
因为当时调用极海数据,远程data服务
那里数据很重要
可以增加接口
但是能不动尽量不要去动它

git diff 命令比较文件的不同,即比较文件在暂存区和工作区的差异。

git diff 命令比较文件的不同,即比较文件在暂存区和工作区的差异。

关于MySQL索引的定义及理解

1、定义
索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能
非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。
索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。
可想而知!!非常重要的概念!!!
2、MySQL的索引分类

索引分类
1.普通索引index :加速查找
2.唯一索引
主键索引:primary key :加速查找+约束(不为空且唯一)
唯一索引:unique:加速查找+约束 (唯一)
3.联合索引
-primary key(id,name):联合主键索引
-unique(id,name):联合唯一索引
-index(id,name):联合普通索引
4.全文索引fulltext :用于搜索很长一篇文章的时候,效果最好。
5.空间索引spatial :了解就好,几乎不用
3、创建

善用帮助文档
help create
help create index
==================
1.创建索引
-在创建表时就创建(需要注意的几点)
create table s1(
id int ,#可以在这加primary key
#id int index #不可以这样加索引,因为index只是索引,没有约束一说,
#不能像主键,还有唯一约束一样,在定义字段的时候加索引
name char(20),
age int,
email varchar(30)
#primary key(id) #也可以在这加
index(id) #可以这样加
);
-在创建表后在创建
create index name on s1(name); #添加普通索引
create unique age on s1(age);添加唯一索引
alter table s1 add primary key(id); #添加住建索引,也就是给id字段增加一个主键约束
create index name on s1(id,name); #添加普通联合索引
2.删除索引
drop index id on s1;
drop index name on s1; #删除普通索引
drop index age on s1; #删除唯一索引,就和普通索引一样,不用在index前加unique来删,直接就可以删了
alter table s1 drop primary key; #删除主键(因为它添加的时候是按照alter来增加的,那么我们也用alter来删)

控制面板用户账号重置你的gitee账户

[一起学Java]_java_02


[一起学Java]_重定向_03


进入进行编辑就可以了

[一起学Java]_servlet_04