发表于: 2017-11-22 23:14:14

1 692


一.今日完成

把任务二~任务九深度思考梳理完

Task02

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

Representational State Transfer的缩写。"表现层状态转化"。如果一个架构符合REST原则,就称它为RESTful架构。

支持GETDELETEPUTPOST.

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

RESTful架构风格规定,数据的元操作,即CRUD(create, read, updatedelete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。

get到底,堪比万金油;URL格式混乱.

3.了解mavenmodule

一个项目往往是由多个 project 构成的,在进行构建(build)时,针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大降低效率。Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父 POM 中。

父模块不需要有源代码和资源文件,即没有 src/main/java src/test/java 目录。Maven首先解析父模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。将各子模块聚合到父模块中后,我们就可以对父模块进行一次构建命令来完成全部模块的构建。

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

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource IdentifiersURI)来标识。

GET

向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法

POST

向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

常见的Content-Type:

(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

状态代码的第一个数字代表当前响应的类型:

1xx消息——请求已被服务器接收,继续处理

2xx成功——请求已成功被服务器接收、理解、并接受

3xx重定向——需要后续操作才能完成这一请求

4xx请求错误——请求含有词法错误或者无法被执行

5xx服务器错误——服务器在处理某个正确请求时发生错误.

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

TCP/IP 指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol)。是供已连接因特网的计算机进行通信的通信协议。

TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。

三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

第一次握手(SYN=1, seq=x):

客户端发送一个 TCP SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。

发送完毕后,客户端进入 SYN_SEND 状态。

第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):

服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 1,即X+1 发送完毕后,服务器端进入 SYN_RCVD 状态。

第三次握手(ACK=1ACKnum=y+1)

客户端再次发送确认包(ACK)SYN 标志位为0ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN+1

发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

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

Web服务是一种服务导向架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。

根据W3C的定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们透过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。

RPC,SOAP,RESTFUL

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

(1)机制:spring mvc的入口是servlet,而struts2filter,这样就导致了二者的机制不同。

(2)性能:spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。

(3)参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。

(4)设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。

(5) intercepter的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful urlstruts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

(6)另外,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。

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

<web-app>

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/root-context.xml</param-value>

    </context-param>

    <servlet>

        <servlet-name>dispatcher</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value></param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>dispatcher</servlet-name>

        <url-pattern>/*</url-pattern>

    </servlet-mapping>

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

</web-app>

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

注释配置相对于 XML 配置具有很多的优势:

它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。

注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

注释配置不一定在先天上优于 XML 配置。如果 Bean 的依赖关系是固定的,(如 Service 使用了哪几个 DAO 类),这种配置信息不会在部署时发生调整,那么注释配置优于 XML 配置;反之如果这种依赖关系会在部署时发生调整,XML 配置显然又优于注释配置,因为注释是对 Java 源代码的调整,您需要重新改写源代码并重新编译才可以实施调整。

如果 Bean 不是自己编写的类(如 JdbcTemplateSessionFactoryBean 等),注释配置将无法实施,此时 XML 配置是唯一可用的方式。

注释配置往往是类级别的,而 XML 配置则可以表现得更加灵活。比如相比于 @Transaction 事务注释,使用 aop/tx 命名空间的事务配置更加灵活和简单。

所以在实现应用中,我们往往需要同时使用注释配置和 XML 配置,对于类级别且不会发生变动的配置可以优先考虑注释配置;而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置。Spring 会在具体实施 Bean 创建和 Bean 注入之前将这两种配置方式的元信息融合在一起。

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

Spring 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO 类上即可。同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用 Bean 的自动扫描功能,这可以通过 <context:component-scan/> 实现。

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

Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filter再对服务器响应进行后处理。

Filter有如下几个用处。

HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest

根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。

HttpServletResponse到达客户端之前,拦截HttpServletResponse

根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

Filter有如下几个种类。

用户授权的FilterFilter负责检查用户请求,根据请求过滤用户非法请求。

日志Filter:详细记录某些特殊的用户请求。

负责解码的Filter:包括对非标准编码的请求解码。

能改变XML内容的XSLT Filter等。

Filter可以负责拦截多个请求或响应;一个请求或响应也可以被多个Filter拦截。

创建一个Filter只需两个步骤

创建Filter处理类

web.xml文件中配置Filter

创建Filter必须实现javax.servlet.Filter接口,在该接口中定义了如下三个方法。

void init(FilterConfig config):用于完成Filter的初始化。

void destory():用于Filter销毁前,完成某些资源的回收。

void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):实现过滤功能,该方法就是对每个请求及响应增加的额外处理。该方法可以实现对用户请求进行预处理(ServletRequest request),也可实现对服务器响应进行后处理(ServletResponse response)—它们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。

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

WebWork的中文文档的解释为—拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个Action执行前阻止其执行。同时也提供了一种可以提取Action中可重用的部分的方式。

拦截器将Action共用的行为独立出来,在Action执行前后执行。这也就是我们所说的AOP,它是分散关注的编程方法,它将通用需求功能从不相关类之中分离出来;同时,能够共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。

 

拦截器将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为就有很好的重用性。

当你提交对Action(默认是.action结尾的url)的请求时,ServletDispatcher会根据你的请求,去调度并执行相应的Action。在Action执行之前,调用被Interceptor截取,InterceptorAction执行前后执行。

创建Interceptor必须实现com.opensymphony.xwork2.interceptor.Interceptor接口,该接口定义了如下三个方法。

void init():在该拦截器被实例化之后,在该拦截器执行拦截之前,系统将回调该方法。对于每个拦截器而言,其init()方法只执行一次。因此,该方法的方法体主要用于初始化资源。

void destory():该方法与init()方法对应。在拦截器实例被销毁之前,系统将回调该拦截器的destory方法,该方法用于销毁在init方法里打开的资源。

String intercept(ActionInvocation invocation):该方法是用户需要实现的拦截动作。就像Actionexecute方法一样。intercept方法会返回一个字符串作为逻辑视图。如果该方法直接返回了一个字符串,系统会将跳转到该逻辑视图对应的实际视图资源,不会调用被拦截的Action。该方法的ActionInvocation参数包含了被拦截的Action的引用,可以通过调用该参数的invoke方法,将控制权转给下一个拦截器,或者转给Actionexecute方法(如果该拦截器后没有其他拦截器,则直接执行Actionexecute方法)

FilterInterceptor的区别

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

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

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

Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。

action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

FilterInterceptor的执行顺序

过滤前-拦截前-action执行-拦截后-过滤后

Interceptor spring AOP的區別

1.spring Interceptor也是一種aop思想,我們這裡面的spring AOP主要是講aop應用,interceptor 的使用場合比aop小很多,顧名思義,它是攔截一些action請求,但是比aop使用起來簡便,而且session資訊能夠獲得,符合分層的設計,所以個人優先使用interceptor.

2.Interceptor可以阻止程式碼執行下去,當preHandle返回false,那么這個請求就到此結束,真正的被攔截了,但是aop不能,它只是單純的切入新增操作

3.aop使用的動態代理,而interceptor基於反射機制。所以,aopproceedingJoinPoint能夠提供更多的引數

4.aop能夠控制被攔截方法的執行時間,即什么時候執行,但是必須要執行,一般都是在@Around advice中。

5.aoppointcut也就能夠讓它更靈活的去做一些切面工作,同時,非請求的方法,只能使用aop

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

org.jsonJson-libGsonJacksonFastjson

Java Bean序列化为Json,性能:Jackson > FastJson > Gson > Json-lib。这4中类库的序列化结构都正确。

Json字符串反序列化为Java Bean时,性能:Jackson > Gson > FastJson >Json-lib。并且JacksonGsonFastJson可以很好的支持复杂的嵌套结构定义的类,而Json-lib对于复制的反序列化会出错。

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

封皮

封面最好是本公司规定的封面,有logo,内容标题,版本号,公司名称,文档产生日期。(错误地方在于,文档的标题要和页眉中的标题一致)

修订历史

表格形式较好些。包括,版本,修订说明,修订日期,修订人,审核时间审核人。

接口信息

接口调用方式,是post方式还是get方式,接口地址,别人需要线上的哪个地址就写哪个。(自己提前测试好线上的这个接口,是否有其他问题,千万别犯低级的错误,尤其是某个字母写错)

功能描述

一定要清晰的描述接口功能。(不要遗漏一些细节,比如接口获取的信息不包括哪些哪些要写明白)

接口参数说明

每个参数都要和实际中调用的一样,包括大小写;参数的含义言简意赅的说明;格式,是string 还是int 还是long等格式(例如参数为@RequestParam("appKey") String appKey, @RequestParam("randomId") Integer randomId);说明部分,说明参数值是需要哪个公司提供,并详细说明参数怎么生成的,例如时间戳,是哪个时间段的;参数是否必填,一些参数是必须要有的,有些是可选参数,一定要注意写清晰。

返回值说明

(1)有一个模板返回值,并说明每个返回参数的意义。

(2)提供一个真实的调用接口,真实的返回值。

(3)接口调用限制,接口调用安全方面

(4)为了接口安全,我们可以进行md5加密方式,或者自己公司一个特殊的加密过程,只要双方采用一致的加密算法就可以调用接口,保证了接口调用的安全性。

文档全局方面

文档大标题的字体字号一致,小的分标题一致,正文部分字号也要一致。文章整体字的类别一致,我认为微软雅黑字体样式给人感觉比较清晰。文档目录,自动生成的目录会添加些许的修饰,去掉不整齐的部分,得到一个整齐的目录格式。

文档维护

文档在维护的时候,如有修改一定要写上修改日期,修改人,对大的修改要有版本号变更。

好文档标准检验

我认为检验一个文档写的是否好,主要还是在内容方面,内容是否仔细没有疏漏之处。是否发给别人使用的时候,无需沟通就能把接口调通。别人通过成功的把接口调通,这就是一个好文档。

总结

虽然对于敏捷开发来说项目不需要需求,设计,详细设计等文档,但是在和别的公司在调用接口的时候,是一定要总结成文档的,形成接口规范,文档规范。昨天看到微信分享的一篇文档,叫做《教养,就是让别人舒服》,我想在写文档的时候,把自己当做看文档的人,怎么写让别人舒服,我想这就是写文档的“教养”吧。

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

(1)通用首部:即可以出现在请求报文中也可以出现在响应报文中

a.Connection:允许客户端和服务器指定与请求/响应连接有关的选项

b.Date:提供日期和时间标志,说明报文是什么时间创建的

c.MIME-Version:给出了发送端使用的MIME版本;

d.Trailer:如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合.

e.Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式.

f.Update:给出了发送器可能想要”升级”使用的新版本或协议

g.Via:显示了报文经过的中间节点(代理,网关)

HTTP/1.0引入了第一个允许HTTP应用程序缓存对象本地副本的首部,这样就不需要总是从源端服务器获取了.

Cache-Control:用于随报文传送缓存指示

Pragma:另一种随报文传送指示的方式,但并不专用于缓存.

(2)请求首部:只在请求报文中有意义的首部,提供更多有关请求的信息

请求的信息性首部

a.Client-IP 提供了与你选哪个客户端的机器的IP地址

b.Prom 提供了客户端用户的E-mail地址

c.Host  给出了接收请求的服务器的主机名和端口号

d.Referer:提供了包含当前请求的URI的文档的URL

e.UA-Color:提供了与客户端显示器的显示颜色有关的信息

f.UA-CPU:给出了客户端CPU的类型或制造商

g.UA-Disp:提供了与客户端显示器(屏幕)能力有关的信息

h.UA-OS:给出了运行在客户端机器上的操作系统名称及版本

i.UA-Pixels:提供了客户端显示器的像素信息

User-Agent:将发起请求的应用程序名称告知服务器

1)Accept首部

Accept首部为客户端提供了一种将其喜好和能力告知服务器的方式,包括它们想要什么,可以使用什么,以及最重要的,它们不想要的.

Accept, Accept-Charset, Accept-ncoding, Accept-Language,TE

2)条件请求首部

通过条件请求首部,客户端为请求加上限制,要求服务器在对请求进行响应之前,确保某个条件为真.

Expect,If-Match,If-Nodified-Since, If-None-Match, If-Range, If-Unmodified-Since,

Range.

3)安全请求首部

HTTP本身支持一种简单的机制,可以对请求进行质询/响应.

Authorization,Cookie,Cookie2

4)代理请求首部

Max-Forward,Proxy-Authorization,Proxy_Connection

(3)响应首部:提供更多有关响应的信息

请求的信息性首部

a.Age: 从最初创建开始响应持续时间

b.Public:服务器为其资源支持的请求方法列表

c.Retry-After:如果资源不可用的话,在此事件或日期重试.

d.Server:服务器应用程序软件的名称和版本

e.Title:HTML文档来说,就是HTML文档的源端给出的标题

f.Warning:比原因短语更详细的警告报文

1)协商首部

如果资源有多种表示方法,比如服务器上有某文档的法语和德语译稿,HTTP/1.1可以为服务器和客户端提供对资源进行协商的能力.

Accept-Ranges,Vary.

2)安全协商首部

HTTP的质询/响应认证机制的响应侧.

Proxy-Authenticate,Set-Cookie,Set-Cookie2,WWW-Authenticate

(4)实体首部:描述实体的长度和内容或者资源本身,两种类型的报文中都可能出现实体首部.

请求的信息性首部

a.Allow:列出可以对此实体执行的请求方法.

b.Locaton:告知客户端尸体实际上处于何处用于将接收端定向到资源的位置上.

1)内容首部

提供了与实体内容有关的特定信息,说明了其类型,尺寸以及处理它所需的其他有用信息.

Context-Base, Context-Encoding, Context-Language, Context-Length, Context-Location, Context-MDS, Context-Range, Context-Type

2)实体缓存首部

通用的缓存首部说明了如何或者什么时候进行缓存.实体的缓存首部提供了与被缓存实体有关的信息.

ETag,Expires,Last-Modified.

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

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

使用HttpMessageConverter<T>接口负责将请求信息转换为对象,将对象输出为响应信息.

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

tomcat本身就是不支持PUT delete请求的,tomcat默认只有在POST请求的时候,tomcat才会通过getparameter() 方法取得 请求体 中的相应的请求参数的数据。而PUT请求的请求体中数据则默认不会被解析。

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

JAR

WAR

EAR

英文

Java Archive file

Web Archive file

Enterprise Archive file

包含内容

classproperties文件,是文件封装的最小单元;包含Java类的普通库、资源(resources)、辅助文件(auxiliary files)等

ServletJSP页面、JSP标记库、JAR库文件、HTML/XML文档和其他公用资源文件,如图片、音频文件等

除了包含JARWAR以外,还包括EJB组件

部署文件

application-client.xml

web.xml

application.xml

容器

应用服务器(application servers

小型服务程序容器(servlet containers

EJB容器(EJB   containers

级别

Java的打包jarwarear包的作用、区别、打包方式:

1 作用与区别

i.  jar:通常是开发时要引用通用(JAVA)类,打成包便于存放管理;

ii. war:是做好一个(web)应用后,通常是网站,打成包部署到容器中;

iii. ear 企业级应用,实际上EAR包中包含WAR包和几个企业级项目的配置文件而已,一般服务器选择WebSphere等,都会使用EAR包。通常是EJB打成ear包。

2、打包方式

i. 所有的包都是用jar打的,只不过目标文件的扩展名不一样;

ii. 也可以用Ant来安成构建。

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

(1) 使用maven-jar-pluginmaven-dependency-plugin插件打包

(2) 使用maven-assembly-plugin插件打包;

(3) 使用maven-shade-plugin插件打包

使用方式:http://blog.csdn.net/xiao__gui/article/details/47341385

19.jetty,resin,tomcat的差别在哪里,在线上服务应该选择哪一种WEB服务器?

TomcatResin的区别

相同点:他们都是用java编写的,都是web服务器,并且支持集群部署。

不同点:

(1)速度方面,ResinTomcat2倍以上,不过Tomcat也很快,所以这个差别几乎感受不到。

(2)开关机制上方面,Resin要比Tomcat好,比如修改了配置文件之后,Resin是会自动重启的,而Tomcat需要人工手动关闭并重启。

(3)报错方面,Tomcat比较详细,一个小小的错误也会用大篇幅来描述,而Resin则相对简洁明确一些。

TomcatJetty的区别:

相同点:他们同样是用java编写,都是一种Servlet引擎,他们都支持标准的servlet规范和JavaEE的规范。

不同点:

(1)架构方面,Jetty的架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现,扩展简单。 Tomcat的架构是基于容器设计的,进行扩展是需要了解Tomcat的整体设计结构,不易扩展。

 

(2)灵活性方面,Jetty更灵活,体现在其可插拔性和可扩展性,更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的Web Server 相比之下,重量级的Tomcat因为本来就支持过多特性,要对其精简,比对jetty进行拓展都更难。

(3)处理性能方面,Tomcat适合处理少数非常繁忙的链接,也就是说链接生命周期短的话,Tomcat的总体性能更高。另外,Jetty在处理静态资源时,性能优于Tomcat

21.如果有多个WEB服务,都把WEB服务都配置在一个容器里,还是一个WEB配置一个容器,他们的差别是什么,你觉得哪种方式更好?

一般来说,多实例部署tomcat,可以充分利用系统资源,不过这种方式,也有几个方面需要考虑:

多实例tomcat的更新维护,例如对tomcat进行升级等操作,我们需要考虑如何能“优雅”地对所有实例进行升级

尽量不要影响应用程序,在更新tomcat时,一不小心就把conf目录等全部覆盖,所以尽量要把配置文件和安装目录隔离

对于单应用来说,如果将war包分别置于各个tomcatwebapps目录,那么在发布新版本的war时,可能会出现某个实例更新失败,导致用户在访问时可能会访问到不同版本的web app,因此,比较好的方式就是所有tomcat实例都统一指向同一个应用程序

22.Linux服务器上部署的时候,一般都要有哪些脚本,这些脚本该怎么编写?

Startup.sh,shutdown.sh,deploy.sh

23.域名和端口号是怎么对应起来的?应该通过域名访问吗,从域名服务商到服务器的流程是怎么样的?

域名和IP地址之间有区别也有联系,域名通常会和IP进行绑定,通过访问域名来访问网络上的主机的服务。IP地址通常指的是网络中的主机,而域名则通常表示一个网站,一个域名可以绑定到多个ip上,多个域名也可以绑定到一个ip上。

24.Nginx的作用是什么,在WEB服务前端配置Nginx的好处是什么,除了Nginx,还有别的反向代理服务器吗?

NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. NGINX is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption.

Nginx 以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡。其拥有匹配 Lighttpd 的性能,同时还没有 Lighttpd 的内存泄漏问题,而且 Lighttpd mod_proxy 也有一些问题并且很久没有更新。

Apache HTTP

25.Controller里应该怎么处理Service的异常,大段的Try Catch 会有什么坏处?

Spring MVC处理异常有3种方式:

1)使用@ExceptionHandler注解实现异常处理;

2)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver

3)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;

http://cgs1999.iteye.com/blog/1547197

26.Service返回的结果是否要判空,为什么?

返回null是没问题的,不过在编程中返回null是一个非常不好的习惯.首先如果A方法调用B方法,B方法返回一个null 假设A方法没有进行检查直接传递给了调用它的C方法,C方法也没有检查直接装进model里返回给视图层了,视图层从model 拿数据也没检查直接就调用属性造成该视图创建失败.

(1)optionalJava8中新加入的特性,主要是为了解决NullException问题.上面说过绝大多人 使用null仅仅是为了表示空,Java8optional能够更好的表示这个概念还能避免NullException.

(2)使用抛出异常替代返回null

如果当前方法会出现没有数据可返回的情况时可抛出检查型异常(自定义),让调用方必须捕获该异常 调用方捕获到该异常就会知道没有值可以返回.可以自行做出相应的动作.

27.Service返回的结果是否要打日志,应该打什么样的日志,为什么?

需要.

28.该怎么模拟假数据,为什么在真实项目中,我们通常都是先定义接口,再写假数据,再去写业务逻辑?

在谈到Mock(模拟)时,你只需关心三样东西:设置测试数据,设定预期结果,验证结果。一些单元测试方案根本就不涉及这些,有的只涉及设置测试数据,有的只涉及设定预期结果和验证。

模拟假数据,不是模拟垃圾数据。假数据仅仅是指数据不真实,并不代表着数据可以随便填。模拟数据的时候要保证数据的多样性,1是要尽可能的模拟正常使用的情况;2是要尽可能的模拟异常的情况

29.PostMan是什么,为什么要使用它来测试接口,除了Postman,还有哪些工具可以测试?

A powerful GUI platform to make your API development faster & easier, from building API requests through testing, documentation and sharing.

JMeter, RESTClient, SoapUI,TestNG

30.Linux服务器上,有哪些工具是可以测试接口的,怎么用Wget或者是Curl分别发送Rest的四种请求?

restclienthttpieab

Curl

-X/--request [GET|POST|PUT|DELETE|] 使用指定的HTTP method 发出指定的request

-H/--header XX:XXX 设定requestheader

-i/--include 显示responseheader

-d/--data XX=XXX 设定HTTP parameters

-v/--verbose 输出比较多的信息

-u/--user 使用者帐密

-b/--cookie 使用cookie

http://blog.csdn.net/hzraymond/article/details/8181349

31.内网IP和外网IP的区别是什么,在服务器上测试接口是否被防火墙屏蔽的时候,该用内网IP检测,还是该用外网IP检测?

内网IP地址、外网IP地址这个概念并不是固定的,而是相对的。

外网IP

32.端口是什么含义,怎么判断一个端口是否被占用了,如何判断一个端口是否被防火墙拦截,怎么用Telnet判断端口号是否打开?

(1)端口广义概念

 端口(port),可以认为是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如:USB端口、串行端口等。软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区。

(2)端口狭义概念

网络中可以被命名和寻址的通信端口是操作系统的一种可分配资源。由网络OSI(开放系统互联参考模型,Open System Interconnection Reference Model)七层协议可知,传输层与网络层最大的区别是传输层提供进程通信能力, 网络通信的最终地址不仅包括主机地址,还包括可描述进程的某种标识。所以TCP/IP协议提出的协议端口,可以认为是网络通信进程的一种标识符。

IP tablesUFW状态查看

34.C标签是什么,为什么要使用C标签,有哪些常见的指令?

JSTL 核心标签库标签共有13个,功能上分为4类:

1.表达式控制标签:outsetremovecatch

2.流程控制标签:ifchoosewhenotherwise

3.循环标签:forEachforTokens

4.URL操作标签:importurlredirect

http://uule.iteye.com/blog/1607757

task03

1.      nginx服务器有什么作用?什么叫反向代理?为什么要使用反向代理?

反向代理(Reverse Proxy)方式是指用代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

举个例子,一个用户访问 http://www.example.com/readme,但是 www.example.com 上并不存在 readme 页面,它是偷偷从另外一台服务器上取回来,然后作为自己的内容返回给用户。但是用户并不知情这个过程。对用户来说,就像是直接从 www.example.com 获取 readme 页面一样。这里所提到的 www.example.com 这个域名对应的服务器就设置了反向代理功能。

反向代理服务器,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

正向代理

既然有反向代理,自然也有正向代理。简单来说,正向代理就像一个跳板,例如一个用户访问不了某网站(例如 www.google.com),但是他能访问一个代理服务器,这个代理服务器能访问 www.google.com,于是用户可以先连上代理服务器,告诉它需要访问的内容,代理服务器去取回来返回给用户。例如一些常见的翻墙工具、游戏代理就是利用正向代理的原理工作的,我们需要在这些正向代理工具上配置服务器的 IP 地址等信息。

2.什么是ssh?如何在linux服务器上从网站下载文件?

Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定;SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。

SSH协议框架中最主要的部分是三个协议:

传输层协议(The Transport Layer Protocol):传输层协议提供服务器认证,数据机密性,信息完整性等的支持。

用户认证协议(The User Authentication Protocol):用户认证协议为服务器提供客户端的身份鉴别。

连接协议(The Connection Protocol):连接协议将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用。

同时还有为许多高层的网络安全应用协议提供扩展的支持。

各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。

ftp,scp,axel,wegt

2.如何写shell脚本?尝试自己编写一个简单脚本。

hell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompsonsh是第一种Unix ShellWindows Explorer是一个典型的图形界面Shell

shell脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shellshell script是两个不同的概念。

4.tomcatjettyresin各容器有什么区别?如何优化这些容器配置?

参见任务2深度思考.

Task04

1.什么是jsp

Java Server pages是一种帮助软件开发人员根据HTMLXML或者其他文档类型来创建动态WEB页面的技术,由Sun Microsystems1999年发布;目前最新版本是2.3,符合JSR245标准。JSP类似PHPPersonal Home Page)和ASPActive Server Pages),但是它使用Java语言编写。

部署和运行JSP需要一台安装servlet container的可兼容的web服务器,常用的servlet container包括Apache TomcatJettyResin等。

3.熟练使用c标签,el表达式。

http://www.runoob.com/jsp/jsp-expression-language.html

4.为什么要使用tiles框架?

https://openhome.cc/Gossip/SpringGossip/TilesExample.html

http://blog.csdn.net/it_faquir/article/details/72510495

Tiles 框架彻底揭示了 jsp:includes 内部的概念 ―― 从而允许您更灵活地创建可重用的页面。使用 Tiles 框架,开发人员能够通过组合可重用的 tile 来构建页面。您应该将 tile 看作是可视组件。

 

Tile 布局是允许在其上放置其他 tile 的特殊 JSP 页面。 Tile 布局控制了 tile 在页面上的放置位置。从许多方面看来,tile 布局都和模板布局类似。事实上,如果以前使用过 Struts,那么您会注意到 Tile 框架与模板自定义标签库向是后兼容的。

Task05

1.什么是session?什么是cookiesessioncookie有什么区别?什么场景适用于session?什么场景适用于cookie

Cookie是通過客戶端保持狀態的解决方案。從定義上來說,Cookie就是由伺服器發给客戶端(Client)的特殊信息,而這些信息以文本文件的方式存放在客戶端,然後客戶端每次向伺服器發送請求的時候都會帶上這些特殊的信息。

當用戶使用瀏覽器訪問一個支持Cookie的網站的時候,用戶會提供包括用戶名在內的個人信息並且提交至伺服器;接着伺服器在向客戶端回傳相應的超文本的同時也會發回這些個人信息,當然這些信息並不是存放在HTTP響應體(Response Body)中的,而是存放於HTTP響應頭(Response Header.

Session 是搭配 Cookie 的一種技術,Cookie是在客戶端(Client)建立一個文件用來暫存一些資料或是網頁的工作狀態,但因為某些敏感資料存在客戶端會有安全性問題,cookie 雖然很方便,但是使用cookie 有一個很大的弊端,cookie 中的所有數據在客戶端就可以被修改,數據非常容易被偽造,那麼一些重要的數據就不能存放在cookie 中了,因此才衍伸出把敏感資料或狀態儲存在伺服器端(Server) SESSION 方案,把原本客戶端的 Cookie 使用一個很難破解規則的 SessionID 字串來儲存之,並可以透過此 SessionID 到伺服器端呼叫對應各個 Session 值。

而且如果cookie中數據字段太多會影響傳輸效率。為了解決這些問題,就產生了sessionsession 中的數據是保留在伺服器端的。

當程序需要為某個客戶端的請求創建一個 session 的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個 session 標識 (SessionID),如果已包含一個 SessionID 則說明以前已為此客戶端創建過 session,伺服器就按照 SessionID  把這個 session 檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含SessionID ,則為此客戶端創建一個session並且生成一個與此session相關聯的 SessionID ,裡面的值應該是一個既不會重複,又不容易被找到規律以免被仿造的字符串,這個 SessionID 將被在本次響應中返回給客戶端保存。

 

保存這個 SessionID  的方式可以採用 cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發揮給伺服器。一般這個 cookie 的名字都是類似於SEEESIONID

COOKIE SESSION 的比較與區別:

Cookie數據存放在客戶的瀏覽器上,Session 數據放在伺服器上

Cookie不是很安全,別人可以分析存放在本地的 Cookie 並進行 Cookie 欺騙,考慮到安全應當使用 Session

Session會在一定時間內保存在伺服器上。當訪問增多,會占用伺服器的性能。考慮到減輕伺服器性能方面,應當使用 Cookie

單個 Cookie  在用戶端的限制是4K,就是說一個站點在用戶端存放的 COOKIE 不能超過 4K,因此內容必須先想清楚才儲存在 COOKIE 裡面

2.拦截器、过滤器、监听器各有什么作用?

(1)过滤器

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(RequestResponse)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁.

(2)监听器

Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

(3) 拦截器:主要是用在插件上,扩展件上比如 hivernate spring struts2 有点类似面向切片的技术,在用之前先要在配置文件即xml文件里声明一段的那个东西。拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。

拦截器与过滤器的区别

1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5. action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

Task06

1.为什么要使用memcachememcashe有什么作用?

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixihatenaFacebookVoxLiveJournal等众多服务中提高Web应用扩展性的重要因素。

Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。

Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。

本质上,它是一个简洁的key-value存储系统。

2.什么是负载均衡,为什么要做负载均衡?

负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

六大Web负载均衡原理与实现:http://lobert.iteye.com/blog/2159970

3.nginx如何实现负载均衡?

nginx支持以下负载均衡机制(或者方法):

round-robin/轮询: 到应用服务器的请求以round-robin/轮询的方式被分发

least-connected/最少连接:下一个请求将被分派到活动连接数量最少的服务器

ip-hash/IP散列: 使用hash算法来决定下一个请求要选择哪个服务器(基于客户端IP地址)

https://skyao.gitbooks.io/leaning-nginx/content/documentation/HTTP_load_balancer.html

task08

1.什么是rmi?为什么要使用rmi框架?

Java远程方法调用,即Java RMIJava Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

RMI采用的是典型的客户端-服务器端架构。首先需要定义的是服务器端的远程接口,这一步是设计好服务器端需要提供什么样的服务。对远程接口的要求很简单,只需要继承自RMI中的Remote接口即可。RemoteSerializable一样,也是标记接口。远程接口中的方法需要抛出RemoteException。定义好远程接口之后,实现该接口即可。

2.什么是SCA?什么是分布式?分布式有什么优点?

SCA提供了一个编程模型,用于创建基于面向服务架构(Service-Oriented Architecture SOA)的应用程序和解决方案。SCA 所依托的理念是将业务功能作为一系列服务提供,从而创建能满足特定业务需求的解决方案。这些复合集可以包含为已有系统中的应用程序和业务功能创建的新服务,以及作为复合应用的一部分重用的应用程序。

SCA 提供了:

一个用于服务复合以及服务组件创建的模型,包括在 SCA 复合集中重用已有应用程序。

灵活的复合、重用、技术和部署选择,这使它成为了构建异构分布式系统的理想环境。

支持多种实现语言和通信机制。

简化的组件编程模型,用于使用各种技术(比如说 Enterprise JavaBeansJava POJOsSpring beansBPEL ProcessCOBOLC++ PHP 等)来实现业务服务。

2.为什么要把webservice分离?应用了哪些概念?

task09

1.什么是微服务?

微服务是相对较小的自主服务,它们合作完成工作。每个服务都实现一种业务需求。

微服务架构是 Martin Fowler James Lewis 定义的一种架构风格。他们将这种风格描述为"一种使用小型服务构建系统的架构方法,每个服务都在自己的进程中,它们通过轻量型协议进行通信"。有关的更多信息,请参阅 Martin Fowler 编写的"微服务:一个新的架构术语"

每个服务都是相互独立开发和部署的。每个微服务都专注执行一个它所擅长的相对较小的任务。

小型且专注于业务领域;

与技术中立

松散耦合

容易观察

自动化

有界上下文


二.明日计划

梳理禅道和SVN用法,准备进复盘评审.


三.遇到问题

暂无.


四.收获

以上.



返回列表 返回列表
评论

    分享到