zoukankan      html  css  js  c++  java
  • java web项目通常采用的技术概述

    序:

      网站的架构一般来说,分为前端和后端。前端负责页面的展示,后端则是业务逻辑的实现。由于HTML5的兴起,前端领域发展极快,在经典的java web的开发模式中,我们使用JSP技术作为展现层的实现,其实就是前端。除了JSP,还要懂得HTML,CSS,JS,AJAX等前端的基础知识。JSP在其中扮演外层包装的角色。后端是由一些实现了业务逻辑的java代码和数据库组成,说到这,就可以推出web开发中经典的MVC模式:model-view-controller。view就是表现层,model是用来承载数据的抽象结构,而controller则是view和model的桥梁。view存在于前端代码中,controller和model存在于后端代码中,

      在后端代码中,为了保证代码的整洁,易读性,一般会采用分层。自顶向下分别为controller层,service层,dao层,数据层或者叫持久层(直接与数据库打交道)。有时候为了达到解耦的目的,会在上述基层中间加入响应的接口层,。在更加大型的网站,会在dao层和数据层之间出现缓存层。或者访问压力增大后,需使用集群,负载均衡等高级技术。

      综上,一个web项目前端需要表现层,后端有controller层,service层,dao层,持久层。在表现层,除了提到的HTML,css,js,jsp,ajax等基础知识,还会用到许多框架,比如tiles,velocity,freemaker等模板。在持久层,除了jdbc,还有mybatis,hibernate等框架。在java web中最耀眼的当属spring,spring作为一个贯穿始终的框架,为项目开发带来依赖注入,面向切面编程等功能,除了这些还要掌握一种关系型数据库,如MySQL Oracle等,能掌握非关系型数据库更好 如Redis mongodb等。

      掌握了上述知识点,恭喜你,你已经可以开始写java web项目了。但是只会写而不会部署,我们的项目仍然不能拿出来用。需要一个容器来运行我们的代码。这里所说的容器不是java里的数据类型,而是指应用服务器,此处要区分应用服务器和web服务器。目前比较流行的应用服务器有Tomcat等,常用的web服务器有Nginx,Apache等。

    java web技能树:

    大后台:

    web后台属于后台,但后台的范围非常广泛。两者是包含关系,从网络协议的角度来看,web后台更多关注的是http,而C++后台关注的是tcp协议。

    web后台可以看作是一个大后台最靠前的东西,它解析了HTTP请求,然后可能层层转发给了后面整个分布式系统的许多组件,然后调用他们的服务。公司内部服务器主机之间绝大部分是通过TCP来通信额。具体来说C++后台关注的是socket,也就是网络编程,还有并发的知识(当然了C++也可以做web后台的:CGI 逃)。因为大公司的server一般都是Linux,所以应聘C++后台,一定要会Linux,这里的会Linux操作大致分为两类:一类是Linux基本操作,包括常用Linux命令和工具的使用、shell脚本的编写,能通过脚本完成一些日常任务。另一类才是重点——Linux环境编程,你需要对Linux/Unix环境下各种环境编程的API要熟悉(POSIX那些函数,当然ANSI标准库的函数也要熟)。经常考察的就是IO、各类IPC的操作方式、socket通信的流程、select/poll/epoll 等IO多路复用模型。socket和IO多路复用是网络编程的重点。    题主还问操作系统一般问什么,这些东西就是一般和操作系统杂糅到一起的,学习Linux环境编程绝对不仅仅是记忆几个函数接口那么简单,因为大多数是系统调用,参与内核操作的,所以需要了解其中的原理,而其中的原理就是操作系统的概念了,比如上面我说的IPC,就可以扯出fork函数,进而面试官就可以问题进程的其他东西,然后和线程做过比较之类的,线程又可以牵扯出同步、互斥锁等概念,怎么样是不是想起操作系统课本了。还没完。其实面试制胜的关键并不是面试官会问你什么,而是你能主动给输出什么。面试不是做选择题,判断题。换句话说:要学会举一反三。比如他不问你Linux环境编程,他问了你一个malloc、new区别之类的东西,这个问题很好答,说完之后呢,你可以主动输出一些更深入的东西,通过它们的区别来深入谈论操作系统的内存管理,比如边界对齐,还有这块内存的首部或尾部包含其他信息等等。具体可以阅读CSAPP内存管理的章节,此外了解一下C++的placement new可以帮助你对malloc和new的区别有更深的了解,从而更好的回答这类问题。C/C++语言的一大特点就是,语言不仅仅是语言,你总能和操作系统扯上一腿。   另外无论是哪种后台,数据库是必然逃不开的。你肯定要对数据库有了解。不仅仅是SQL,还要懂一些优化,了解主键的原理(B树/B+树啊)。MySQL的话,了解一下引擎的知识吧。数据结构、算法等内容也是必考,不过那不只针对C++后台开发,这里就不过多介绍了。     如果你想知道C++怎么写web后台的话,那么了解一下CGI。HTTP协议的内容也是知道比不知道要好。起码知道个get/post,cookie/session之类的。。

    参考书籍:《C++ primer》,《effective C++》,《STL源码解析》,《深度搜索C++对象模型》

    1. C++多态的实现?
    2. 虚函数的作用?
    3. 虚函数用于实现多态,这点大家都能答上来但是虚函数在设计上还具有封装和抽象的作用。比如抽象工厂模式。
    4. 动态绑定是如何实现的?
    5. 静态多态和动态多态。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。
    6. 虚函数表
    7. 虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的?
    8. 编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。
    1. 构造函数中计数初始化为1;
    2. 拷贝构造函数中计数值加1;
    3. 赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一;
    4. 析构函数中引用计数减一;
    5. 在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。
    6. share_prt与weak_ptr的区别?
    • C++四种类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast
    • 内存对齐的原则
    • 内联函数有什么优点?内联函数与宏定义的区别?
    • C++内存管理
    • STL里的内存池实现
    • STL里set和map是基于什么实现的。红黑树的特点?
    • STL里的其他数据结构和算法实现也要清楚
      这个问题,把STL源码剖析好好看看,不仅面试不慌,自己对STL的使用也会上升一个层次。
    • 必须在构造函数初始化式里进行初始化的数据成员有哪些
    • 模板特化
    • 定位内存泄露
      (1)在windows平台下通过CRT中的库函数进行检测;
      (2)在可能泄漏的调用前后生成块的快照,比较前后的状态,定位泄漏的位置
      (3)Linux下通过工具valgrind检测
    • 手写strcpy,memcpy,strcat,strcmp等函数

    数据结构与算法

    这一块考察范围太广,主要靠多刷题吧,牛客网,剑指OFFER,LeetCode等。

    Hash表

    • Hash表实现(拉链和分散地址)
    • Hash策略常见的有哪些?
    • STL中hash_map扩容发生什么?
      (1) 创建一个新桶,该桶是原来桶两倍大最接近的质数(判断n是不是质数的方法:用n除2到sqrt(n)范围内的数) ;
      (2) 将原来桶里的数通过指针的转换,插入到新桶中(注意STL这里做的很精细,没有直接将数据从旧桶遍历拷贝数据插入到新桶,而是通过指针转换)
      (3) 通过swap函数将新桶和旧桶交换,销毁新桶。

    链表

    • 链表和插入和删除,单向和双向链表都要会
    • 链表的问题考虑多个指针和递归
      (1) 反向打印链表(递归)
      (2) 打印倒数第K个节点(前后指针)
      (3) 链表是否有环(快慢指针)等等。

    栈和队列

    • 队列和栈的区别?(从实现,应用,自身特点多个方面来阐述,不要只说一个先入先出,先入后出,这个你会别人也会,要展现出你比别人掌握的更深)
    • 典型的应用场景

    海量数据问题

    • 十亿整数(随机生成,可重复)中前K最大的数
    • 十亿整数(随机生成,可重复)中出现频率最高的一千个

    排序算法

    • 排序算法当然是基础内容了,必须至少能快速写出,快排,建堆,和归并
    • 每种算法的时间空间复杂度,最好最差平均情况

    位运算

    布隆过滤器

    几十亿个数经常要查找某一个数在不在里面,使用布隆过滤器,布隆过滤器的原理。布隆过滤器可能出现误判,怎么保证无误差?

    网络与TCP/IP

    参考书籍:《图解TCP/IP》,《TCP/IP详解 卷一》,《图解HTTP》,《HTTP权威指南》

    1. TCP重发机制,Nagle算法
    2. TCP的拥塞控制使用的算法和具体过程
    3. TCP的窗口滑动

    HTTP

    • http/https 1.0、1.1、2.0的特点和区别
    • get/post 区别
    • HTTP返回状态码
    • http 协议头相关

    http数据由请求行,首部字段,空行,报文主体四个部分组成
    首部字段分为:通用首部字段,请求首部字段,响应首部字段,实体首部字段

    • https与http的区别?如何实现加密传输?加解密方式?
    • 浏览器中输入一个URL发生什么,用到哪些协议?

    安全相关

    至少了解攻击的原理和基本的防御方法,常见的攻击方法有一下几种

    • SQL注入
    • XSS
    • CSRF
    • SYN洪水攻击
    • APR欺骗

    数据库

    主要参考书籍:《数据库系统概念》,《高性能MySQL》

    • SQL语言(内外连接,子查询,分组,聚集,嵌套,逻辑)
    • MySQL索引方法?索引的优化?
    • InnoDB与MyISAM区别?
    • 事务的ACID
    • 事务的四个隔离级别
    • 查询优化(从索引上优化,从SQL语言上优化)
    • B-与B+树区别?
    • MySQL的联合索引(又称多列索引)是什么?生效的条件?
    • 分库分表

    Linux

    主要参考书籍:《现代操作系统》,《APUE》,《UNP》,《LINUX内核设计与实现》,《深入理解LINUX内核》

    (1) 进程与线程区别?
    (2) 线程比进程具有哪些优势?
    (3) 什么时候用多进程?什么时候用多线程?
    (4) LINUX中进程和线程使用的几个函数?
    (5) 线程同步?
    在Windows下线程同步的方式有:互斥量,信号量,事件,关键代码段
    在Linux下线程同步的方式有:互斥锁,自旋锁,读写锁,屏障(并发完成同一项任务时,屏障的作用特别好使) 知道这些锁之间的区别,使用场景?

    1. 匿名管道与命名管道的区别:匿名管道只能在具有公共祖先的两个进程间使用。
    2. 共享文件映射mmap
      mmap建立进程空间到文件的映射,在建立的时候并不直接将文件拷贝到物理内存,同样采用缺页终端。mmap映射一个具体的文件可以实现任意进程间共享内存,映射一个匿名文件,可以实现父子进程间共享内存。
    3. 常见的信号有哪些?:SIGINT,SIGKILL(不能被捕获),SIGTERM(可以被捕获),SIGSEGV,SIGCHLD,SIGALRM
    1. 虚拟内存的作用?
    2. 虚拟内存的实现?
    3. 操作系统层面对内存的管理?
    4. 内存池的作用?STL里内存池如何实现
    5. 进程空间和内核空间对内存的管理不同?
    6. Linux的slab层,VAM?
    7. 伙伴算法
    8. 高端内存
    • 进程调度
    1. Linux进程分为两种,实时进程和非实时进程;
    2. 优先级分为静态优先级和动态优先级,优先级的范围;
    3. 调度策略
    4. 交互进程通过平均睡眠时间而被奖励;

    (1) 死锁产生的条件;
    (2) 死锁的避免;

    • 命令行
    1. Linux命令 在一个文件中,倒序打印第二行前100个大写字母
    cat filename | head -n 2 | tail -n 1 | grep '[[:upper:]]' -o | tr -d '
    '| cut -c 1-100 | rev 
    
    1. 与CPU,内存,磁盘相关的命令(top,free, df, fdisk)
    2. 网络相关的命令netstat,tcpdump等
    3. sed, awk, grep三个超强大的命名,分别用与格式化修改,统计,和正则查找
    4. ipcs和ipcrm命令
    5. 查找当前目录以及字母下以.c结尾的文件,且文件中包含”hello world”的文件的路径
    6. 创建定时任务
    • IO模型
    1. 五种IO模型:阻塞IO,非阻塞IO,IO复用,信号驱动式IO,异步IO
    2. select,poll,epoll的区别
    • 线程池,内存池 自己动手实现一遍

    Linux的API

    • fork与vfork区别
      fork和vfork都用于创建子进程。但是vfork创建子进程后,父进程阻塞,直到子进程调用exit()或者excle()。
      对于内核中过程fork通过调用clone函数,然后clone函数调用do_fork()。do_fork()中调用copy_process()函数先复制task_struct结构体,然后复制其他关于内存,文件,寄存器等信息。fork采用写时拷贝技术,因此子进程和父进程的页表指向相同的页框。但是vfork不需要拷贝页表,因为父进程会一直阻塞,直接使用父进程页表。
    • exit()与_exit()区别
      exit()清理后进入内核,_exit()直接陷入内核。
    • 孤儿进程与僵死进程
    1. 孤儿进程是怎么产生的?
    2. 僵死进程是怎么产生的?
    3. 僵死进程的危害?
    4. 如何避免僵死进程的产生?
    • Linux是如何避免内存碎片的
    1. 伙伴算法,用于管理物理内存,避免内存碎片;
    2. 高速缓存Slab层用于管理内核分配内存,避免碎片。
    • 共享内存的实现原理?
    • 系统调用与库函数(open, close, create, lseek, write, read)
    • 同步方法有哪些?
    1. 互斥锁,自旋锁,信号量,读写锁,屏障
    2. 互斥锁与自旋锁的区别:互斥锁得不到资源的时候阻塞,不占用cpu资源。自旋锁得不到资源的时候,不停的查询,而然占用cpu资源。
    3. 死锁

    其他

    • ++i是否是原子操作
      明显不是,++i主要有三个步骤,把数据从内存放在寄存器上,在寄存器上进行自增,把数据从寄存器拷贝会内存,每个步骤都可能被中断。
    • 判断大小端

    设计模式

    分布式系统

     

    code everywhere everytime!
  • 相关阅读:
    随便写的,关于外部提交按钮
    thinkPHP--empey标签
    ramdajs库应用场景
    数组常用用法--map,filter,reduce
    接口签名
    四种常见的 POST 提交数据方式
    localhost、127.0.0.1和0.0.0.0和本机IP的区别
    ftp与sftp
    本地已有项目上传git
    github和gitlab比较
  • 原文地址:https://www.cnblogs.com/vcyy/p/7833110.html
Copyright © 2011-2022 走看看