发表于: 2018-04-05 23:10:57

1 764


今天完成的事情:

整理深度思考

1.什么是restfulrest的请求方法有哪些,有什么区别?

REST其实是一种组织Web服务的架构,rest提出了一系列的架构级约束.这些约束是:

  1. 使用c/s模型。客户和服务器之间通过一个统一的接口来互相通讯。
  2. 层次化的系统。在一个REST系统中,客户端并不会固定地与一个服务器打交道。
  3. 无状态。在一个REST系统中,服务端并不会保存有关客户的任何状态。也就是说,客户端自身负责用户状态的维持,并在每次发送请求时都需要提供足够的信息。
  4. 可缓存。REST系统需要能够恰当地缓存请求,以尽量减少服务端和客户端之间的信息传输,以提高性能。
  5. 统一的接口。一个REST系统需要使用一个统一的接口来完成子系统之间以及服务与用户之间的交互。这使得REST系统中的各个子系统可以独自完成演化。

如果一个系统满足了上面所列出的五条约束,那么该系统就被称为是RESTful的.

rest的请求方法有四种:

1.GET  获取资源:

根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。安全的意味着该操作用于获取信息而非修改信息,不会影响资源的状态。幂等的意味着对同一URL的多个请求应该返回同样的结果。

2.POST 新建资源:

1)get是从服务器上获取数据,post是向服务器传送数据。

2)get方式提交的数据最多只能有1024字节,而post没有限制。

3)安全性问题。使用 Get的时候,参数会显示在地址栏上,而 Post不会。数据被包含在请求体中。

3.PUT 更新资源

4.DELETE 删除资源

2.为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的?

要求                                   传统模式                            rest风格

列举出所有的用户        GET /users/list                     GET /users

列出ID为1的用户信息        GET /users/show/id/1         GET /users/1

插入一个新的用户        POST /users/add                     POST /users

更新ID为1的用户信息        POST /users/mdy/id/1         PUT /users/1

删除ID为1的用户        POST /users/delete/id/1         DELETE /users/1

 

简单来说,rest更贴近于以资源来定义应用的架构,并且更加轻便和高效。

 

3.了解mavenmodule

在多人使用Maven协作开发项目时,尤其是稍微上点规模的项目,每个开发者的工作都细分到具体功能和模块,有些模块甚至还要单独部署。

因此所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml。它们之间通过继承和聚合相互关联。

让每个模块独立,高内聚,低耦合.不同模块之间保持自己的完整性.

可以互相不干扰.方便以后的维护开发。

 

创建多模块的大体步骤是首先新建一个maven项目,再在已建好的maven项目内新建modules,需要注意的就是它们之间的依赖关系。

4.什么是http协议?Getpost请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。

 

GET方法是安全、幂等、可缓存的(除非有 Cache-ControlHeader的约束),GET方法的报文主体没有任何语义。

POST不安全,不幂等,(大部分实现)不可缓存。为了针对其不可缓存性,有一系列的方法来进行优化。

 

服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。

它用于标识发送或接收到的数据的类型,浏览器根据该参数来决定数据的打开方式

http请求头有四种类型,分别是通用头部,请求头部,响应头部以及内容头部。

content-type是属于内容头部。Content-Type使用的是 “主类型/子类型; 额外参数” (  [type]/[subtype]; parameter )的数值格式。下面是几个常见的:

1.text/html

2.text/plain

3.text/css

4.text/javascript

5.application/x-www-form-urlencoded

6.multipart/form-data

7.application/json

8.application/xml

 

HTTP连接使用的是"请求-响应"方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据.

http是短连接,类似于平常网页中请求信息的点击,安全性较高,socket是长连接,连接之后,只要双方不主动关闭连接,连接一直存在,安全性较低。每个用户无需频繁操作情况下需用短连接好。

状态码:

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

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

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

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


5.什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?

TCP/IP也称"国际协议簇", 即不仅指 TCP/IP协议本身,而且包括与其有关的协议。 TCP为传输控制协议,IP为网际协议,是网络层最重要的协议。

TCP三次握手:(官方)

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

(自己的理解)

生活中我们发一次信息比作一次握手

第一次握手:A给B发信息,说:你能收到我的信息吗?

第二次握手:B收到A的信息后,说:我能收到你的信息,你能收到我的吗?

第三次握手:A收到了B的信息,然后说:我可以收到你的信息。

如果只有两次握手,那么B无法确定A是否能收到自己的信息。

如果四次握手,那么则会造成浪费,因为在三次结束后,AB双方都可以确定信息是可以发的过去的,那么在发一次信息是没有必要的。

 

6.什么是WEBService,实现WEBService有哪些框架,为什么WEBService经常被认为太重了,只有银行和大型国企才会使用的更多有一些?

WebService是一种跨编程语言和跨操作系统平台的远程调用技术。所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法。

框架:如cfx、jwx、XFire与Axis2,jwx也就是jax-ws。

适合使用Web Service的情况:

1跨越防火墙;

2,应用程序集成;

3,B2B集成;

4,软件重用

 

7.Spring MVCStruts的区别是什么,为什么更倾向于使用Spring MVC

一、框架机制

1,struts采用Filter实现,springMVC则采用servlet实现。

2,Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

二、拦截机制

1、Struts2

a、Struts2框架是类级别的拦截,每次请求就会创建一个Action

b、Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。

c、Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了

 

2、SpringMVC

a、SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。

b、在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,又应为没有共享的属性,所以是线程安全的。

spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。

 

三、性能方面

SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,由于加载了一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

 

四,集成方面

SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

 

8.web.xml里的主要配置都包括什么,都代表什么含义,比如怎么加载Spring 配置的?

常用标签:

1:welcome-file-list:欢迎界面

2:servlet与servlet-mapping是成对出现的

当一个url地址访问servlet时先查找servlet-mapping的url-pattern,然后找到对应的servlet-mapping的servlet-name,根据这个名字找到跟它对应的servlet的servlet-name,之后找到servlet-name对应的servlet-class文件就可以执行这个servlet文件。

<init-param> 配置文件中设定的参数,<load-on-startup>决定当web容器启动时何时初始化servlet。

3,<context-param>:指定spring配置文件位置

4,过滤器<filter>,常用的有字符过滤器。

5,监听器listener,用web工程来实例化spring容器用的就是一个监听器。可以监听客户端的请求、服务端的操作等。

6,设置会话(Session)过期时间,其中时间以分钟为单位,假如设置60分钟超时:

 

<session-config>

       <session-timeout>60</session-timeout>

</session-config>

 

9.AnnotationXML两种配置的差别,为什么更喜欢使用Annotaion来配置Spring MVC

xml方式:

1,在xml文件中配置,进一步降低了耦合,使得应用更容易扩展。

2,在处理大业务量的情况下,用xml文件配置的方式比较好,因为xml更加清晰的表达了对象间的关系,各个业务类之间的调用。

缺点:配置文件的读取和解析需要花费一i的那个的时间,配置文件过多的时候难以管理。

 

annotation方式

优点

1,在class文件中,可以降低维护成本,注解机制的配置很明显较xml简单

2,不需要第三方的解析工具,利用Java反射技术就可以完成。

3,编辑期可以验证正确性,差错变得容易

4,提高开发效率

缺点

1,如果需要对注解进行修改,那么要重新编译整个工程

2,业务类之间的关系不如xml配置那样清晰

3,如果在程序中注解较多,直接影响代码质量。

 

采用注解配置简单,编码简单易读,但是具体用什么还是要看场景,多数情况下采用注解和xml混合的方式进行配置。

 

10.使用Annotaion的时候需要有哪些配置,他的加载过程是怎么样的?

使用注解,我们要在配置文件中使用context:annotation-config标签,隐式的向spring容器注册各种bean,另外还可以配置context:component-scan base-package标签。

 

11.什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?

Filter:过滤器,主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。

Interceptor: 拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

区别:

1. Filter是基于函数回调的,而Interceptor则是基于Java反射的。

2. Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。

3. Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。

4. 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。所以Fileter配置在web.xml中,而Interceptor配置在springmvc-servlet.xml中.

 

Filter和Interceptor的执行顺序:

执行顺序. 过滤前-拦截前-控制器执行-拦截后-过滤后

 

Interceptor和AOP可以看作是类似的,因为其内部实现原理都是利用JAVA的反射机制(AOP是使用动态代理,动态代理的实现就是java反射机制).

但是Filter和Interceptor有本质上的区别.其实先是通过回调函数.两者的控制粒度也不同,AOP和Interceptor的控制粒度都是方法级别,但是Filter的控制粒度就是servlet容器,它只能在servlet容器执行前后进行处理.

 

12.生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json

一种是使用json-taglib,另一种是使用@ResponseBody注解。

因为使用jsontaglib可以嵌套组合,可以适应多种场合。

13.一份规范的接口文档应该包括什么内容,衡量接口(API)设计好和坏的准则是什么?

接口文档是什么

在项目开发汇总,web项目的前后端是分离开发的。应用程序的开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。

 

内容应包括:修订历史,接口信息,功能描述,接口参数说明,返回值说明,接口调用限制,接口调用安全方面,文档维护。

 

好的API接口:

对于用户来说必须满足以下几个点:

• 易学习:有完善的文档及提供尽可能多的示例和可copy-paste的代码,像其他设计工作一样,你应该应用最小惊讶原则。

• 易使用:没有复杂的程序、复杂的细节,易于学习;灵活的API允许按字段排序、可自定义分页、 排序和筛选等。一个完整的API意味着被期望的功能都包含在内。

• 难误用:对详细的错误提示,有些经验的用户可以直接使用API而不需要阅读文档。

 

对于开发人员来说:

• 易阅读:当调试或者修改的时候都需要对代码进行阅读。

• 易开发:最小化的接口是使用尽可能少的类以及尽可能少的类成员。这样使得理解、记忆、调试以及改变API更容易。


14.HttpHeader里面包含哪些字段,每个字段都有哪些含义?

Accept

作用: 浏览器端可以接受的媒体类型,

Accept-Encoding:

作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);

Accept-Language

作用: 浏览器申明自己接收的语言。 

语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;

Connection

例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

Host(发送请求时,该报头域是必需的)

作用: 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的

Referer

当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理

User-Agent

作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.


15.Content-type中的数据类型,在Spring MVC中都怎么接收数据?

Content-Type使用的是 “主类型/子类型; 额外参数” (  [type]/[subtype]; parameter )的数值格式。

常用的三种类型

1)application/x-www-form-urlencoded:浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码,大部分服务端语言都对这种方式有很好的支持。

 

2)multipart/form-data:使用表单上传文件时,必须让 form 的 enctyped 等于这个值。

 

3)application/json:目前最流行的请求头格式,告诉服务端消息主体是序列化后的 JSON 字符串。可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。

 

16.Put请求在Linux下的Tomcat或者是Resin中会收不到数据,怎么解决这个问题,原因是什么?为什么本地使用Jetty的时候往往是正常的?

页面直接发送put请求到tomcat服务器,tomcat是不会封装put请求的。

17.War包是什么,为什么WEB服务通常打出来的都是War包?除了War包,还有几种打包格式,他们之间的区别呢?

Java web工程,都是打成war包,进行发布,打成war包的好处是不会缺少目录,并且只管理好一个发布文件就好,并且tomcat服务器能够自动识别,将war包放在tomcat容器的webapps下,启动服务,即可运行该项目,该war包会自动解压出一个同名的文件夹。

除此之外,还有jar和ear

18.maven常用的打包插件有哪些?有什么区别?如何使用 ?

1, maven-resources-plugin

Maven可以区别对待Java代码文件和资源文件,默认的主资源文件目录是src/main/resources,我们可以通过这个插件实现资源文件过滤。资源文件过滤的意思是指我们可以在资源文件里用使用占位符${propertyName},然后开启对资源文件的过滤,pom里再统一设置所有{propertyName}对应的值,就可以在构建过程中将值替换掉资源文件中对应的${propertyName},实现了代码配置分离、做到了参数的统一维护。

2,maven-jar-plugin

当我们将项目模块化后,有一些通用的资源文件基本上大多数模块都会用到,比如log4j.properties,jdbc.properties等,模块中有了这些资源文件,我们才能单独对该模块进行开发、调试。默认情况下maven-jar-plugin会将这些资源文件全部package成一个jar包进行发布,如果这样的jar包集成到一个主应用中部署,运行,很可能导致主应用的配置不生效,我称之为配置混乱,为了解决这个问题,可以开启maven-jar-plugin的排除功能,在执行mvn package之前排除指定的资源文件。

3,maven-war-plugin

项目如果是web主应用,我们可以使用maven-war-plugin来对webapps下各类文件进行过滤。

4,maven-assembly-plugin

Java项目中有一种类型的主应用,是需要独立部署在后台启动的,比如socket服务程序,比如定时调度程序,比如dubbo服务程序,这些程序理论上只需要执行一个简单的java命令即可;稍微复杂一些的,我们可以规范一下自己的主应用结构,定义配置文件夹和依赖库文件夹,再准备启动的批处理脚本sh或bat文件即可。使用maven-assembly-plugin就可以达到这种效果。

5,maven-shade-plugin

有时候,我们需要将所有配置文件和依赖库文件全部放在一个jar包中,运维的同事只需要执行java -jar batch.jar即可完成启动。虽然使用maven-assembly-plugin也可以做到这一点,但是在读取配置文件的时候有可能会遇到一些问题,这个时候,我们可能需要使用到maven-shade-plugin这个插件



明天计划的事情:

把后面的深度思考整理完.

遇到的问题:

收获:

感觉整理深度思考的过程会遇到很多自己没有想到的点,确实符合深度思考的主题,不过当然现在这个整理的过程对于这些知识点的挖掘是比较粗浅的,之后后面慢慢加深了.

进度:任务二

任务开始时间:3.23

预计demo时间:4.3

是否延期:是

由于没有正确预估任务难度,和后续的整理代码的时间,因此造成任务延期.

以后一定吸取教训,要对一个项目的各方面都要去考虑到,才能给出一个合理的demo时间.

禅道地址:http://task.ptteng.com/zentao/project-task-562.html



返回列表 返回列表
评论

    分享到