我的第一个java应用杂记

328 阅读28分钟

准备工作

1、安装jdk

windows

jdk-7u80-windows-x64.exe 一路安装到底 这里我安装到 D:\Java\jdk1.7.0_80
jre安装地址D:\Java\jre7

配置环境变量

JAVA_HOME = D:\Java\jdk1.7.0_80  
CLASS_PATH = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;  
path里添加 %JAVA_HOME%\bin

重新打开cmd 输入java javac验证安装是否成功

2、安装tomcat

直接把windows_apache-tomcat-7.0.75安装包放到D:\apache-tomcat-7.0.75 D:\apache-tomcat-7.0.75\conf\server.xml 里修改端口号

  <Connector port="8085" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

开启: 到D:\apache-tomcat-7.0.75\bin 直接双击startup.bat 关闭双击 shutdown.bat 或者用cmd 进入到D:\apache-tomcat-7.0.75\bin 执行startup.bat

tomact监听某个端口如8085如果访问localhost:8085 会直接找到默认index.html文件返回文件内容

如果访问localhost:8085/user 会找到服务端user路由对应的处理逻辑代码执行返回结果

3、安装maven

直接把apache-maven-3.0.5放到D:\apache-maven-3.0.5 8085 maven 配置文件可以配置 用户名密码 私服地址
中央仓库mvnrepository.com/

 mvn --version

4、安装nginx

直接把nginx-1.10.2 放到 D:\nginx-1.10.2 8086

nginx 做 端口转发 目录转发 访问静态图片或前端资源

在nginx目录下打开cmd窗口

(1)start nginx 开启nginx服务

(2)nginx.exe -s stop 关闭nginx服务,快速停止nginx,可能并不保存相关信息

(3)nginx.exe -s quit 关闭nginx服务,完整有序的停止nginx,并保存相关信息

(4)nginx.exe -s reload 重载nginx服务,当你改变了nginx配置信息并需要重新载入这些配置时可以使用此命令重载nginx

(5) 使用 taskkill /F /IM nginx.exe > nul命令强关nginx服务器

image.mahong.com:8086/

autoindex on;

root代表把域名转发到一个资源目录上,将资源映射到一个文件夹后,autoindex代表自动创建索引,如果为on,那么文件夹下所有的文件就会自动创建,就是类似字典的目录,如果置成off,目录会关闭,nginx就会给予一个 403 Forbidden,即无权限。但是对于里面的资源是不受影响的

前端资源 autoindex off

server {
    listen 8082;
    server_name dac-test.lianlianpay-inc.com;  还可以再配置一个域名,也监听8082,但root不一样
    root /home/nginx/dac-web;
    index index.html;
}
server {
    listen 8087;
    root /home/nginx/dam-frontend;
    index index.html;
}

5、mysql

安装mysql-5.1.73-win32.msi到从c盘,如果安装到D盘一直有问题可以尝试安装到c盘 或者用解压缩版直接放到 D:\mysql-8.0.13-winx64 blog.csdn.net/zqj1113333/… blog.csdn.net/ychgyyn/art…

6、安装mysql客户端DBeaver

blog.csdn.net/sishi22/art…

7、安装 idea

安装 ideaIU-15.0.6.exe 配置jdk

CHucdXqv5Z.jpg 配置maven

image.png 配置 tomcat

image.png

OY0Wqdywlw.jpg 打包后的文件会放到D:\apache-tomcat-7.0.75\webapps\ROOT

配置mysql

image.png

8、 ftp

UgrgVXjBcw.jpg

image.png

新版本的Chrome彻底放弃ftp协议了 ,之前可以在搜索栏搜索chrome://flags/ 并将Enable support for ftp Urls设置为Enabled才能访问ftp。但是在Chrome96中直接将修改选项剔除了,这代表在最新版本的chrome中无法通过任何手段访问ftp。 无法打开ftp://10.20.70.72/img/2015cb04-e4cf-4a5e-8c4c-986efd539bc1.jpg 如果想打开可以下载老的chrome或者用ie打开

创建第一个Java webapp

8fFvmeff28.jpg

NRWTHUhqZM.jpg

zq7o7gcVjt.jpg

配置tomacat服务

配置mysql-connector-java

springBoot

spring项目脚手架。可以使用idea的选项直接用springboot创建项目。找到main/java/projectNmae/application文件

// 在这个文件中点击右键执行 就可以启动tomcat 类似于npm自动启动nodejs http-server服务器
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

也可以创建一个空的项目 在pom文件里写springboot的依赖 安装springboot包, 然后把上面的启动文件拷贝过来

springboot使用内置的tomcat

修改tomcat端口号 resource下 创建application.yml springboot配置文件

server:
  port: 8081

代码编写与调试

代码目录结构

main

java

    com.mmall

        common // 公共的东西比如 Const ServerResponse

        controller // controller/portal文件夹下都是客户商城请求处理代码 controller/end都是后台系统请求处理代码   
        //它会调用service里的方法 。controller里判断用户是否登录 是否有权限 
        //然后调用service做业务逻辑处理 参数传入是否正确判断 商品的增删改查放到service里  
        //service里调用dao里的mapper,mapper调用resource/mappers里的sql语句


        service // 每个方法的具体实现 会调用 mybatis dao

        dao // 数据库 每张表的业务 方法的声明  (mybatis读取数据中的表自动生成基础的dao mappers pojo下的文件,我们后续根据需要在这些基础代码上增加功能代码)
        // 如 interface UserMapper user对象的一些数据库操作方法的接口 
        // List<Product> selectListByNameAndId(@Param("productName")String productName, @Param("productId")Integer productId); 多个参数要写@Param("productName")

        pojo // 每张表自带的字段类型 方法等 如User类 个表中存的对象的属性定义在pojo里,这里还有这些属性的设置和读取方法 
        
        vo // 给前端的数据标准 类似pojo

        util // 公用方法 比如 MD5
 resource
     mappers // xml 操作数据库的sql语句

整个项目接口调试:

image.png 可以用idea按钮run 来编译代码放到tomcat服务器并启动tomcat服务器 可以用idea按钮debug 结合在代码那一行打断点 来进行debug,只能debug到java代码不能debug到操作数据库的xml文件

局部代码调试: 在文件中写运行入口函数,然后右键菜单选择 run 或 debug

public static void main(String[] args) {
    
}

java里创建package就是创建一个文件夹

代码编译部署

可以用idea上集成的按钮 build Artifact 也可以用命令行 mvn clean install compile package等 编译后的文件在target下面,war包是压缩包,解压后是红框里的文件class文件

java1.png

YPKQN22VmM.jpg

可以把war包放到tomcat服务器上解压,启动服务器后运行

部署脚本

echo "===========进入git项目happymmall目录============="\
cd /developer/git-repository/mmall\
echo "==========git切换分之到mmall-v1.0==============="\
git checkout mmall-v1.0\
echo "==================git fetch======================"\
git fetch\
echo "==================git pull======================"\
git pull\
echo "===========编译并跳过单元测试===================="\
mvn clean package -Dmaven.test.skip=true\
echo "============删除旧的ROOT.war==================="\
rm /developer/apache-tomcat-7.0.73/webapps/ROOT.war\
echo "======拷贝编译出来的war包到tomcat下-ROOT.war======="\
cp /developer/git-repository/mmall/target/mmall.war /developer/apache-tomcat-7.0.73/webapps/ROOT.war\
echo "============删除tomcat下旧的ROOT文件夹============="\
rm -rf /developer/apache-tomcat-7.0.73/webapps/ROOT\
echo "====================关闭tomcat====================="\
/developer/apache-tomcat-7.0.73/bin/shutdown.sh\
echo "================sleep 10s========================="\
for i in {1..10}\
do\
    echo $i"s"\
    sleep 1s\
done\
echo "====================启动tomcat====================="\
/developer/apache-tomcat-7.0.73/bin/startup.sh

一台服务器可以配置多个tomcat服务 每个tomcat一个配置文件一个进程监听一个端口号 互相隔离 然后在nginx服务器上配置把请求分发到多个服务器

线上环境一般是linux环境 要在这个linux环境安装jdk maven mysql tomcat nginx git等 用git 拉取最新代码 然后编译 最后部署到tomcat上 配置nginx域名转发 启动各个服务器 还要注意防火墙的配置可以开启和关闭某些端口 不让外部访问

域名和服务器(带外网ip)、https证书都要购买

阿里云服务器要备案 登录云服务器 ssh root@112.126.73.177 创建新用户并且赋予一定的权限

申请的域名和服务器公网ip和绑定,域名可以经常更换绑定的ip地址

申请的域名 mmall.com 下可以有很多二级域名  多个二级域名可以指向同一ip地址
主机记录 二级域名 x       x.mmall.com

记录值 服务器公网ip地址 nginx配置对servername进行判断服务转发

向服务器上传购买的证书信息,在nginx中配置https证书,浏览器会识别服务器发过来的证书是否合法,如果合法可以继续访问网站,否则不可访问提示网站有风险

nginx 配置

nginx.conf

user nobody; 
worker_processes 1; 
events { worker_connections 1024; } 
http { 
  include mime.types; 
  default_type application/octet-stream; 
  location / {
     root html; 
     index index.html index.htm; 
     } 
  location = /50x.html { root html; } 
  include vhost/*.conf; // 各个模块的nginx配置
} 

vhost/happymmall.com.conf

server { 
  listen 80; // 监听端口
  autoindex on; 
  server_name happymmall.com www.happymmall.com; // 监听地址
  access_log /usr/local/nginx/logs/access.log combined; 
  index index.html index.htm index.jsp index.php; 
  if ( $query_string ~* ".*[\;'\<\>].*" ){ 
    return 404; 
  } 
  location = / { //请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
    root /product/front/mmall_fe/dist/view;  // 根目录
    index index.html;  // 设置默认页
  } 
  location ~ .*\.html$ {
    root /product/front/mmall_fe/dist/view; 
    index index.html; 
  } 
  location / { 
    proxy_pass http://127.0.0.1:8080/; 
  } 
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ { 
    proxy_pass http://127.0.0.1:8080;  // 请求转向http://127.0.0.1:8080 定义的服务器列表 
    // 可以是图片服务器、静态资源服务器、后端服务器等 比如http://127.0.0.1:8080是部署在tomcat上的后端服务
    expires 30d; 
  } 
  location ~ .*\.(js|css)?$ { 
    proxy_pass http://127.0.0.1:8080; 
    expires 7d; 
  } 
}

vhost/img.happymmall.com.conf

访问img.happymmall.com时根据dns解析定位到这台服务器上,到这台服务器上后发现80端口号是nginx在监听,于是把请求给nginx,nginx会到server_name对应的location下找东西

server { 
  listen 80; 
  autoindex off; 
  server_name img.happymmall.com; 
  access_log /usr/local/nginx/logs/access.log combined; 
  index index.html index.htm index.jsp index.php; 
  #error_page 404 /404.html; 
  if ( $query_string ~* ".*[\;'\<\>].*" ){ return 404; } 
  location ~ /(mmall_fe|mmall_admin_fe)/dist/view/* { deny all; //拒绝} 
  location / { 
    root /product/ftpfile/img/;//存图片的地方
    add_header Access-Control-Allow-Origin *; 
   } 
 }

常用linux命令

wget http://xxxxx // 下载
tar --zxvf nginx-1.10.2.tar.gz // 解压缩
whereis nginx // 查找

RESTFul

resource Representational State Transfer

resource 资源 URI 位置

Representational 资源的呈现形式

State Transfer 状态转化 所有的状态都存在服务器

客户端只能用到http协议 无状态 所有状态的服务端

用浏览器url地址只能是get请求,发送post请求需要借助工具。客户端可以用postman /talend api 等工具发送http请求 post请求内容格式 format/ json

// json 请求content-type application/json
@RequestMapping(value="json.do",method = RequestMethod.POST)  //method不写是所有请求方式都行
@ResponseBody  // 返回值放到body里
public ServerResponse<String> getJSON(@RequestBody User user) {
  // @RequestBody注解 从请求body里读取json参数 如果不写请求要用formdata
}

注意发送http工具的对应使用 R0RPTiBQFm.jpg

groupId ArtifactId Version

GroupId 是项目组织的唯一标识符,在实际开发中对应JAVA的包的结构,就是main目录里java的目录结构,如 ‘com.itcast’。

ArtifactId是项目的唯一标识符,在实际开发中一般对应项目的名称,就是项目根目录的名称,例:GradleDemo。

Version 是项目的版本号,例:1.0-SNAPSHOT 。其中1.0是版本号,SNAPSHOT版本代表不稳定、尚处于开发中的快照版本,迭代过程中出现的小版本不用到生产版本。而衍生的有Release版本则代表稳定的版本。current 当前版本 GA稳定版本。pre 预发布版本 尝鲜版本

1658480310738.png

jar包和war包

1、war是一个web模块,其中必须包括WEB-INF,是可以直接运行的web项目。

jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运行的。

2、javaSE程序是可以打包成jar包(J可以理解为java)。而javaWeb程序是可以打包成war包(W可以理解为web),然后把war发布到tomcat的webapps下目录下,tomcat在启动时会自动解压war包。

3、jar(JavaArchive,Java归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为J2EE应用程序创建的jar文件是ear文件(企业级jar文件)。

4、一个WAR文件就是一个web应用程序, 建立WAR文件,就是建立整个web程序(不包括web应用程序层级结构的根目录)压缩起来,指定一个.war扩展名。

5、war文件和jar文件的文件格式是一样的,并且都是使用jar命令来创建,但就其应用来说,war文件和jar文件是有根本区别的。jar文件的目的是把类和相关的资源封装到压缩的归档文件中,而对于war文件来说,一个war文件代表一个web应用程序,它可以包含Servlet、html页面、java类、图像文件,以及组成web应用程序的其他资源,而不仅仅是一个归档文件。 pom:是maven依赖文件,里面都是依赖的jar包的信息 jar:java普通项目打包 war:javaweb项目打包,打包成war包部署到服务器

Java Applet

Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。需要在浏览器中安装个“插件”才能运行才能正常渲染,sun的Applet和微软的ActiveX,Macromedia的Flash差不多都没有发展起来,现在是浏览器和js+html5 发展起来了成为主流

servlet

一个java插件 简单来说servlet是运行在服务器上的java程序,servlet专门用来接收客户端的请求,专门接收客户端的请求数据,然后调用底层service处理数据并生成结果(请求过多servlet处理不了 也会down机 内存不够也会down机)

ervlet由servlet容器管理,servlet容器也叫 servlet引擎,是servlet的运行环境,给发送的请求和响应之上提供网络服务

浏览器http请求------》tomcat服务器-------》到达servlet-----》执行doget/dopost方法----》返回数据

<1>客户端发送请求到服务器端

<2>服务器将请求信息发送至Servlet

<3>Servlet生成响应内容并将其传给服务器。

<4>服务器将响应返回给客户端。

HttpSession

HttpSession是Java平台session机制的实现规范,因为它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以ORACLE的Weblogic Server8.1作为例子来演示。

image.png

我们都知道HTTP是无状态协议,但是为什么session可以跟踪会话状态呢?没错,session依赖Cookie。

当客户端第一次访问服务器时,服务器会为客户端创建一个session对象,然后把session对象放到session池中,在响应时把sessionId通过Cookie响应给客户端。注意,只有在第一次访问时,服务器才会创建session,给客户端响应sessionId。从此以后就不会了!

当客户端再次访问服务器时,会在请求中带着sessionId给服务器,服务器通过sessionId到session池中找到session对象,这就可以完成会话跟踪了。也就是说,服务器端保存的是session对象,而客户端只有sessionId。每次访问都需要通过客户端的sessionId来匹配服务器端的session对象!这样用户在session中保存的数据就可以再次被使用了。

sessionId是服务器通过Cookie发送给客户端浏览器的,这个Cookie的maxAge为-1,即只在浏览器内存中存在。如果你关闭所有浏览器窗口,那么这个Cookie就会消失了!

两种方式 cookie--session,token--session做保持状态都行

登录请求后request中有cookie 这是后端以cookie的形式把sessionId给请求者,以后每次请求都会带着这个cookie
cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcmVUb2tlbiI6IjgwMjYxNiIsIm5iZiI6MTY2MDg4OTQwNCwiYXBwSWQiOiIxMDcwIiwiaXNzIjoiaWRzLmxpYW5saWFucGF5LmNvbSIsInJlcXVlc3RJcCI6IjEwLjIwLjcwLjcyIiwiZXhwIjoxNjYwOTI1NDA0LCJhdXRoVHlwZSI6IjEiLCJ0b2tlblR5cGUiOiIxIiwiaWF0IjoxNjYwODg5NDA0LCJ1c2VyYWNjb3VudCI6Im1haG9uZyJ9.VE7RE7lgrsobiMgGleG62SmseyhZjwWXfkZxVG9fK1w; JSESSIONID=4319BE0A048344334A3A50973B7A63B9
以上验证登录的方式有弊端 如session存储过多,多服务器,浏览器禁用cookie等
但常用的是token验证登录的方式
ids给的token 是告诉登录者的信息 然后每次请求字系统请求头中都带着这个token去校验权限

cookie和session和token的关系 理解javax.servlet.http.HttpSession

首先,Weblogic Server提供了一系列的参数来控制它的HttpSession的实现,包括使用cookie的开关选项,使用URL重写的开关选项,session持久化的设置,session失效时间的设置,以及针对cookie的各种设置,比如设置cookie的名字、路径、域, cookie的生存时间等。

一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用, Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。

复制严格说来不算持久化保存,因为session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进程中,这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session

cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。

cookie的路径对于web应用程序来说是一个非常重要的选项,Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。

HttpSession类它提供了setAttribute()和getAttribute()方法存储和检索对象。HttpSession提供了一个会话ID关键字,一个参与会话行为的客户端在同一会话的请求中存储和返回它。servlet引擎查找适当的会话对象,并使之对当前请求可用。HttpServletRequest 接口提供了以下方法来获取HttpSession实例。

public HttpSession getSession() :该方法取得请求所在的会话。

public HttpSession getSession(Boolean create):返回当前请求的会话。如果当前请求不属于任何会话,而且create参数为true,则创建一个会话,否则返回null。此后所有来自同一个的请求都属于这个会话,通过它的getSession返回的是当前会话

基本数据类型

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。

因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。 Java 的两大数据类型: 内置数据类型、引用数据类型

内置数据类型

byte(字节) 8位 / short 16位 / int 32位 / long 64位 / float 32位 / double 64位 / boolean 1位 / char 16位

引用类型

  • 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
  • 对象、数组都是引用数据类型。
  • 所有引用类型的默认值都是null。
  • 一个引用变量可以用来引用任何与之兼容的类型。
  • 例子:Site site = new Site("Runoob")。

integer可以为null,int不可以

比特 字节 字 的区别

bit (比特、位) 比特bit是二进制位(Binary digit)的简称,一个二进制包含的信息量成为一比特bit。比特bit是计算机内部数据存储的最小单位。二进制在效率和成本方面的优势为全世界所接受,现在电脑所有的信息都是二进制的,就是0和1组成的。

byte(字节) 8位 字节Byte是计算机数据处理的最小单位,习惯上用大写的B表示,每个字节有8个二进制位,其中最右边的一位为最低位,最左边的一位为最高位,每个二进制位的值不是0就是1。一个字节由8个二进制位组成。也就是1字节Byte等于8比特Bit。这也是计算机设计时规定的。一个字节最大为8个1(11111111)即2的8次方,总共是256种状态

字节与bit位换算:1字节=8bit

字和字节都是计算机的存储单元。字由若干个字节组成,一个字节是8个比特bit。字的位数叫做字长,即cpu一次处理二进制代码的位数。字的长度与计算架构有关,比如32位机,一个字就是32位,换算成字节就是4字节;同样的64位机,一个字就是64位,也就是8字节。字也是计算机一次处理数据的最大单位。

32位计算机:1字=32位=4字节
64位计算机:1字=64位=8字节

字节与字符编码的关系 字符是指计算机中的文字和符号。比如汉字和阿拉伯数字。但在计算机的具体表示中,又有不同的编码,常见有ASCII码、GB2312、GBK,UTF-8编码、Unicode编码。

前因后果

ASCII码:是用一个字节(8bit, 0-255)中的127个字母表示大小写字母,数字和一些符号.主要用来表示现代英语和西欧语言。

所以处理中文就出现问题了,由于汉字的数量远超255个,中文处理至少需要两个字节,所以中国制定了GB2312。一般的汉字使用2个字节,对于一些生僻的汉字则使用更多的字节来表示,当然,GB2313编码是可以兼容ASCII码的

所以,各国制定了各国的标准。日本制定了Shift_JIS,韩国制定了Euc-kr。。。那么,乱码就来了。这时候又出现了一个新的问题。如果一篇文章里面,即有中文,又有日文的话,无论使用中文的编码方法还是使用日文的编码方法都会出现乱码。

为了统一,Unicode诞生了。统一码把所有语言都统一到一套编码里。unicode编码对文字的编码进行了统一,当然,unicode只是一种编码规范,它有多个版本,常用的unicode编码使用了16位来存储字符,16位的存储空间足以容纳世界上所有书面字符(对于汉字来说,一共有6万多个,只能包含其中的一些常用汉字,所以unicode编码对于汉字的兼容性并不是特别好)。unicode编码兼容了ASCII码,ASCII码转unicode编码时,保持后8位不变,前8位只需要用0去补全即可。解决了乱码问题,但是存储和传输效率低下的问题又来了。

因为ASCII编码是1个字节,而Unicode编码通常是2个字节。你表示一个英文字母一个字节就够了,但是Unicode却不得不用两个字节来表示(另一个字节补0)。于是出现了utf-8(8-bit Unicode Transformation Format)目前最常用的编码方式

unicode是静态的,而且是固定长度的,一一对应;utf-8是一套规则,字长是可变的,即对应的字符结果是可变的。为了节约,出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间(ASCII码可以看成是UTF-8的一部分,所以大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作)。使用这种编码的话,一旦文章中同时出现中文、英文或者繁体,浏览器都会支持,而不会出现乱码。

utf-8虽然压缩了存储空间,但是如果在内存中存储,使用utf-8却由于它的长度不固定,带来了很大的不便,使得在内存处理字符变得复杂。应对这个问题的解决策略是:在内存中存储字符时还是使用unicode编码,因为unicode编码的长度固定,处理起来很方便。而在文件的存储中,则使用utf-8编码,可以压缩内存,节省空间。这里一般有个自动转换的机制,即从文件中读取utf-8编码到内存时,会自动转换为unicode编码,而从内存中将字符保存到文件时,则自动转换为utf-8编码

电脑的32位操作系统和64位操作系统区别 我们的电脑是32位还是64位主要是受到电脑cpu、主板硬件决定的,32位的cpu一次处理32位数据,64位的就处理64位数据。简单理解就是64位在性能上远远强于32位。比如32位操作系统最大支持4G内存,如果电脑内存小于4G的话,是不能安装64位操作系统的。现在的软件要求也很高,很多32位的系统也都已经不支持了。

所以在安装操作系统的时候,是选择32位操作系统还是64位操作系统,一定要先看自己的电脑配置。不过现在应该很少人用32位操作系统了。

java nodejs js语言的通性

javajsnodejs nodejs是运行在服务端的js

这些语言相通的地方是都有自己的基础类型、引用类型、函数、类、for、switch、if、map、set等 也有各自特别的东西如js有promise,DOM、BOM操作接口

服务端语言nodejs和java都有网络编程、I/O、连接数据库,nodejs有多进程编程,java有多线程编程。虽然在实际编程中都用框架写好的接口。他们底部有些思想是不一样的比如对并发的处理

代码编写问题

(1)、checkValid return的内容作为返回值return到register函数里,若要作为register的返回值,可以用validResponse承接一下 再把validResponse作为返回值return出去

public ServerResponse<String> register(User user){
         // checkValid return的内容return到register函数里,要validResponse承接一下 再return一下作为register的返回值
        ServerResponse validResponse = this.checkValid(user.getUsername(), Const.USERNAME);
        if(!validResponse.isSuccess()) {
            return validResponse;
        }
    }

    public ServerResponse<String> checkValid(String str, String type) {
        if(org.apache.commons.lang3.StringUtils.isNoneBlank(type)) {
         .......
        }else{
            return ServerResponse.createByErrorMessage("参数错误");
        }
        return ServerResponse.createBySuccessMessage("校验成功");
    }

(2)、List 报错 List does not have type params 引入List的时候用import java.util.List;即可

(3)、mappers中xml文件中sql编写

    --根据需要写 select、insert、delete、update
    --updateByPrimaryKeySelective 根据id覆盖原有内容 如果新数据的某个参数为null不覆盖原有值
    --updateByPrimaryKey 根据id覆盖原有内容 不管新的数据的某个参数是否为null都覆盖原有值
 <select id="selectCategoryChildrenByParentId" resultMap="BaseResultMap" parameterType="int">
--     BaseResultMap 返回list
    select
    <include refid="Base_Column_List"/>
    from mmall_category
    where parent_id = #{parentId}
  </select>

(4)、连接ftp,把图片上传到ftp服务器上 上传文件 先把文件放到内存upload文件下再上传到ftp服务器, 图片以二进制流传到ftp服务器 。通过服务器地址和随机数组合生成图片的地址

ftpClient = new FTPClient();

try {
 ftpClient.connect(ip);
 isSuccess = ftpClient.login(user, pwd);
} catch (IOException e) {
 logger.error("连接FTP服务器异常",e);
}

(5)、关系型数据库mysql的使用

categoryId 商品分类id,

product 商品表 存商品的时候会存它的categoryid,操作也只是在product表中存了这条数据和category表的插入操作无关,以后可以根据categoryId在product表中查商品

sql insert update 要用一个完整的对象去插入或更新

(6)、操作对象属性 获取商品id 要用product.getId(), 设置要用setId() 不能直接操作,save接口传过来的product已经是一个product对象了

(7)、支付流程 支付宝沙箱调试环境即测试环境

支付宝订单 支付宝会存储所有使用它的订单号和支付流水号 方便查询

商家通过调用支付宝的sdk传入订单号、订单信息、商家信息、回调接口地址(www.happymmall.com/order/alipa… 等生成支付流水号和一个url,商家把这个url生成二维码展示给用户

用户扫描二维码支付,支付完成支付宝服务器主动调用商家之前给的回调接口地址(www.happymmall.com/order/alipa… ,通知商家服务器支付完成,商家接口收到信息判断是否合法请求,然后设置订单支付状态

商家(前端)也可以轮询查看订单状态,及时给用户更新订单状态

收费成功,商家账户改变,用户状态改变

(8)、netapp 内网穿透app 可以把私网地址映射成公网地址

(9)、富文本中有图片 可以先把图片上传到服务器得到图片的地址 再把富文本中的文字和图片地址一起保存,再次获取的时候富文本编辑器可以根据图片地址渲染图片 (10)、 del(Integer userId,Integer shippingId){ 有的需要userId有的不需要?? 需要userId 注意横向越权,如果不校验userid 传了别人的shipingId就把别人的给删了

(11)、代码块执行顺序

静态代码块 只执行一次

static { }

普通代码块 {}

构造代码块 public xxxx() {}

(12)、大型项目不是一蹴而就的,都是循序渐进搭建而成的

集群

d327667f72f950d4f196b26622ef1b1.jpg

f816bc8e010b23e7e0ff8bc59ea0c79.jpg (13)、大数据

0887bb12073a1f1584c5f407647a0ca.jpg

53091ad01b22b38d055aedfe1b4af46.jpg

a4b6a2f8790869e5071e00c1459c97b.jpg

8b3a02f4e0348b7c232b61bf63b5687.jpg

057ecc4e606315b2609d9f2aa1004ae.jpg 大数据.png

6e488676c2448652e6a5b07b5a1cb3f.jpg 实时数据库,项目一直在用的数据库,用户的增删改(mysql,oracle)

离线数据库,会从实时数据库中拷贝数据并作分析。数仓就做这个工作(数据存储在Hadoop,用[数据仓库工具hive查询,hive查询语句类似mysql用hive转化成java代码到hadoop中查询,批量查询,)

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFSMapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算 [1] 

HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构存储集群。

hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive十分适合对数据仓库进行统计分析

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大卖点就是它的快速、交互。

数据源: 数据的源头,可以是某个数据库,也可以是json文件,也可以是api取得数据

元数据:数据库表的定义,如字段信息

源数据库:数据库存储的数据 (实时数据库和离线数据库 都有元数据和源数据库)

JDBC: Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。

redis:
1、从类型上来说,mysql是关系型数据库,redis是缓存数据库。2、mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。redis用于存储使用较为频繁的数据到缓存中,读取速度快。3、mysql和redis因为需求的不同,一般都是配合使用。

mysql和redis的数据库类型,mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。

kafka: 实际的业务中例如:把100台服务器的日志文件写到HDFS,这样HDFS很难处理,用kafka在中间收集这个日志处理后,用后者使用会更好

"Broker" Kafka集群包含一个或多个服务器,这种服务器被称为broker [5] 

"Topic" 每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)

"Partition" Partition是物理上的概念,每个Topic包含一个或多个Partition.

"Producer" 负责发布消息到Kafka broker

"Consumer" 消息消费者,向Kafka broker读取消息的客户端。

"Consumer Group" 每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。