准备工作
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服务器
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
7、安装 idea
安装 ideaIU-15.0.6.exe 配置jdk
配置maven
配置 tomcat
打包后的文件会放到D:\apache-tomcat-7.0.75\webapps\ROOT
配置mysql
8、 ftp
新版本的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
配置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语句
整个项目接口调试:
可以用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文件
可以把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工具的对应使用
groupId ArtifactId Version
GroupId 是项目组织的唯一标识符,在实际开发中对应JAVA的包的结构,就是main目录里java的目录结构,如 ‘com.itcast’。
ArtifactId是项目的唯一标识符,在实际开发中一般对应项目的名称,就是项目根目录的名称,例:GradleDemo。
Version 是项目的版本号,例:1.0-SNAPSHOT 。其中1.0是版本号,SNAPSHOT版本代表不稳定、尚处于开发中的快照版本,迭代过程中出现的小版本不用到生产版本。而衍生的有Release版本则代表稳定的版本。current 当前版本 GA稳定版本。pre 预发布版本 尝鲜版本
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作为例子来演示。
我们都知道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语言的通性
java 、js 、nodejs 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)、大型项目不是一蹴而就的,都是循序渐进搭建而成的
集群
(13)、大数据
实时数据库,项目一直在用的数据库,用户的增删改(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的框架最核心的设计就是:HDFS和MapReduce。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)。