javaee面试题


考点范围

1. http常见的状态码以及这些状态码的意义

2开头:(请求成功)表示成功处理了请求的状态代码

  • 200:(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
  • 201:(已创建)请求成功并且服务器创建了新的资源
  • 202:(已接受)服务器已接受请求,但尚未处理
  • 203:(非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一资源。
  • 204:(无内容)服务器成功处理了请求,但没有返回任何内容
  • 205:(重置内容)服务器成功处理了请求,但没有返回任何内容
  • 206:(部分内容)服务器成功处理了部分 GET 请求

3开头:(请求被重定向)表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向

  • 300:(多种选择)针对请求,服务器可执行多种操作。服务器可根据请求者(user agent)选择一项操作,或提供操作列表供请求者选择
  • 301:(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新的位置
  • 302:(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
  • 303:(查看其他位置)请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
  • 304:(未修改)自从上次请求后,请求的网页未修改过。服务器返回此响应,不会返回网页内容
  • 305:(使用代理)请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理
  • 307:(临时重定向)服务器目前从不同位置的网页响应请求,但请求者继续使用原有位置来进行以后的请求

4开头:(请求错误)这些状态码表示请求可能出错,妨碍了服务器的处理

  • 400:(错误请求)服务器不理解请求的语法
  • 401:(未授权)请求要求身份验证。对于需要登录的网页,服务器可能返回此响应
  • 403:(禁止)服务器拒绝请求
  • 404:(未找到)服务器找不到请求的网页
  • 405:(方法禁用)禁用请求中指定的方法
  • 406:(不接受)无法使用请求的内容特性响应请求的网页
  • 407:(需要代理授权)此状态代码与 401 (未授权)类似,但指定请求者应当授权使用代理
  • 408:(请求超时)服务器等候请求时发生超时
  • 409:(冲突)服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息
  • 410:(已删除)如果请求的资源已永久删除,服务器就会返回此响应
  • 411:(需要有效长度)服务器不接受不含有效内容长度标头字段的请求
  • 412:(未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件
  • 413:(请求实体过大)服务器无法处理请求,因为请求实体过大,超出服务器的处理能力
  • 414:(请求的 URI 过长)请求的URI(通常为网址)过长,服务器无法处理
  • 415:(不支持的媒体类型)请求的格式不受请求页面的支持
  • 416:(请求范围不符合)如果页面无法提供请求的范围,则服务器返回此状态代码
  • 417:(未满足期望值)服务器未满足“期望”请求标头字段要求

5开头:(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

  • 500:(服务器内部错误)服务器遇到错误,无法完成请求
  • 501:(尚未实施)服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码
  • 502:(错误网关)服务器作为网关或代理,从上游服务器收到无效响应
  • 503:(服务不可用)服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态
  • 504:(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求
  • 505:(HTTP 版本不受支持)服务器不支持请求中所用的 HTTP 协议版本

2. SpringBoot常用注解有哪些、

1、@SpringBootApplication

这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。

2、@EnableAutoConfiguration

允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。

@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:

 ● 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;

 ● 去重,并将exclude和excludeName属性携带的类排除;

 ● 过滤,将满足条件(@Conditional)的自动配置类返回;

3、@Configuration

用于定义配置类,指出该类是 Bean 配置的信息源,相当于传统的xml配置文件,一般加在主类上。如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。

4、@ComponentScan

组件扫描。让spring Boot扫描到Configuration类并把它加入到程序上下文。

@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

5、@Repository

用于标注数据访问组件,即DAO组件。

使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。

6、@Service

一般用于修饰service层的组件

7、@RestController

用于标注控制层组件(如struts中的action),表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器;它是@Controller和@ResponseBody的合集。

8、@ResponseBody

表示该方法的返回结果直接写入HTTP response body中

一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。

9、@Component

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

10、@Bean

相当于XML中的,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

11、@AutoWired

byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

当加上(required=false)时,就算找不到bean也不报错。

12、@Qualifier

当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用

13、@Resource(name=”name”,type=”type”)

没有括号内内容的话,默认byName。与@Autowired干类似的事。

14、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解;提供路由信息,负责URL到Controller中的具体函数的映射,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

15、@RequestParam

用在方法的参数前面。

@Transactional:事务注解

3. ArrayList集合Set集合的区别

\1.List******集合是有序存储****,Set****集合是无序存储。这里的有序和无序针对的是存储地址来说的。****

\2.List******可以存储重复的值,****Set****不可以存储重复的值.****

4. SpringBoot常见的场景启动器有哪些

##1. spring-boot-starter-parent(控制版本信息)

##2. spring-boot-starter-web

##3. spring-boot-starter-test

##4.mybatis-spring-boot-starter

##5. mysql-connector-java:

5. 描述servlet的生命周期

①当启动,请求第一次到达servlet资源的时候,这个servlet对象一旦被构建,那么会立即去调用init方法,并且只会调用1次.

②service方法 - 负责接收和响应来自于客户端的请求和数据.

③当关闭容器的时候,在**GC**销毁这个servlet对象之前,会先调用destroy方法来进行一些收尾的工作.

6. Servlet中service方法和doGet方法以及doPost方法的使用场景

推荐学习阶段直接使用service - 接受一切请求

  1. doGet方法只能接受get请求,否则会抛出HTTP Status 405 - HTTP method POST is not supported by this URL
  2. doPost方法只能post请求 - 否则会抛出HTTP Status 405 - HTTP method GET is not supported by this URL
  3. service:可以处理get请求和post请求
    doGet:只能处理get请求
    doPost:只能处理post请求
    当service方法存在时,不管是post请求,还是get请求,都会优先调用service方法进行处理
    如果service不存在时,根据各自的请求方式对doGet方法和doPost方法进行调用

7. HttpServletRequest和HttpResponse以及ServletConfig三者的作用

8. Tomcat和Nginx服务器的默认端口号分别是什么

8080 N:80

9. Http协议是什么?Http的结构是什么?

http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定

协议版本 + 状态码 + 用于解释状态码的原因短语 + 可选的响应首部字段 + 实体主体

请求行、请求头、请求体

10. jsp九大内置对象有哪些

1. out - 输出内容到web网页
2. **page - page作用域,生命周期 - 仅仅在当前页面中有效**
3. **request - request作用域,HttpServletRequest对象.一次请求一次响应**
4. **session - session作用域,一次会话期间,从浏览器打开 - 浏览器完全退出**
5. **application - application作用域 - 对应servlet中的ServletContext作用域,从服务器启动 - 服务器关闭**
6. response - 将所有的响应给客户端的信息全部封装到了这个对象中.
7. config - 获取servlet的配置信息 - 对应servlet中的组件ServletConfig对象
8. exception - 异常对象
9. pageContext - 通过这个对象可以获取比如page,request,session,application,config等对象.

11. servlet三大作用域分别是什么,它们的作用域范围是什么

**1.request**

作用域:一次请求

**2.session**

 作用域:当前会话。

ServletContext 作用域 - 从服务器启动 - 服务器关闭

12. 如何防止表单重复提交

1、禁掉提交按钮

表单提交后使用 Javascript 使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把 Javascript 给禁止掉,这种方法就无效了。

2、Post/Redirect/Get 模式

在提交后执行页面重定向,这就是所谓的 Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

这能避免用户按 F5 导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

 3、在 session 中存放一个特殊标志

当表单页面被请求时,生成一个特殊的字符标志串,存在 session 中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从 session 中删除它,然后正常处理数据。如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。这使你的 web 应用有了更高级的 XSRF 保护。

 4、使用Cookie处理

使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单。

 5、在数据库里添加约束

在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。

13. 什么是cookie,有什么特点

ookie是存储于访问者计算机中的变量 cookie是浏览器提供的一种机制 可以由JavaScript对其进行控制(设置、读取、删除)

**简单但功能强大**

**跟踪cookie检测**

**安全数据删除**

**全面的cookie控制**

(1)cookie可能被禁用; (2)cookie与浏览器相关,不能互相访问; (3)cookie可能被用户删除; (4)cookie安全性不够高; (5)cookie存储空间很小(只有4–10KB左右)

14. 什么是session,使用方式

当用户请求来自应用程序的 Web页时,服务器会给每一个用户(浏览器)创建一个Session对象;

在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中;

当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去,默认情况下,只要浏览器没有关闭,这个Session就一直存在。

15. SpringBoot优势有哪些

# **更快速的构建能力**

# **起步依赖**

# **内嵌容器支持**

# **Actuator 监**控

非常简洁的安全策略集成
支持关系数据库和非关系数据库
支持运行期内嵌容器,如 Tomcat、Jetty
强大的开发包,支持热启动
自动管理依赖
自带应用监控

16. get请求和post请求有什么区别

2) get是从服务器上获取数据,post是向服务器传送数据,一般用于更新资源信息
3) get请求时通过URL直接请求数据,数据信息可以在URL中直接看到,比如浏览器访问;而post请求是放在请求头中的,我们是无法直接看到的
4) get提交有数据大小的限制,一般是不超过2KB,而POST理论上默认是没有限制
5) get请求因为数据参数是暴露在URL中的,所以安全性比较低,如密码不能暴露的就不能用get请求;post请求中,请求信息是放在请求头的,安全性较高,可以使用。

> 1. get请求 - 着重于去查询,请求参数的长度是有限制的
>    * 直接在浏览器中输入url
>    * 超链接的方式
>    * js按钮 - window.location
> 2. post请求 - 着重于去insert,update,delete - 请求参数的长度理论是没有限制的,二进制数据,安全
>    * form表单中的method设置成了post

17. session和cookie有什么区别

- **Cookie是把用户的数据写给用户的浏览器,由浏览器保存,可以保存多个**

- **cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗**

- **cookie的有效期在cookie生成的时候设置进去。**

- Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中

  Session是把用户的数据写进用户独占的session中,服务器保存,登陆信息等重要信息存放入session

  如果主要考虑到安全应当使用session ;

  Session的有效期在web.xml配置文件里设置
  

18. 转发和重定向有什么区别,以及代码是如何实现的

##转发

> 地址栏的地址不变
>
> 一次请求,共享request作用域中数据
>
> 发生在服务器端的跳转

##重定向

> 地址栏会变 -
>
> 控制台network - 出现俩次请求 - 不能获取到request作用域中的数据
>
> 本质:永远是拿着新的地址重新从客户端再次发送新的请求
>
> 发生在客户端的跳转



转发:request.getRequestDispatcher("success.jsp").forward(request,response);
               
重定向:response.sendRedirect("success.jsp");

19. 反向代理和正向代理有什么区别

**正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.**


**反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端**

20. nginx的负载均衡策略有哪些

| 轮询               | 默认方式        |
| ------------------ | --------------- |
| weight             | 权重方式        |
| ip_hash            | 依据ip分配方式  |
| least_conn(待定)   | 最少连接方式    |
| fair(第三方)     | 响应时间方式    |
| url_hash(第三方) | 依据URL分配方式 |

21. jstl中的c标签的使用 - c:if,c:foreach等

<c:forEach var="u" items="${us}">
<tr>
<td>${u.uname}</td>
<td>${u.upsw}</td>
<td>${u.ugrant}</td>
<td><a href="edit?id=${u.id }" class="easyui-linkbutton" data-options="iconCls:'icon-reload'">更新</a></td>
<c:if test="${u.uname!=uname}">
<td><a href="delete?id=${u.id }&uname=${u.uname}" οnclick="javascript:return del();" class="easyui-linkbutton" data-options="iconCls:'icon-remove'">删除</a></td>
</c:if>
</tr>
</c:forEach>

22. 什么是多线程,什么是单例

多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

23. Redis中的缓存穿透,击穿,雪崩是什么意思

**缓存雪崩:**

缓存雪崩是指在设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,导致所有的查询都落在数据库上,造成了缓存雪崩。

**缓存穿透:**

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

**缓存击穿:**

对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。 
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

24. 解释MVC和MVVM思想

MVC Model、View、Controller

  1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。

  2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。

  3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

  那这样Model和View就是相互独立的。View只负责页面的展示,Model只是数据的存储,那么也就达到了解耦和重用的目的。

 

MVVM 双向数据绑定
           
mvvm是一种设计思想,M表示Model,V表示视图View,VM表示数据与模型(区别MVC中,C是用于跳转至哪个页面,而VM只是将数据进行转换或者封装):
           
VM是mvvm模式的核心,它是连接view、model的桥梁。有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。
           
在MVVM的框架下视图和模型是不能直接通信的。它们通过ViewModel来通信,ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。

25. 集群/分布式/微服务三者之间的区别和联系

(1)、分布式是以缩短单个任务的执行时间来提升效率,而集群则是通过提高单位时间内执行的任务数来提升效率;但分布式需要做好事务管理
(2)、集群模式是不同服务器部署同一套服务对外访问,实现服务的负载均衡;区别集群的方式是根据部署多台服务器业务是否相同,分布式中的每个阶段,都可以做集群;而集群并不一定就是分布式的;注意:集群需要做好Session共享,也就是接口要具有无状态特征,确保在不同服务器切换的过程中不会因为没有获取到Session而引起服务终止
(3)、分布式与微服务的架构很相似,只是部署方式不一样而已;生产环境下的微服务肯定是分布式部署的,分布式部署的应用不一定是微服务架构的
(4)、在设计与开发中我们可以将分布式与集群的分开吗?
    分布式的主要功能是将我们的系统模块化,将系统进行解耦,方便维护和开发;但并不能解决系统的并发性和高可用性问题;而集群恰好弥补了分布式的缺陷,一方面可以解决或者说改善系统的并发问题,另一方可以解决服务器如果出现宕机后,系统仍然可以正常运转;好的设计应该是分布式和集群相结合,具体实现就是业务拆分成很多子业务,然后针对每个子业务进行集群部署。

文章作者: 哈雅布撒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 哈雅布撒 !
  目录