发表于: 2018-01-17 20:17:01
1 592
今天完成的事情:
今天完成了任务二所有的东西,经过师兄检查,过关。
下面是深度思考:
1.什么是restful?rest的请求方法有哪些,有什么区别?
REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序。REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。他在 2000 年首次出现HTTP 规范的主要编写者之一Roy Fielding 博士论文中。
REST的请求方法主要有四个: GET、POST、PUT、DELETE。其中GET代表读取数据,POST代表向服务器提交数据,PUT代表向服务器存放数据,DELETE代表要求服务器删除资源。
2.为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的?
REST是Representational State Transfer的英文简写,中文翻译为:表述性状态转移。表述指的是资源的表述,描述资源相对应的状态。这些其实早就已经在HTTP协议中已经进行了规范与封装。那么使用REST风格,实际上就是对HTTP协议的遵循。这样就有一下好处:
1.统一接口:这里其实是让http回归本质,http协议本身就自带method,而且还有表示各种不同状态的返回码等等。
当我们面向资源设计系统的时候,只要在资源层次对客户端和服务器端开放。这时候增删查改都有了统一接口,减少沟通交流成本。 。
2.架构扩展:REST本身不是架构,只是一种架构风格,理解它的时候要参考这个架构风格出现的环境所施加的约束条件。
REST的目的是“建立十年内不会过时的软件系统架构”,所以它具备三个特点:
一、状态无关 —— 确保系统的横向拓展能力
二、超文本驱动,Fielding的原话是”hypertext-driven” —— 确保系统的演化能力
三、对 resource 相关的模型建立统一的原语,例如:uri、http的method定义等 —— 确保系统能够接纳多样而又标准的客户端
从另外一个角度看,第一条保证服务端演化,第三条保证客户端演化,第二条保证应用本身的演化,这实在是一个极具抽象能力的方案。
因为REST只是一种规范,对于REST API来说一个资源一般对应一个唯一的URI(URL)。那么如果不用RAST这种风格,我们只需要定义URL与资源的对应,就足够。而其实在早期URI的设计中,大家也会遵循一些规则,使接口看起透明易读,方便使用者调用。
3.了解maven的module。
modules从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块。如果maven用的比较简单,或者说项目的模块在pom.xml没进行划分,那么此元素是用不到的;不过一般大一点的项目是要用到的。所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块,multi-module)相互关联。
4.什么是http协议?Get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?
HTTP协议即是超文本传输协议(HTTP,HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
Http定义了与服务器交互的不同方法,最基本的方法有4种:GET,POST,PUT,DELETE。URL全称是资源描述符,一般可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4种操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件。Content-Type有很多种值吗,每一种值对应一种文件类型或者数据类型。ContentType属性指定响应的 HTTP内容类型。一般会在HTML文件的<mata>中进行定义。如果未指定 ContentType,默认为TEXT/HTML。
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码,以1开头的通常表示消息,表示请求已经被接受,需要继续处理.以2开头的表示请求已经成功的被服务器接收,理解,接受;以3开头的表示请求被重定向到其他的位置,后续的请求地址在本次响应的Location域中指明.以4开头的表示客户端看起来可能发生了错误,妨碍了服务器的处理,比如常见的404错误,表示客户端请求的资源没有在服务器上发现;以5,6开头的表示服务器在处理请求的过程中有错误或者异常状态发生.我们一般会根据http的状态码来大致判断错误类别.
5.什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?
http在传输层使用的协议是TCP/IP协议,tcp协议是可靠的传输,保证数据完整,有序的传输到对方,为了保证传输数据的有效性,TCP/IP协议要通过三次握手确定和对方建立起了有效的链接.具体就是第一次握手,A向B发送请求要求链接,B收到请求后返回一个确认联机信息,是收到的联机请求码加1,这是第二次握手,A收到B发送过来的确认信息,查看包的编号是否是自己刚才发过去的包的编号加1,如果是则证明可靠的链接已经建立,这是第三次握手,如果不是或者超时,则A会重发请求.
6.什么是WEBService,实现WEBService有哪些框架,为什么WEBService经常被认为太重了,只有银行和大型国企才会使用的更多有一些?
一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
框架1、Apache Axis1,2、Apache Axis2,3、Codehaus Xfire,4、Apache CXF。5、RESTEasy,6、Dubbo,7、java6JAX-WS,8、Apache Wink。
WEBService使用的是SOAP协议,而SOAP的相关使用实在是太过于繁琐。
7.Spring MVC和Struts的区别是什么,为什么更倾向于使用Spring MVC?
1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
2、由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。
3、由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
4、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
5、SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
6、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。
7、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。
8、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
9、 设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。
10、SpringMVC开发效率和性能高于Struts2。
11、SpringMVC可以认为已经100%零配置。
8.web.xml里的主要配置都包括什么,都代表什么含义,比如怎么加载Spring 配置的?
1.Web应用图标:指出IDE和GUI工具用来表示Web应用的大图标和小图标。
2.Web 应用名称:提供GUI工具可能会用来标记这个特定的Web应用的一个名称。
3.Web 应用描述:给出于此相关的说明性文本。4.上下文参数:声明应用范围内的初始化参数。
5.过滤器配置:将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。6.监听器配置。7.Servlet配置。8.会话超时配置。9.MIME类型配置。
10.指定欢迎文件页配置。11.配置错误页面。12.TLD配置。13.资源管理对象配置。14.资源工厂配置。
15.安全限制配置。16.登陆验证配置。18.Web环境参数:env-entry元素声明Web应用的环境项。19.EJB 声明。20.本地EJB声明。
17.安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。
分别地声明角色可使高级IDE处理安全信息更为容易。
9.Annotation和XML两种配置的差别,为什么更喜欢使用Annotaion来配置Spring MVC?
Annotation是建立一类,并通过注解的方式去配置方法对应的SQL。而xml是在类之外,专门建立一个文件作为sql语句的文档。相比之下,Annotation更为灵活,编写更方便。Xml相对而言就比较繁琐,在修改文件方面也没有Annotation方便。
10.使用Annotaion的时候需要有哪些配置,他的加载过程是怎么样的?
使用Annotaion需要在maven中建立相应的依赖,然后创建相应的配置文件作为容器,最后才是在程序中使用Annotaion。
11.什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。Interceptor介绍
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
12.生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?
使用JSON-标签库更加灵活,控制器中的代码更加简洁,易读。如果以后需要更改JSON数据格式,只需要更改JSP页面即可,不需要改动控制器代码
13.一份规范的接口文档应该包括什么内容,衡量接口(API)设计好和坏的准则是什么?
在项目开发中,web项目的前后端分离开发,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。首先接口分为四部分:方法、uri、请求参数、返回参数1、方法:新增(post) 修改(put) 删除(delete) 获取(get)2、uri:以/a开头,如果需要登录才能调用的接口(如新增、修改;前台的用户个人信息,资金信息等)后面需要加/u,即:/a/u;中间一般放表名或者能表达这个接口的单词;get方法,如果是后台通过搜索查询列表,那么以/search结尾,如果是前台的查询列表,以/list结尾。3、请求参数和返回参数,都分为5列:字段、说明、类型、备注、是否必填字段是类的属性;说明是中文释义;类型是属性类型,只有String、Number、Object、Array四种类型;备注是一些解释,或者可以写一下例子,比如负责json结构的情况,最好写上例子,好让前端能更好理解;是否必填是字段的是否必填。4、返回参数结构有几种情况:1、如果只返回接口调用成功还是失败(如新增、删除、修改等),则只有一个结构体:code和message两个参数;2、如果要返回某些参数,则有两个结构体:1是code/mesage/data,2是data里写返回的参数,data是object类型;3、如果要返回列表,那么有三个结构体,1是code/mesage/data,data是object,里面放置page/size/total/list 4个参数,其中list是Arrary类型,list里放object,object里是具体的参数。API一定要便于使用者理解,这样才是广泛传播的基础。如果有些API需要用户掌握特定的概念、定义,那么就要保持这个API的一致性,不能轻易的改变API,否则会给使用者带来很大的麻烦。
14.Http的Header里面包含哪些字段,每个字段都有哪些含义?
HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议。HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应。就整个网络资源传输而言,包括message-header和message-body两部分。首先传递message- header,即http header消息 。标头 (header) 是服务器以HTTP协议传HTML资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔。
15.Content-type中的数据类型,在Spring MVC中都怎么接收数据?
SpringMVC通过相应的类型来接收关于Content-type传递的数据类型。
value: 指定请求的实际地址, 比如 /action/info之类。
method: 指定请求的method类型, GET、POST、PUT、DELETE等
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
params: 指定request中必须包含某些参数值是,才让该方法处理
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求
其中,consumes, produces使用content-typ信息进行过滤信息;headers中可以使用content-type进行过滤和判断。
17.War包是什么,为什么WEB服务通常打出来的都是War包?除了War包,还有几种打包格式,他们之间的区别呢?
WAR是Sun提出的一种Web应用程序格式,是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类。除了WAR包之外,还有JAR包以及EAR包。
18.maven常用的打包插件有哪些?有什么区别?如何使用 ?
一.maven-source-plugin:这样在mvn package后便会在target目录下生成*-sources.jar源码包。
二. maven-javadoc-plugin:这样在mvn package后便会在target目录下生成*-javadoc.jar文档包。
三. maven-jar-plugin:只用将pom文件的打包文件设置为jar:<packaging>jar</packaging>,不用再配置maven-jar-plugin,在执行mvn package时默认会在target目录下生成*.jar。
四.maven-shade-plugin:构建包含依赖的jar包。
五:maven-assembly-plugin:构建自定义格式的分发包。
19.jetty,resin,tomcat的差别在哪里,在线上服务应该选择哪一种WEB服务器?
Tomcat:Tomcat服务器是一个免费的开放源代码的Web应用服务器。Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。
jetty:Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的。
resin:Resin也仅仅是一个Servlet容器,然而由于它优秀的运行速度,使得它在轻量级Java Web领域备受喜爱,特别是在互联网Web服务领域,
Tomcat用的比较多,它是最适合调试的免费的轻型的Java Web服务器,在成品商业java Web应用的发布时就用weblogic jboss或者websphere。它Apache Jakarta的子项目之一,是Sun公司推荐的JSP、Servlet容器。
22.在Linux服务器上部署的时候,一般都要有哪些脚本,这些脚本该怎么编写?
编写的脚本有:停止服务脚本,删除项目脚本,复制war包脚本,启动服务脚本。
23.域名和端口号是怎么对应起来的?应该通过域名访问吗,从域名服务商到服务器的流程是怎么样的?
客户端输入域名,通过DNS将域名解析成为服务器ip,找到代理服务器,因为http协议服务所占用的端口默认为80端口,所以会访问服务器的80端口,然后再通过代理服务器将请求转发到不同的服务器以及端口中。并不建议使用IP+端口号的方式访问。首先,非常难记,域名是对人友好的有含义的字符,而ip都是4组基本无规律的数字,对人不友好,使用很不方便。其次, 如果服务器中的资源发生迁移,那么原先的服务器ip地址就无效了,必须要重新使用新的ip地址访问服务器,用户还要再去记忆一遍IP地址。但是如果是使用域名则不存在这个问题.最后,不安全,通过ip直接访问服务器是非常危险的,相当于将整个服务器的大门向所有人打开,造成的后果是别有用心的人能够非常容易攻击到服务器.域名访问就能杜绝这种情况,用户是不知道服务器的IP地址的,而且就算有人通过域名恶意攻击,直接和用户交互的代理服务器也可以保护内容服务器。这样就算代理服务器被攻破,损失也相对较小。
24.Nginx的作用是什么,在WEB服务前端配置Nginx的好处是什么,除了Nginx,还有别的反向代理服务器吗?
Nginx的作用:1.静态HTTP服务器。
Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
2、反向代理服务器。
客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。
3、负载均衡。
当网站访问量非常大,网站站长开心赚钱的同时,也摊上事儿了。因为网站越来越慢,一台服务器已经不够用了。于是将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。Nginx可以通过反向代理来实现负载均衡。
4、虚拟主机。
有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。例如将www.aaa.com和www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
25.在Controller里应该怎么处理Service的异常,大段的Try Catch 会有什么坏处?
大段的Try Catch会让程序显得逻辑不清晰,十分混乱。不利于后期的迭代开发与代码阅读
26.对Service返回的结果是否要判空,为什么?
需要。检查Service返回的值是否符合对应的期待,如果返回的值不在预期之内,就会导致程序出现不可知的不可以预料的异常,导致项目出现意外。
27.对Service返回的结果是否要打日志,应该打什么样的日志,为什么?
正确的日志打印,是当应用出现问题时能够快速定位问题的绝佳途径,而糟糕笨拙的日志不仅仅让代码看起来非常糟糕,而且还无法定位问题问题所在。除了在方法执行前打印入参,出现异常后打印异常信息,方法结束后打印出参,而且在一些重要的逻辑判断后还必须打出相应的逻辑判断的结果。
28.该怎么模拟假数据,为什么在真实项目中,我们通常都是先定义接口,再写假数据,再去写业务逻辑?
根据数据模型建立了数据库,但是数据库中却没有数据,在给客户做Demo的时候必须要一条一条的添加假数据,而且这些假数据还得像模像样的,不能乱输入,不然看不出任何意义。
先定义好接口,也就能够方便的设计好相应的表与字段,在建立好的数据基础之上再进行业务逻辑的开发,每个人在测试与判断自己的模块更为方便,更容易进行白盒测试,能够将实际开发的时间大大降低,
29.PostMan是什么,为什么要使用他来测试接口,除了Postman,还有哪些工具可以测试?
什么是接口测试?用来检查各个组件的接口的测试,接口测试主要检查外部系统与系统之间以及各个子系统之间的交互点,测试的重点在数据的传递上。
Postman是chrome 的一款插件,用于做接口请求测试,无论是前端,后台还是测试人员,都可以用postman来测试接口,用起来非常方便。还有jmeter、soapui可以用来做接口测试。
31.内网IP和外网IP的区别是什么,在服务器上测试接口是否被防火墙屏蔽的时候,该用内网IP检测,还是该用外网IP检测?
内网IP是在在局域网内,分配给设备的通信地址。外网IP是设备在整个互联网所处在的位置。在服务器上测试端口,通常测试的是外网IP。
32.端口是什么含义,怎么判断一个端口是否被占用了,如何判断一个端口是否被防火墙拦截,怎么用Telnet判断端口号是否打开?
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。
Linux系统下,在CMD窗口输入:netstat -anp |grep 端口号。Window操作系统下,netstat -ano | findstr 端口号。
可以用telnet IP 端口号来确定端口是否打开。
33.WEB服务器通常要配置哪几个端口,如果一台服务器上有多个不同的WEB服务,该怎么规划端口的使用,修真院的端口分配是怎么样的?
通常只需要开放80端口就够了。针对多个web服务开放不同的服务端口,避免端口冲突。
34.C标签是什么,为什么要使用C标签,有哪些常见的指令?
JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言。JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已。JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。根据JSTL标签所提供的功能,可以将其分为5个类别。
(1)核心标签:core(2)格式化标签:fmt(3)数据库标签:sql(4)XML 标签:xml(5)JSTL 函数。
明天计划的事情:开始任务三。学习脚本的编写。
遇到的问题:
1.如何在页面输出json数据。
首先还是要正确引入jar包。但是在idea中,json-taglib似乎下载不下来,后来从师兄那里拷贝了一份,然后在pom中添加如下,就完成了依赖的搭建。
<dependency>
<groupId>atg.taglib.json</groupId>
<artifactId>json-taglib</artifactId>
<version>0.4.1</version>
</dependency>
然后在jsp文件中添加相应的json代码来接收后端传递过来的数据:
<json:object escapeXml="false">
<json:property name="id" value="${student.id}"/>
<json:property name="name" value="${student.name}"/>
<json:property name="sex" value="${student.sex}"/>
<json:property name="qq" value="${student.qq}"/>
<json:property name="graduate" value="${student.graduate}"/>
<json:property name="number" value="${student.number}"/>
<json:property name="autograph" value="${student.autograph}"/>
<json:property name="createtime" value="${student.createtime}"/>
<json:property name="updatetime" value="${student.updatetime}"/>
</json:object>
在jsp文件中需要添加以下两个C标签:
<%@ taglib prefix="json" uri="http://www.atg.com/taglibs/json" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
结果如下:
进度:完成任务二,可以进入任务三了。
http://task.ptteng.com/zentao/project-task-490.html
评论