发表于: 2020-05-24 20:25:06
1 3108
任务二深度思考:
- 控制器(Controller)- 负责转发请求,对请求进行处理。
- 视图(View) - 界面设计人员进行图形界面设计。
- 模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
- 系统盘:随ECS云服务器一起创建,随着ECS云服务器一起释放,生命周期与系统盘所挂载的ECS实例相同,只能有一个。
- 数据盘:可以和ECS一起创建,也可以单独创建数据盘,可以有多个。
- Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
- Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。
- schema
web.xml的模式文件是由Sun公司定义的,每个web.xml文件的根元素<web-app>中,都必须标明这个web.xml使用的是哪个模式文件。其他的元素都放在<web-app></web-app>中 - <display-name>Web应用名称
用于标记这个特定的Web应用的名称 - <discription>Web应用描述
- <context-param>上下文参数
声明应用范围内的初始化参数。用于向Servlet+Context提供键值对,即应用程序上下文信息。后续的listener,filter在初始化时会用到这些上下文信息。在servlet里面可以通过getServletContext().getInitParameter("context/param")得到 - <filter>过滤器
filter可以认为是servlet的一种加强版,主要用于对用户请求request进行预处理,也可以对response进行后处理,是个典型的处理链。使用filter的完整流程是,filter对用户请求进行预处理,接着将请求HttpServletRequest交给Servlet处理并生成响应。最后Filter再对服务器响应HttpServletResponse进行后处理。Servlet与Servlet具有完全相同的生命周期,而Filter也可以通过<init-para>进行初始化参数的配置,并通过FilterConfig传送给filter
Filter的配置就是将此项目与一个实现javax.servlet.Filter接口的类相关联 - <listerner>监听器
- <servlet>
servlet老生常谈啦,是运行在服务器端的小程序 - <session-config>会话超时配置
单位为min - <welcome-file-list>欢迎文件页
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
- application/xhtml+xml :XHTML格式
- application/xml: XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json: JSON数据格式
- application/pdf:pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
1.什么叫MVC,Spring里对应的MVC分别是什么,是怎么收到用户请求然后分发给不同的Controller的?
MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
用户发送请求->前端控制器接受后根据domain与参数中间的一段选择并传递给控制器->控制器收集参数验证后开始处理业务。
2.什么是参数校验,前端和后端需要分别做校验吗?Validation的好处和坏处分别是什么,在真实项目中需要使用Validation吗?
搜了一下发现这是一个叫做 BeanValidation 的 Spring 验证框架。懵了,这个做任务二我竟然没用过,我还在那里手动校验返回错误信息。
参考博文:https://blog.csdn.net/u012373815/article/details/47191743
https://juejin.im/post/5e6636da6fb9a07cb24aaf00
BeanValidation 的官方参考实现是 Hibernate Validator(与 Hibernate 没有关系),用于对 Java Bean 中的字段值进行校验。(好东西)
SpringMVC 使用 Hibernate 的校验框架 Validation 大概步骤:
配置校验信息,导入 jar,配置 SpringMVC并注入容器。
配置 properties。
在 实体类中写校验。
在 controller,service 中接受
传递给页面(json 怎么整?)
优点:可以很方便的对参数校验。
缺点:涉及数据库的复杂校验逻辑没法处理。
3.SpringMVC分页查询和显示
实现了一个固定显示 10 条数据的分页,当然要改成自定义一页数据量的也很简单。
4.“内网IP+端口”和“外网IP+端口”和"域名"三种方式方式的差别是什么?什么时候用内网?什么时候用外网IP,什么时候用域名访问?
内网ip 只能在局域网访问,比如 192.168.1.12:8080
外网ip 也就是公网,只要愿意对外提供服务的话所有人都可以访问
域名只是一个方便记忆的字符串,背后还是要靠 dns 翻译为 ip 地址,还有个好处就是可以随便换 ip,只要域名一样的话对于客户来说用起来都一样,然后不同的三级域名可以定向到不同的服务器。
内网:在局域网上进行测试,nginx 转发到局域网应用服务器,局域网分享资料传输文件···
外网:需要暴露服务到互联网的时候
5.内网IP和外网IP的区别是什么,在服务器上测试接口是否被防火墙屏蔽的时候,该用内网IP检测,还是该用外网IP检测?
区别在上一条都提到了。
这个被防火墙屏蔽具体是什么防火墙?本机 iptables?Great Fire Wall?
如果是本机的防火墙,在局域网和公网测试都一样,Great Fire Wall 这种那就得外网 ip 了。
6.在Linux服务器上,有哪些工具是可以测试接口的,怎么用Wget或者是Curl分别发送Rest的四种请求?
postman,wget,curl
curl 详细使用方式参考博文:https://itbilu.com/linux/man/4yZ9qH_7X.html
Curl 发送四种请求只要添加 -x 参数然后加上请求方法:
$ curl -X DELETE itbilu.com/examlple.html
$ curl -X GET itbilu.com/examlple.html
wget 只找到 post 与 get:
Get:
curl "http://example.cn/disciple/20" 返回信息下载到本地
curl -i "http://example/disciple/20" 显示全部信息
curl -l "http://example/disciple/20" 只显示头部信息
curl -v "http://example/disciple/20" 显示 get 请求全过程
wget "http://example/disciple/20"
Post
curl -d "param1=value1¶m2=value2" "http://example/disciple/20"
curl -H "Content-Type:application/json" -H "Data_Type:msg"
-X POST --data '{"dmac": "00:0C:29:EA:39:70", "trojan_id": 50030}'
wget --post-data 'uaer=foo&password=bar' "http://example/disciple/20"
7.PostMan是什么,为什么要使用他来测试接口,除了Postman,还有哪些工具可以测试?
网页调试与发送 http 请求的应用。
因为其使用方便,可以模拟各种网页请求,所以用它来测试接口。
其他工具:
Fiddler soapui jmeter python
8.该怎么模拟假数据,为什么在真实项目中,我们通常都是先定义接口,再写假数据,再去写业务逻辑?
假数据我用过两种方式:
(a)已经写完了实体类,没有数据库,手动填写参数返回
(b)后端只有一个框,用 json-taglib 编写假数据
方便前后端并行开发:
需求->原型图->前后端一起确定接口文档,UI开始切图->前端模拟接口调试或者后端写假数据给前端调试···
9.对Service返回的结果是否要打日志,应该打什么样的日志,为什么?
需要。
在Service层中,涉及到大量业务逻辑操作,我们往往就需要在一个业务操作完成后(不管成败或失败),生成一条日志。
日志内容:操作人 动作 操作对象 操作内容 操作前内容 操作后内容 ip 操作时间····
遇到问题方便排查,做出了错误操作也可以恢复。
10.对Service返回的结果是否要判空,为什么?
这个不太清楚,网上也说众说纷纭。就目前我的项目来说只有查询的时候会涉及这个问题,我返回的是一个 List,这里说的空是指 null 吧。
我的直觉来说返回 null 是一个很不负责任的做法,设计 service 的时候就不该这样做。
11.在Controller里应该怎么处理Service的异常,大段的Try Catch 会有什么坏处?
解决异常首先从 controller 的数据校验开始,这一步解决好能少很多 service 错误,最后也无法避免的异常只能是遇到了之后 try catch 写应对逻辑。
当然 try catch 一定要是指向具体的报错,不要用 catch(Exception e) 这样,因为也许一些错误不让他崩溃会导致更严重的后果。
12.怎么查看Nginx的访问请求时间,多少的响应时间是合理的,并发1000和单线程访问的差别是什么,Nginx可以支持多少并发,Tomcat可以支持多少并发,为什么要在Tomcat之前配置一个Nginx?
配置 nginx accesslog 来查看具体请求时间。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for "|$request_time|$upstream_response_time';
(1)request_time
官网描述:request processing time in seconds with a milliseconds resolution; time elapsed between the first bytes were read from the client and the log write after the last bytes were sent to the client 。
指的就是从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出
响应数据时间。
(2)upstream_response_time
官网描述:keeps times of responses obtained from upstream servers; times are kept in seconds with a milliseconds resolution. Several response times are separated by commas and colons like addresses in the $upstream_addr variable
是指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间。
响应时间应该在 50ms 以下是正常的。
单机访问静态资源的话,nginx 上限是 2W 左右(我网上搜的,感觉这个很难说,应该和配置有关系吧)
Tomcat 在 1w 左右。
在 tomcat 前配置 nginx 原因:
1,配置动静分离减轻tomcat 的压力
2,方便实现负载均衡
3,万一应用服务器挂了,nginx 可以定向到错误页
13.域名和端口号是怎么对应起来的?应该通过域名访问吗,从域名服务商到服务器的流程是怎么样的?
额,域名和端口对应是什么意思?域名不应该是对应 ip 地址吗?
http 的话默认是 80 端口,直接用 ip 或者用域名可以访问是因为都是默认 80 端口,就像 ftp 默认 21 端口,https 默认 443 端口。
如果自定义了端口的话,无论域名还是ip 都需要在其后加上端口号才能访问。
应该通过域名访问吗?这个问题好奇怪,对于一些大网站的话还是应该用域名访问,因为通常会配置 cdn 之类的,体验会比较好。而且谁没事去记 ip 地址啊···
从浏览器到服务器到浏览器的流程:
A.浏览器输入 url 回车
B.浏览器查找缓存
C.查找 host 文件,没找到-》D,找到了-》G
D.查找本地 DNS 解析器缓存,没找到-》E,找到了-》G
E.查找本地 DNS 服务器-》F
F.迭代查找,根域名->顶级域名->····->子域名->IP
G.发起 TCP 三次握手
第一次:客户端发送 syn->服务器
第二次:服务器接收syn确认客户端发送正常,发送syn->客户端
第三次:客户端接受syn,确认自己收发正常,服务器收发正常,建立 TCP 连接成功,完成三次握手
H.发起 http 请求
I.服务器响应请求,浏览器接受数据
J.浏览器解析数据,渲染页面
K.四次挥手,关闭 TCP 连接
第一次:浏览器发送 FIN 请求断开连接
第二次:服务器发送 ACK 同意断开连接
第三次:服务器发送 FIN 请求断开连接
第四次:浏览器返回 ACK 同意断开连接
14.端口是什么含义,怎么判断一个端口是否被占用了,如何判断一个端口是否被防火墙拦截,怎么用Telnet判断端口号是否打开?
一台服务器能同时处理多种事务,但是只有一个 ip 地址,不同的服务就选择占用不同的端口号来收发自己的信息。
查看端口是否占用:
lsof -i:8080
netstat -anp|grep 8080
判断是否防火墙拦截:
telnet ip:port
提示 Escape character is··· 就没有被拦截
15.WEB服务器通常要配置哪几个端口,如果一台服务器上有多个不同的WEB服务,该怎么规划端口的使用,修真院的端口分配是怎么样的?
通常就是 80(http)443(https)
有多个 web 服务就用 nginx 暴露出 80 443,接受到请求再映射到本地的其他服务的端口去
16.常用的性能统计命令有哪些,Top,Vmstat,free等命令都有什么用处,CPU占用率,内存使用分别代表什么含义?到什么情况下,应该产生报警信息?
序号 | 命令 | 功能 |
1 | Uptime | 快速查看负载情况 |
2 | dmesg ]tail | 输出系统日志的最后10行 |
3 | vmstat 1 | 输出系统核心指标 |
4 | mpstat -P ALL 1 | 显示每个CPU的占用情况 |
5 | pidstat 1 | 输出进程的CPU占用率 |
6 | iostat -xz 1 | 查看磁盘IO情况 |
7 | free -m | 查看内存的使用情况 |
8 | sar -n DEV 1 | 网络设备的吞吐率 |
9 | sar -n TCP,ETCP 1 | 查看TCP连接状态 |
10 | Top | 相对全面的查看系统负载的来源 |
Top
通过该命令可以相对全面的查看系统负载的来源,top命令还支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。
top命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停top命令刷新,来记录和比对数据。
可以使用htop 命令来查看系统的使用情况。可以使用键盘的F3 : 搜索进程, F4 : 过滤器,按关键字搜索,F5 : 显示树形结构, F6 : 选择排序方式, F7/ F8 : 减少/ 增加nice值,这样就可以提高/降低对应进程的优先级,F9 : 杀掉选中的进程, F10 : 退出htop
htop命令的优点:
快速查看关键性能统计数据,如CPU(多核布局)、内存/交换使用;
可以横向或纵向滚动浏览进程列表,以查看所有的进程和完整的命令行;
杀掉进程时可以直接选择而不需要输入进程号;
通过鼠标操作条目;
比top启动得更快
Vmstat
r:等待在CPU资源的进程数。这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。
free:系统可用内存数(以千字节为单位),如果剩余内存不足,也会导致系统性能问题。下文介绍到的free命令,可以更详细的了解系统内存的使用情况。
si, so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。
us, sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。
Free
该命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。
第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。
如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能。
17.为什么要知道响应时间的分布情况,如果一个请求很慢,它的时间可能会被耗费在哪里?
知道了响应时间分布才能发现问题并且去做优化。
读写数据库,机器负载过高,发送的数据过多···
18.怎么查看Resin或者是Tomcat中的DB访问时间和Controller时间,有没有可能用Aop的方法自动记录Controller的时间和DB时间?Controller时间和DB时间的区别是什么,在你写的业务逻辑里,相差有多大?
不清楚现有的框架,我会选择手动打时间点来记录。
有可用的 aop 方法来记录访问时间。
controller的耗时包括了 db 的耗时。
19.怎么判断WEB容器是否收到了一个Http请求,WEB容器中的Access.log是什么意思,包含哪些字段,代表什么含义,是哪里配置修改字段的。
Accesslog 即访问日志,记录的就是接收到的请求信息。
具体的字段不同的应用服务器都不太一样,这里贴一份 resin 的文档:
官方文档的解释:
PATTERN | DESCRIPTION |
%b | result content length |
%D | time taken to complete the request in microseconds (since 3.0.16) |
%h | remote IP addr |
%{xxx}i | request header xxx |
%{xxx}o | response header xxx |
%{xxx}c | cookie value xxx |
%{xxx}n | request attribute |
%{xxx}p | request parameter |
%r | request URL |
%s | status code |
%S | requested session id |
%{xxx}t | request date with optional time format string. |
%T | time taken to complete the request in seconds |
%u | remote user |
%U | request URI |
%v | name of the virtual host serving the request |
来自 <https://www.jnshu.com/daily/112267?total=41&page=5&uid=40015&sort=0&orderBy=3>
20.为什么通常都是将部署文件放置在/data/盘下,在云服务器中数据盘和系统盘的区别是什么?
系统盘和数据盘的创建方式区别:
21.常用的主流数据库有哪些,Mysql有几种安装方式?
Mysql Oracle DB2 SQLServer PostgreSQL
下载 rpm 安装包
zip / tar.gz 安装包
Yum 从源安装
22.有哪些常用的云服务器公司,Linux服务器和Windows服务器的差别是什么,Linux有哪些主流的版本,不同版本之间的差别在哪里?
阿里云 腾讯云 AWS A zure
Linux 一般都直接用命令行,方便同属部署多个服务器
Windows 图形界面很直观,不方便同时部署多台 windows 服务器
分 Debian 系与 readhat 系
Readhat 主打商业授权,提供技术支持。提供免费开源的 centos
Ubuntu 主打图形界面,桌面办公
23.什么是ssh?如何在linux服务器上从网站下载文件?
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境[1]。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接[2]。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。
来自 <https://zh.wikipedia.org/wiki/Secure_Shell>
Wget 或者 curl 都可以用来下载文件。
24.C标签是什么,为什么要使用C标签,有哪些常见的指令?
是JSTL中的核心库,为日常任务提供通用支持,如显示和设置变量、重复使用一组项目、测试条件和其他操作(如导入和重定向Web内容)。
C标签具体分析
1: c:out 用于在JSP中显示数据
2: c:set 用于保存数据
3: c:remove 用于删除数据
4: c:catch 用来处理产生错误的异常状况,并且将错误信息储存起来
5: c:if 与我们在一般程序中用的if一样
6: c:choose 本身只当做c:when和c:otherwise的父标签
7: c:when c:choose的子标签,用来判断条件是否成立
8: c:otherwise c:choose的子标签,接在c:when标签后,当c:when标签判断为false时被执行
9: c:import 检索一个绝对或相对 URL,然后将其内容暴露给页面
10: c:forEach 基础迭代标签,接受多种集合类型
11: c:forTokens 根据指定的分隔符来分隔内容并迭代输出
25.什么叫反向代理?为什么要使用反向代理?
正向代理:去客户机指定的位置获取指定的内容
反向代理:去获取客户指定的内容
反向代理的应用:负载均衡、防火墙
26.Nginx的作用是什么,在WEB服务前端配置Nginx的好处是什么,除了Nginx,还有别的反向代理服务器吗?
作用:代理。
好处:
1,配置动静分离减轻应用服务器的压力
2,方便实现负载均衡
3,万一应用服务器挂了,nginx 可以定向到错误页
种类:Squid Varnish Nginx ApacheTS HAProxy
27.为什么要用start.sh,stop.sh,deploy.sh 来完成容器的启动,停止和部署,而不是直接用容器自带的命令?
方便 流程固化 安全、防止打错指令出问题
28.什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?
Filter 过滤器:过滤字符编码、做一些业务逻辑判断,主要用于对用户请求进行预处理,同时也可进行逻辑判断。
Interceptor 拦截器:拦截用户请求,进行处理,比如判断用户登录情况、权限验证,只要针对Controller请求进行处理,是通过HandlerInterceptor。
Filter和Interceptor的区别
29.使用Annotaion的时候需要有哪些配置,他的加载过程是怎么样的?
需要在Spring配置文件中注册驱动
<mvc:annotation-driven/>
扫描指定路径下的注解-》解析注解-》执行注解行为
30.Annotation和XML两种配置的差别,为什么更喜欢使用Annotaion来配置Spring MVC?
Annotation 的方式耦合度更高,但是读起来更加清晰,注解与作用对象一目了然。
Xml 的的方式把我绕的有点晕,特别是我现在这个小项目三个 Spring xml 配置我已经分不清它们是干什么的了,当然这也可能是我太菜了。
31.web.xml里的主要配置都包括什么,都代表什么含义,比如怎么加载Spring 配置的?
容器加载顺序:
Servlet->context-param->listener->filter->servlet
加载过程:
启动 web 项目,web 容器读取 web.xml ,读取 <listener>与<context-parem>节点
创建一个 ServletContext(servlet上下文),整个web项目都可以读取这个上下文
容器将 <context-param> 转换为键值对,交给 ServletContext
容器创建 <listener>中的实例,创建监听器
Web.xml 主要配置如下:
web.xml文件元素详解https://www.jianshu.com/p/285ad45f60d1
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
<display-name>Tomcat Example</display-name>
<disciption>Tomcat Example servlets and JSP pages.</disciption>
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/log4j2.xml</param-value>
</context-param>
<filter>
<filter-name>setCharacterEncoding</filter-name>
<filter-class>com.myTest.setCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listerner-class>com.listener.SessionListener</listener-class>
</listener>
<!-- 基本配置 -->
<servlet>
<servlet-name>snoop</servlet-name>
<servlet-class>SnoopServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>snoop</servlet-name>
<url-pattern>/snoop</url-pattern>
</servlet-mapping>
<!-- 高级配置 -->
<servlet>
<servlet-name>snoop</servlet-name>
<servlet-class>SnoopServlet</servlet-class>
<init-param>
<param-name>foo</param-name>
<param-value>bar</param-value>
</init-param>
<run-as>
<description>Security role for anonymous access</description>
<role-name>tomcat</role-name>
</run-as>
</servlet>
<servlet-mapping>
<servlet-name>snoop</servlet-name>
<url-pattern>/snoop</url-pattern>
</servlet-mapping>
<!--
<servlet-name></servlet-name> 指定servlet的名称
<servlet-class></servlet-class> 指定servlet的类名称
<jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径
<init-param></init-param> 用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数
<load-on-startup></load-on-startup>指定当Web应用启动时,装载Servlet的次序。当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet。当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它。
<servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素
<servlet-name></servlet-name> 指定servlet的名称
<url-pattern></url-pattern> 指定servlet所对应的URL
-->
<session-config>
<session-timeout>120</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
显示时按顺序从第一个找起,如果第一个存在,就显示第一个,后面的不起作用。如果第一个不存在,就找第二个,以此类推。
32.Spring MVC和Struts的区别是什么,为什么更倾向于使用Spring MVC?
Struts 是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目。它通过采用JavaServlet/JSP技术,实现了基于Java EEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文
2、Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map
3、拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
4、Spring MVC和Spring是无缝的。蹭了Spring的热度
5、SpringMVC开发效率和性能高于Struts2。
33.什么是WEBService,实现WEBService有哪些框架,为什么WEBService经常被认为太重了,只有银行和大型国企才会使用的更多有一些?
WebService 是一种跨编程语言和跨操作系统平台的远程调用技术。
所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。
所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统,商场的POS机转账调用的转账方法的代码其实是跑在银行服务器上。再比如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。(这个和 rest 好像,只不过我做的是返回一个 json, 它返回 xml)
优点:
a.发送方式采用http的post发送,http的默认端口是80,防火墙默认不拦截80,所以跨防火墙
b.采用XML格式封装数据,XML是跨平台的,所以webservice也可以跨平台。
c.Webservice支持面向对象
缺点:
a.采用XML格式封装数据,所以在传输过程中,要传输额外的标签,随着SOAP协议的不断完善,标签越来越大,导致webservice性能下降
34.什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
三次刚好够双方确认收发能力正常。
35.什么是http协议?get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?
http(超文本转移协议)用于解决传输文本传输的难题。
Get post 本质上没有区别,最后都是 tcp 连接,但是由于一些浏览器实现以及服务器的处理方式导致用起来需要注意一些不成文的规定。参考链接:https://www.oschina.net/news/77354/http-get-post-different
Content-Type(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。
常见的媒体格式类型如下:
以application开头的媒体格式类型:
另外一种常见的媒体格式是上传文件之时使用的:
分类 | 分类描述 |
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
HTTP状态码分类
太多了,不一一列举。
36.了解maven的module。
在Maven的多模块工程中,都存在一个pom类型的工程作为根模块,该工程只包含一个pom.xml文件,在该文件中以模块(module)的形式声明它所包含的子模块,即多模块工程。在子模块的pom.xml文件中,又以parent的形式声明其所属的父模块,即继承。然而,这两种声明并不必同时存在,我们将在下文中讲到这其中的区别。
需求场景:
如果我们的项目分成了好几个模块,那么我们构建的时候是不是有几个模块就需要构建几次了(到每个模块的目录下执行mvn命令)?当然,你逐个构建没问题,但是非要这么麻烦的一个一个的构建吗,那么简单的做法就是使用聚合,一次构建全部模块。
37.为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的?
REST 的好处
REST 比其他方法(如 SOAP)要容易得多,SOAP 使开发人员不必在 HTTP 请求操作方面重新发明轮子。SOAP 还需要单独的服务器和客户端程序。
由于 REST 基于标准 HTTP 操作,因此它使用具有特定含义的动词,如"获取"或"删除",以避免歧义。为资源分配了单独的 URI,增加了灵活性。
使用 REST,生产和消费的信息与促进生产和消费的技术分离开来。因此,REST 性能良好,可伸缩性高、简单且易于修改和扩展。
rest之前使用的是 soap,这种方式可以让开发者以自己想要的结构来获取数据,但是最终由于其定义与约束越来越复杂访问过于缓慢而被淘汰。
38.生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?
A 序列化实体数据来生成 json
B jsontaglib
使用 jsontaglib 的话需要修改的时候只要修改 jsp页面,用实体序列化的方式就必须改动实体类或者新建一个类用于序列化为 json 数据。
39.一份规范的接口文档应该包括什么内容,衡量接口(API)设计好和坏的准则是什么?
请求方法,请求地址,返回参数以及字段与备注。
标准:
保持兼容性
方法名子描述,看到名字就知道方法的作用,需要的数据
便于使用者理解,不能定义过于复杂
有必要的接口参数验证,返回的异常要足够全面
40.Http的Header里面包含哪些字段,每个字段都有哪些含义?
请求字段[编辑]
协议头字段名 | 说明 | 示例 | 状态 |
Accept | 能够接受的回应内容类型(Content-Types)。参见内容协商。 | Accept: text/plain | 常设 |
Accept-Charset | 能够接受的字符集 | Accept-Charset: utf-8 | 常设 |
Accept-Encoding | 能够接受的编码方式列表。参考HTTP压缩。 | Accept-Encoding: gzip, deflate | 常设 |
Accept-Language | 能够接受的回应内容的自然语言列表。参考 内容协商 。 | Accept-Language: en-US | 常设 |
Accept-Datetime | 能够接受的按照时间来表示的版本 | Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT | 临时 |
Authorization | 用于超文本传输协议的认证的认证信息 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== | 常设 |
用来指定在这次的请求/响应链中的所有缓存机制 都必须 遵守的指令 | Cache-Control: no-cache | 常设 | |
Connection | 该浏览器想要优先使用的连接类型 | Connection: keep-alive Connection: Upgrade | 常设 |
Cookie | 之前由服务器通过 Set- Cookie (下文详述)发送的一个 超文本传输协议Cookie | Cookie: $Version=1; Skin=new; | 常设: 标准 |
Content-Length | 以 八位字节数组 (8位的字节)表示的请求体的长度 | Content-Length: 348 | 常设 |
Content-MD5 | 请求体的内容的二进制 MD5 散列值,以 Base64 编码的结果 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== | 过时的[9] |
Content-Type | 请求体的 多媒体类型 (用于POST和PUT请求中) | Content-Type: application/x-www-form-urlencoded | 常设 |
Date | 发送该消息的日期和时间(按照 RFC 7231 中定义的"超文本传输协议日期"格式来发送) | Date: Tue, 15 Nov 1994 08:12:31 GMT | 常设 |
Expect | 表明客户端要求服务器做出特定的行为 | Expect: 100-continue | 常设 |
From | 发起此请求的用户的邮件地址 | From: user@example.com | 常设 |
Host | 服务器的域名(用于虚拟主机 ),以及服务器所监听的传输控制协议端口号。如果所请求的端口是对应的服务的标准端口,则端口号可被省略。 [10] 自超文件传输协议版本1.1(HTTP/1.1)开始便是必需字段。 | Host: en.wikipedia.org:80 Host: en.wikipedia.org | 常设 |
If-Match | 仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要作用时,用作像 PUT 这样的方法中,仅当从用户上次更新某个资源以来,该资源未被修改的情况下,才更新该资源。 | If-Match: "737060cd8c284d8af7ad3082f209582d" | 常设 |
If-Modified-Since | 允许在对应的内容未被修改的情况下返回304未修改( 304 Not Modified ) | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT | 常设 |
If-None-Match | 允许在对应的内容未被修改的情况下返回304未修改( 304 Not Modified ),参考 超文本传输协议 的实体标记 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" | 常设 |
If-Range | 如果该实体未被修改过,则向我发送我所缺少的那一个或多个部分;否则,发送整个新的实体 | If-Range: "737060cd8c284d8af7ad3082f209582d" | 常设 |
If-Unmodified-Since | 仅当该实体自某个特定时间已来未被修改的情况下,才发送回应。 | If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT | 常设 |
Max-Forwards | 限制该消息可被代理及网关转发的次数。 | Max-Forwards: 10 | 常设 |
Origin | 发起一个针对 跨来源资源共享 的请求(要求服务器在回应中加入一个‘访问控制-允许来源’('Access-Control-Allow-Origin')字段)。 | 常设: 标准 | |
Pragma | 与具体的实现相关,这些字段可能在请求/回应链中的任何时候产生多种效果。 | Pragma: no-cache | 常设但不常用 |
Proxy-Authorization | 用来向代理进行认证的认证信息。 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== | 常设 |
Range | 仅请求某个实体的一部分。字节偏移以0开始。参见字节服务。 | Range: bytes=500-999 | 常设 |
表示浏览器所访问的前一个页面,正是那个页面上的某个链接将浏览器带到了当前所请求的这个页面。 | 常设 | ||
TE | 浏览器预期接受的传输编码方式:可使用回应协议头 Transfer-Encoding 字段中的值;另外还可用"trailers"(与"分块 "传输方式相关)这个值来表明浏览器希望在最后一个尺寸为0的块之后还接收到一些额外的字段。 | TE: trailers, deflate | 常设 |
User-Agent | 浏览器的浏览器身份标识字符串 | User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0 | 常设 |
Upgrade | 要求服务器升级到另一个协议。 | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 | 常设 |
Via | 向服务器告知,这个请求是由哪些代理发出的。 | Via: 1.0 fred, 1.1 example.com (Apache/1.1) | 常设 |
Warning | 一个一般性的警告,告知,在实体内容体中可能存在错误。 | Warning: 199 Miscellaneous warning | 常设 |
41.如何写shell脚本?尝试自己编写一个简单脚本。
任务二写过部署脚本了。
42.在Linux服务器上部署的时候,一般都要有哪些脚本,这些脚本该怎么编写?
环境的检查与安装,代码拉取与编译,部署,清理
话是这么说的,实际上我只写过部署,现在想起来每次关机器之前我都是手动关的web服务···
43.如果有多个WEB服务,都把WEB服务都配置在一个容器里,还是一个WEB配置一个容器,他们的差别是什么,你觉得哪种方式更好?
看情况吧,穷则战术穿插,达则集群覆盖。
差别就是配在一个容器的话配置文件改起来比较麻烦,然后端口也会需要多个,要么访问的时候加端口号,要么只能在前面再加一个 nginx 之类的代理。
我选肯定是配置多个容器。
44.Resin/tomcat/jetty等WEB容器的内存大小,一般应该设置多大合适,怎么估算WEB程度占用内存的大小?
这个也要看情况吧,首先硬件配置有限制,操作系统也有限制,在保障服务能正常运行的前提下尽量大一点。
这个我上次测过一次 resin 的最小启动内存,到 16m 的时候无法启动,当时我的 war 包是 15m 多,我在想最小应该不能低于 war 包的大小。然后 32m 的时候执行操作可能会卡死,所以我估计大概要分配 war 包大小的 3倍以上。
45.jetty,resin,tomcat的常见配置有哪些,内存,端口,日志文件都怎么配置?
虚拟路径,log文件格式及位置,内存设置,端口等···
之前在任务里配置过有日报记载。
resin:https://www.jnshu.com/daily/112267?total=41&page=5&uid=40015&sort=0&orderBy=3
jetty与tomcat访问日志设置:https://www.jnshu.com/daily/112250?total=41&page=6&uid=40015&sort=0&orderBy=3
jetty设置:https://www.jnshu.com/daily/112243?total=41&page=7&uid=40015&sort=0&orderBy=3
46.jetty,resin,tomcat的差别在哪里,在线上服务应该选择哪一种WEB服务器?
Tomcat服务器特点:
1、提供了可被服务器加载并执行的程序代码,并服务于来自客户端的请求。
2、Servlet不依赖浏览器,是允许在服务器端,所以不管浏览器是否支持java,都能请求访问servlet。
Resin服务器特点:
1、Resin包含了很多可靠的特性,包括服务器自动重启、检测并重启死锁的服务器、管理JVM内存以防止内存泄露等。
2、Resin可以将多个服务器作为一个服务器来对客户进行响应,从而增强服务器的扩展能力。
3、Resin可实现持久和分布的sessions:持久的session能够在服务器重启的时候保持现有的Http会话,分布式的session可以在多个服务器之间共享Http会话的状态。
Jetty服务器特点:
1、Jetty嵌入比较便利,它设计之初就是作为一个优秀的组件来设计的,因此Jetty可以非常容易的嵌入到应用程序当中而不需要程序为了使用Jetty做修改。
2、Jetty是轻量的web服务器,一般来说,它的默认配置便可以满足日常大部分需求,
如果要完成较为复杂的功能,只需修改相关的xml文件。jetty的嵌入只需少量的代码就可以做到。
3、Jetty易拓展,有许多非常良好的接口,因此在Jetty的某种实现无法满足用户的需要时,用户可以非常方便地对Jetty的某些实现进行修改,使得Jetty适用于特殊的应用程序的需求。
线上的选择需要根据实际情况来决定。
47.maven常用的打包插件有哪些?有什么区别?如何使用 ?
A。maven-jar-plugin: jar 与依赖分开打包,生成的 jar 包比较小,需要放在 lib 文件夹中运行
B。maven-assembly-plugin:所有的依赖打包进同一个 jar包,生成的文件比较大,可以直接运行,但是可能会有缺失 spring xds 文件而无法运行的风险
C。maven-shade-plugin:所有的依赖放进同一个 jar 文件,可以直接运行
48.War包是什么,为什么WEB服务通常打出来的都是War包?除了War包,还有几种打包格式,他们之间的区别呢?
war包:是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。以Tomcat来说,将war包放置在其\webapps\目录下,然后启动Tomcat,这个包就会自动解压,就相当于发布了。
war包是Sun提出的一种web应用程序格式,与jar类似,是很多文件的压缩包。
war包中的文件按照一定目录结构来组织。根据其根目录下包含有html和jsp文件,或者包含有这两种文件的目录,另外还有WEB-INF目录。通常在WEB-INF目录下含有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的servlet类和jsp,或者servlet所依赖的其他类(如JavaBean)。通常这些所依赖的类也可以打包成jar包放在WEB-INF下的lib目录下。
还有 jar 包,是一种通用类,直接运行或者做依赖。
49.Put请求在Linux下的Tomcat或者是Resin中会收不到数据,怎么解决这个问题,原因是什么?为什么本地使用Jetty的时候往往是正常的?
没遇到过这种情况···
在做 accesslog 的时候我都测试过。
50.Content-type中的数据类型,在Spring MVC中都怎么接收数据?
@RequestMapping 注解会接受这些数据
其源码如下:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String[] value() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
51.什么是restful?rest的请求方法有哪些,有什么区别?
Restful 是一种交互方法的描述,我现在主要用到的就是根据其约束来设计api。
请求方法:GET,POST,DELETE,PUT等···
GET:获取资源
POST:新建资源
DELETE:删除资源
PUT:替换资源
评论