Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
loversgzl committed Mar 25, 2020
1 parent 4c93cfb commit 54af3ae
Show file tree
Hide file tree
Showing 11 changed files with 106 additions and 53 deletions.
21 changes: 10 additions & 11 deletions notes/JAVA/JAVA-J2EE.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# JAVA-EE
### J2EE 主要技术
[参考博客](https://blog.csdn.net/Neuf_Soleil/article/details/80962686)
JavaEE 号称有十三种核心技术。它们分别是:**JDBC、Servlet、JSP**、JNDI、EJB、RMI、XML、JMS、Java IDL、JTS、JTA、JavaMail 和 JAF。一般来讲,初学者应该遵循路径
JDBC -> Servlet -> JSP -> Spring -> 组合框架。
JavaEE 号称有十三种核心技术。一般来讲,初学者应该遵循路径 JDBC -> Servlet -> JSP -> Spring -> 组合框架。
Java Web包括四大核心知识点:1.Spring的IOC和AOP等知识点、2.Spring MVC框架的基本流程、3.ORM技术(了解 Hibernate与MyBatis的基本开发流程)、4.Spring MVC+MyBatis、
Java Web可以延后学习的知识点:JSP、Struts MVC、JS、CSS等前端知识

Expand Down Expand Up @@ -151,8 +150,7 @@ JTA事务管理则由 JTA容器实现,JTA容器对当前加入事务的众多C
右击工程 -> properties -> java compiler -> Enable project specific settings[打钩] -> compiler compliance level 改成11。之后,eclipse会问你是否重新编译,当然选是,要得就是这个问题。

```xml
<!-- 这里要访问就需要写127.0.0.1:8080/tomcat/login.html,或者其他网页,但是前面的路径不可以改动,端口号可以改。
docBase:即使网页存放的文件夹路径,可以是普通文件夹,或者是一个web项目。
<!-- 这里要访问就需要写127.0.0.1:8080/tomcat/login.html,或者其他网页,但是前面的路径不可以改动,端口号可以改。docBase:即网页存放的文件夹路径,可以是普通文件夹,或者是一个web项目。
-->
<Context path="/tomcat/" docBase="F:\\JavaWorkSpace\\apache-tomcat-9.0.26\\webapps\\ROOT" debug="0" reloadable="false" />
```
Expand All @@ -169,16 +167,16 @@ Servlet 本身不能独立运行,需要在一个 web 应用中运行,而一
1.1、创建一个单纯的JavaProject,里面只包含:
1、JRE System Library文件夹:包含各种jar包
2、src:空文件夹
1.2、确实servlet必须的包,需要导入包,导入之后多了一个Referenced Libraties。
1.2、确定servlet必须的包,需要导入包,导入之后多了一个Referenced Libraties。
(可以创建一个bin文件夹,把需要的jar包放里面,再加载,这样移动项目不容易出错)
右键点击项目 -> properties -> Java Build Path ->Libraries -> Add External JAR
里面有两个路径:一个是Modulepath,一个是Classpath。ModulePath 的概念和ClassPath 类似,不过 ModulePath 中的 Jar 包或 Jmod 文件被当作 Module 来处理,而 ClassPath 中的的 Jar 包,无论是否模块化都会被当作传统 Jar 包处理,所以要加在Classpath下面。
里面有两个路径:一个是Modulepath,一个是Classpath。ModulePath 的概念和ClassPath 类似,不过 ModulePath 中的 Jar 包或 Jmod 文件被当作 Module 来处理,而 ClassPath 中的 Jar 包,无论是否模块化都会被当作传统 Jar 包处理,所以要加在Classpath下面。
1.3、创建一个HelloServlet.java文件,不写包名,用default package即可。
1.4、创建两个个web文件夹,web/WEB-INF文件夹,再在WEB-INF文件夹中创建web.xml文件。
1.4、创建两个web文件夹,web/WEB-INF文件夹,再在WEB-INF文件夹中创建web.xml文件。
1.5、在web/WEB-INF创建classes文件夹,把项目的class文件输出由原来的 j2ee/bin 设置到 j2ee/web/WEB-INF/classes下。项目右键->properties->Java Build Path->Source->右下角的 Brower-> 指定位置是 j2ee/web/WEB-INF/classes。
经历上面一步后,classes文件夹默认不显示了,想看的话可以到源文件中查看。

二、编写HelloServlet.java代码和web.xml代码
二、编写HelloServlet.java代码和web.xml代码
```java
import java.io.IOException;
import java.util.Date;
Expand Down Expand Up @@ -214,9 +212,9 @@ public class HelloServlet extends HttpServlet{
```

三、部署到 tomcat 中;(本地项目中j2ee为示范项目,可以参考如何将java项目部署到tomcat中,其实是在server.xml文件中增加一个Context标签,标明路径)
四、过程:浏览器输入 ip 地址,通过 TomCat 免费服务器(里面的 cof/server.xml 文件设置访问的 WEB-INF 文件的路径,即通过浏览器可以访问到的文件夹),文件夹中包含web.xml,里面设置了不同访问路径所对应的不同servlet,找到后回去classes 文件夹中寻找指定的class文件即编译后的java文件,然后返回给浏览器。
四、过程:浏览器输入 ip 地址,通过 TomCat 免费服务器(里面的 cof/server.xml 文件设置访问的 WEB-INF 文件的路径,即通过浏览器可以访问到的文件夹),文件夹中包含web.xml,里面设置了不同访问路径所对应的不同servlet,找到后到classes 文件夹中寻找指定的class文件即编译后的java文件,然后返回给浏览器。

四、奇怪的一点是每次修改java项目里面的.java文件,都要重新启动Tomcat,浏览器读取的是上一次修改的.class文件,不明白。如果使用hello.html访问,则也会无法访问。因为访问路径要和web.xml里面的映射完全一致。
四、奇怪的一点是每次修改java项目里面的.java文件,都要重新启动Tomcat,浏览器读取的是上一次修改的.class文件,不明白(应该读取的是缓存的文件)。如果使用hello.html访问,则也会无法访问。因为访问路径要和web.xml里面的映射完全一致。



Expand Down Expand Up @@ -244,6 +242,7 @@ request.getRequestDispatcher("success.html").forward(request, response);
八、Servlet 自启动

**问:Java Servlet 与使用 CGI(Common Gateway Interface,公共网关接口)有什么优势**

1. 性能明显更好。
2. Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
3. Servlet 是独立于平台的,因为它们是用 Java 编写的。
Expand Down Expand Up @@ -411,7 +410,7 @@ DAO = DataAccess Object,把数据库相关的操作都封装在这个类里面
```jsp
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %>
<%-- 日期,相当于 response.getWriter(),前面带 = 的属于需要输出的内容,不用分号结尾
<%-- 日期,相当于 response.getWriter(),前面带 = 属于需要输出的内容,不用分号结尾
如果没有则表示正常的 java 代码,需要用分号结尾 --%>
<%-- JSP中有不少内嵌对象,不用定义可以直接使用,如request,response,Session,out --%>
Expand Down
13 changes: 12 additions & 1 deletion notes/JAVA/JAVA-算法目录.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,15 @@
### 其它分类
* [位运算](Java-算法之位运算)
* [排列组合](Java-算法之排列组合)
* [数学](Java-算法之数学)
* [数学](Java-算法之数学)

**给你一道算法题:
问:1、2、3
1、参数有什么限制(主要考虑正负空,异常数据,数组是否可以修改)?
2、以什么形式输出?空输出什么?0输出什么?
3、时间,空间有什么限制?
答:1、2
1、一边写代码,一边说明思路,不断交流,嘴巴里要说,别就只顾着写
2、给面试官算法复杂度,注意,这里一定要说清楚是最好、平均、最坏,用词要严谨,这些都是细节
动态规划答题思路:如果一个什么状态,两个什么状态,三个什么状态,以此类推。
一场面试学到很多东西,记录一下,做题其实是次要的,沟通真的非常重要!**
16 changes: 16 additions & 0 deletions notes/Java/JAVA-算法之动态规划.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,19 @@ class Solution {
}
```

* **打家劫舍**
题目概述:给定一个数组,不能选取两个相邻的家庭,计算所能偷到的最大值
解题思路:只有一户,f(1)=A1,两户f(2)=max(A1,A2),三户(第三户不抢,保留最大值,),f(k)=max(f(k-2)+AK,f(k-1))
```java
public int rob(int[] nums) {
if(nums == null) return 0;
int prevMax = 0;
int currMax = 0;
for(int x : nums){
int temp = currMax;
currMax = Math.max(prevMax+x, currMax);
prevMax = temp;
}
return currMax;
}
```
50 changes: 30 additions & 20 deletions notes/Java/Java-算法之回溯法.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@

# 回溯法-经典算法-Python
**简介**
回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。
但当探索到某一步时,发现原先选择并不优或达不到目标(剪枝函数),就退回一步重新选择。
回溯法(探索与回溯法,树上的DFS)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标(剪枝函数),就退回一步重新选择。
函数中先确定必要的参数,再写递归函数(函数内,如果在函数外需要注意全局变量传递的问题),最后再调用,否则可能会出现调用在声明前的错误。
递归函数的编写注意事项:
一、参数的选取,回溯需要哪些参数,因为是函数内的函数,因此不用考虑全局变量的传递问题。
Expand All @@ -18,29 +17,40 @@

快捷键:Ctrl + Home 快速回到页面顶端查看目录,点击锚点,快速定位到算法。

往四个方向走;
```java
int[] dr = [0,0,1,-1];
int[] dc = [1,-1,0,0];
//r,c为任意位置
for(int k=0; k<4; k++){
int nr = r+dr[k];
int nc = c+dc[k];
if (0 <= nr && nr < N && 0 <= nc && nc < N) {xxx};
}
```



* **老鼠走迷宫**<a name="老鼠走迷宫"></a>
题目概述:给定一个二维数组,最外层是围墙,全为 1,里面 0 表示可以通行,寻找一条从左上角[0,0]到右下角的可行路线[n-1,n-1]
解题思路:老鼠往四个方向探索,如果其中一个走不通,则退回来走另一个方向。
进阶:如果迷宫中有多条路径,显示所有路径,对代码进行简单修改即可。
```python
endI,endJ,success = n-1,n-1,0
for i in range(len(maze)):
for j in range(len(maze[0])):
visit(i,j)
return success
def visit(i, j):
maze[i][j] = 1#走过了
if i == endI and j == endJ:
success = 1#进阶这里保存路径。
if success != 1 and maze[i][j+1]==0: visit(i,j+1)#
if success != 1 and maze[i+1][j]==0: visit(i+1,j)#
if success != 1 and maze[i][j-1]==0: visit(i,j-1)#
if success != 1 and maze[i-1][j]==0: visit(i-1,j)#

#用来显示路径,从这个点往四个方向走下去走不出去,置回为0.
if success != 1:#进阶这里不用判断
maze[i][j] = 0
return success
class Solution {
public boolean exist(int[][] maze) {
if(dfs(maze,0,0))
return true;
return false;
}
public boolean dfs(int[][] maze, int i, int j) {
if(i<0||j<0||i>=maze.length||j>=maze[0].length||maze[i][j] == 1) return false;
if(i == maze.length-1 && j == maze[0].length-1) return true;
board[i][j] = 1;
boolean res = (dfs(maze,i+1,j)||dfs(maze,i-1,j)||dfs(maze,i,j+1)||dfs(maze,i,j-1));
board[i][j] = 0;
return res;
}
}
```

* **统计小岛的最大面积**<a name="统计小岛的最大面积"></a>
Expand Down
23 changes: 14 additions & 9 deletions notes/Java/Java-算法之排序.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,14 +160,14 @@ public static void shellSort(int[]array){
1. 三角形的最大周长:给定一个长度数组,返回三条构成三角形的最大周长。
解题思路:不一定要将数组全部排序,构造大顶堆,边排序边判断两边之和大于第三边即可。
*/
public static void heapadjust(int[]array, int root, int end){
public static void heapAdjust(int[]array, int root, int end){
int leaf = root*2+1;
int temp = array[root];
while(leaf <= end){
//比较两个子节点
if(leaf < end && array[leaf+1] > array[leaf])
leaf += 1;
// 迭代后不是和父节点比较,因为我没有交换,和保存父节点值的tmp比较
// 迭代后不是和父节点比较,因为没有交换,和保存父节点值的tmp比较
if(array[leaf] > temp){
array[root] = array[leaf];//# 将父节点替换成新的子节点的值,这里就完成了转换
root = leaf;//赋坐标,为下一步迭代做好准备,子节点变成父节点
Expand All @@ -182,15 +182,19 @@ public static void heapSort(int[]array){
int length = array.length;
// 创建堆,和下面排序不同的是,我们转换的范围永远是整个数组n-1
for(int not_leaf=length/2-1; not_leaf>=0; not_leaf--)
heapadjust(array, not_leaf, length-1);
heapAdjust(array, not_leaf, length-1);
// 挨个出数,创建堆已经完成了第一次排序
for(int end=length-1; end>=0; end--){
int temp = array[end];
array[end] = array[0];
array[0] = temp;
heapadjust(array, 0, end-1);
heapAdjust(array, 0, end-1);
}
}

/*
这个题很简单,排序、堆、quickselect,都可以做,面试的时候问了一道第k大,和这个题没啥区别的,我直接喷快选了,毕竟O(n),然后一面就挂了。因为做题时候没好好沟通,面试经验太欠缺了!
*/
```

<a name="归并排序"></a>
Expand Down Expand Up @@ -294,6 +298,7 @@ while(l >= left && r > mid){
基本思想:选一个数作为中间枢纽,进行列表的划分,递归。
时间复杂度:最差O(n2),最好O(nlogn),平均O(nlogn) -由分区的好坏决定。
空间复杂度:O(n),主要为递归造成的空间栈的使用
题目:可以考察最快找出小于等于某个值的所有数。
*/
public static int partition(int[] array, int left, int right) {
int key = left;
Expand All @@ -312,11 +317,11 @@ public static int partition(int[] array, int left, int right) {
return left;
}
public static void quickSort(int[] array, int left, int right) {
if(left >= right)
return;
int mid = partition(array, left, right);
quickSort(array, left, mid-1);
quickSort(array, mid+1, right);
if(left < right){
int mid = partition(array, left, right);
quickSort(array, left, mid-1);
quickSort(array, mid+1, right);
}
}
public static void main(String[] args) {
int[] array = {1,9,2,8,3,7};
Expand Down
3 changes: 2 additions & 1 deletion notes/计算机网络/计算机网络-传输层.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@

* **问:TCP 四次挥手释放连接?**
* ****:其实如果理解了上面的三次握手,那么你可以把四次挥手理解为,建立连接时三次握手是一起建立的,你连接我,同时我也连接你了。但是断开不同了,因为可以不同时间,即如果我把数据先发完了,那么我就先断开了,我不能发,但是我能接受哇,你可以继续发,当你发完再结束。因此大致过程是:客户端[FIN=1客户端没数据了,我不发了,seq=x最后的数据],服务器端[ACK=1好的,ack=x+1真的木有数据了么,再来点呗,seq=y这是我的数据] 当服务器结束时:服务器[FIN=1好的吧,我也结束了,seq=w最后的数据,ACK=1知道你不发了,回我一下呗,ack=x+1给我发这个] 客户端[ACK=1好的,ack=w+1真没数据了?,seq=x+1给你]
TCP连接必须经过2MSL后才真正释放。

****

Expand Down Expand Up @@ -120,7 +121,7 @@
* ****:封装时包头信息不一样,任意帧在网络上可以区分出是 UDP 包还是 TCP 包,所以即使IP 地址和端口相同,也不会导致冲突。

****

* **问:可以用哪个命令来查看 TCP 和 UDP 连接状态??**
* ****
**netstat**: 命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作。 使用时如果不带参数,netstat 显示活动的 TCP 连接。
Expand Down
4 changes: 2 additions & 2 deletions notes/计算机网络/计算机网络-基础概念.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
* **应用层:(用户对用户)**
传输单位:应该是 doc、pdf、txt、py、cpp、java 吧哈哈哈
任务:提供系统与用户的接口
功能:文件传输、电子邮件服务
协议:FTP、SMTP、POP3、HTTP
功能:文件传输、电子邮件服务、远程登录协议
协议:FTP、SMTP、POP3、Telnet、HTTP

* **传输层:(应用对应用,进程对进程)**
传输单位:报文段(TCP)或用户数据报(UDP)
Expand Down
5 changes: 4 additions & 1 deletion notes/计算机网络/计算机网络-应用层.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

* **问:FTP(File Transfer Protocol 文件传输协议)和 TFTP(Trivial File Transfer Protocol 普通文件传输协议)?**
* ****:FTP 文件传输协议,是因特网上使用最广泛的传送协议。使用 TCP 连接,端口号 21,20。在传输文件时需建立 2 个 TCP 连接,21 号端口 控制连接 用于进行命令控制, 20 号端口 数据连接 进行真正的数据传送。先建立 控制连接,当需要传送数据时建立 数据连接,数据传输完成 关闭数据连接,控制连接只有等到关闭命令时才会关闭,不是一起关闭的,也不是一起建立的。
**TFTP**:使用的是 UDP 协议,对于每一个数据报在获得确认后才发送另一个数据报,灵活,使用资源少,流量控制较简单,是一种平等的传输协议。
**TFTP**:使用的是 UDP 协议,对于每一个数据报在获得确认后才发送另一个数据报,灵活,使用资源少,流量控制较简单,是一种平等的传输协议。
区别:使用协议不同,端口号不同,FTP 在速度方面没有 TFTP 快但是 FTP 安全性好。

****
Expand Down Expand Up @@ -77,10 +77,13 @@ HTTPS 会明显比 HTTP 协议慢很多:HTTPS 比 HTTP 更慢,因为多了
403: 服务器已经理解请求,但是拒绝执行它。-无权限。
404: 未找到,服务器找不到所请求的网页。
500:内部服务器错误
502:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
504:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。
505: 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本。-服务端错误。

**练习**:A,B 两台机器都正常工作,B 机器未监听任何端口。如果 A 机器向 B 机器 80 端口发送 SYN 包,会收到何种类型的回包?
****:因为 B 机器未监听任何端口,A 又向 B 的 80 端口发送了数据包,所以 B 不会建立连接,会异常结束建立连接,会发送 RST 包,如果是正常结束的话就会发送 FIN 包, RST 是 TCP 连接中 出现差错产生的,RST 置 1可以用来拒绝一个非法的报文段或拒绝打开一个连接。**RST 是 TCP 报文段首部里的字段,还有其他一些很容易忘的字段。**

****

* **问:GET 和 POST的区别?**
Expand Down
Loading

0 comments on commit 54af3ae

Please sign in to comment.