发表于: 2018-01-15 17:02:58

4 1917


昨天师兄帮助完成,还有师兄提出的几个要注意的地方更新用put ,删除用delete,这个了解一下怎么用,后面应该用的到的操作----->utf8 的中文乱码---->解决在数据库连接池的几个方面怎么处理乱码的情况
接下来处理----->深度思考的问题
1.什么是restful?rest的请求方法有哪些,有什么区别?
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
1. REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口);
2. Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心。
2.为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的?
REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST提出了一些设计概念和准则:
  1.网络上的所有事物都被抽象为资源(resource); 
  2.每个资源对应一个唯一的资源标识(resource identifier); 
  3.通过通用的连接器接口(generic connector interface)对资源进行操作; 
  4.对资源的各种操作不会改变资源标识; 
  5.所有的操作都是无状态的(stateless)。 
REST允许我们通过url设计系统,就像Test Driven Development允许我们使用testcase设计class接口一样。
(在使用Rest风格之前,大家都是用什么方式写接口的?)
SOAP 
       什么是SOAP,我想不用多说,google一把满眼都是。其实SOAP最早是针对RPC的一种解决方案,简单对象访问协议,很轻量,同时作为应用协议可以基于多种传输协议来传递消息(Http,SMTP等)。但是随着SOAP作为WebService的广泛应用,不断地增加附加的内容,使得现在开发人员觉得SOAP很重,使用门槛很高。在SOAP后续的发展过程中,WS-*一系列协议的制定,增加了SOAP的成熟度,也给SOAP增加了负担。 
REST vs SOAP 
成熟度: 
SOAP虽然发展到现在已经脱离了初衷,但是对于异构环境服务发布和调用,以及厂商的支持都已经达到了较为成熟的情况。不同平台,开发语言之间通过SOAP来交互的web service都能够较好的互通(在部分复杂和特殊的参数和返回对象解析上,协议没有作很细致的规定,导致还是需要作部分修正) 
REST国外很多大网站都发布了自己的开发API,很多都提供了SOAP和REST两种Web Service,根据调查部分网站的REST风格的使用情况要高于SOAP。但是由于REST只是一种基于Http协议实现资源操作的思想,因此各个网站的REST实现都自有一套,在后面会讲诉各个大网站的REST API的风格。也正是因为这种各自实现的情况,在性能和可用性上会大大高于SOAP发布的web service,但统一通用方面远远不及SOAP。由于这些大网站的SP往往专注于此网站的API开发,因此通用性要求不高。 
ASF上考虑发布REST风格的Web Service,可以参考几大网站的设计(兄弟公司的方案就是参考了类似于flickr的设计模式),但是由于没有类似于SOAP的权威性协议作为规范,REST实现的各种协议仅仅只能算是私有协议,当然需要遵循REST的思想,但是这样细节方面有太多没有约束的地方。REST日后的发展所走向规范也会直接影响到这部分的设计是否能够有很好的生命力。 
总的来说SOAP在成熟度上优于REST。 
3.了解maven的module。引用(https://www.jianshu.com/p/b41823e764bf)
1.背景介绍
随着技术的飞速发展和各类用户对软件的要求越来越高,软件本身也变得越来越复杂,然后软件设计人员开始采用各种方式进行开发,于是就有了我们的分层架构,分模块开发,来提高代码的清晰和重用。针对于这一特性,行家也给予了相应的配置。
我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven项目,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时的Maven给出了聚合的配置方式。
所谓聚合,顾名思义,就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven项目。

2.知识剖析
所有用Maven的管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml的。它们之间通过继承和聚合(也称作多模块,多模块)相互关联
在平时的的JavaWeb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为域(域模型层)刀(数据库访问层)服务(业务逻辑层)腹板(表现层),这样分层之后,各个层之间的职责会比较明确,后期维护起来也相对比较容易,今天我们就是使用的Maven来构建以上的各个层。
Maven的多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。
项目层次的划分替代包层次的划分的好处:
(1)方便重用,如果你有一个新的摆动项目需要用到的应用-DAO和应用程序服务,添加对它们的依赖即可,你不再需要去依赖一个WAR。而有些模块,如应用程序,UTIL ,完全可以渐渐进化成公司的一份基础工具类库,供所有项目使用。这是模块化最重要的一个目的。
(2)由于你现在划分了模块,每个模块的配置都在各自的的pom.xml里,不用再到一个混乱的纷繁复杂的总的POM中寻找自己的配置。
(3)如果你只是在应用-DAO上工作,你不再需要建立整个项目,只要在应用-DAO目录运行MVN命令进行建立即可,这样可以节省时间,尤其是当项目越来越复杂,建越来越耗时后。
(4)某些模块,如APP-util的被所有人依赖,但你不想给所有人修改,现在你完全可以从这个项目结构出来,做成另外一个项目,SVN只给特定的人访问,但仍提供罐子给别人使用。
4.什么是http协议?Get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?
HTTP协议:
客户端和服务器交互需要制定一套标准的协议规范(HTTP其中的一种)
http架构清晰,分为请求报文和响应报文两部分 分别针对客户端和服务器 对应的端根据对应的报文部分按照要求完成操作就可以实现交互
使用广泛,特点:短连接,(客户端请求成功之后自动断开) 单向:客户端向服务器发送请求
其他的协议:
FTP协议:专门用于文件请求
UDP/TCP:链接协议socket
Mail协议:专门的邮件协议
Charles:网络接口抓包
请求报文:请求行,请求头,空行,请求数据。
请求行:请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。
请求头:关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔 请求头部通知服务器有关于客户端请求的信息
空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头
请求数据:请求数据不在GET方法中使用而是在POST方法中使用。
HTTP协议的请求方法有GETPOST
HEADPUTDELETEOPTIONSTRACECONNECT
Get:要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端 特点:请求格式比较固定 服务器url地址?请求的参数 get请求一般数据都是直接追加到url后面不用写到请求数据部分,那么长度就会受到限制 一般最多只能识别1024个字符,数据暴漏在url后面不安全
POST:请求的数据放到了对应的请求数据区里面所以相比较get请求要安全,同时长度不会像get请求一样有对应的限制
响应报文:状态行、消息报头、响应正文
状态行:协议版本号  状态码  此次请求是否ok
消息报头:content-type 类型  
响应正文:返回的数据
关于HTTP请求GET和POST的区别
1.GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=你 好。如果数据是英文字母/数字,原样发送,如果是其他类型的则需要编码后发送
  POST提交:把提交的数据放置在HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据
  因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会显示出数据
2.传输数据的大小:
   首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:
   GET:特定服务器对URL长度有限制,例如IE对URL长度的限制是2048字节。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统以及服务器的支持。
   因此对于GET提交时,传输数据就会受到URL长度的限制。
   POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。 
3.安全性:
    POST的安全性要比GET的安全性高。通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。
HTTP协议结构
HTTP协议格式比较简单,格式如下:
                                             
由上图也可以看出来  HTTP 有两类报文:
请求报文——从客户向服务器发送请求报文。
响应报文——从服务器到客户的回答。
HTTP 请求方法概述:
方法(操作) 意义
GET: 请求读取由URL所标识的信息 参数是放在URL里面的
POST: 给服务器发送数据 参数是放在请求体里面
HEAD: 请求读取由URL所有标识的信息的首部
PUT: 在指明的URL下存储一个文档
OPTION: 请求一些选项的信息
DELETE: 删除指明的URL所标识的资源
TRACE: 用来进行环回测试的请求报文
CONNECT: 用于代理服务器
HTTP状态码
状态码都是三位数字 ,第一位表示状态类别,共分五种,如下:
1xx表示通知消息的,如请求收到了或正在进行处理
2xx表示成功,如接受或知道了
3xx表示重定向,表示要完成请求还必须采取进一步的行动
4xx表示客户端的差错,如请求中有错误的语法或不能完成
5xx表示服务器的差错,如服务器失效无法完成请求
其实常用的状态码并不多,我们把常见的列举在此:
    200 OK:客户端请求成功了,客户端要的东西就在响应报文里了;
    301 Moved Permanently:客户端啊,你要请求的资源已经永久的搬家了,我把他的新地址放到了Location头部域中了;
    302 Moved Temporarily:客户端啊,你要请求的资源临时有事去别的地方了,我把他的位置放到了Location头部域中了,你可以先去那里找他,不过他应该是会回到他自己的家的;
    304 Not Modified:客户端啊,你要请求的资源自从上次你请求之后,就再也没有改动过,我想你是应该早就有这个资源了,所以在响应报文的数据部分我也没有再放这个资源。
    400 Bad Request:客户端发来的请求报文里有语法错误,服务器端实在看不懂了;
    401 Unauthorized:客户端发来的请求不是合法来源的请求,也就是这个客户端是没有被授权的;
    403 Forbidden:服务器端顺利收到了客户端的请求,但是因为某些理由,服务器端拒绝为他提供服务
    404 Not Found:客户端要请求的资源不存在,八成是资源地址写错了;
    500 Internal Server Error:很遗憾,服务器不能给你提供服务了,服务器内部出现了不可预知的问题了;
    502 Bad Gateway:客户端你好,我是请求报文的代理服务器,持有资源的那个服务器在给我发送资源时出问题了;
    503 Server Unavailable:服务器现在是太忙了,暂时不能给你这个客户端提供服务了,或许稍后会恢复。
5.什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?
什么是TCP/IP?
TCP/IP也称"国际协议簇", 即不仅指 TCP/IP协议本身,而且包括与其有关的协议。 TCP为传输控制协议IP为网际协议,是网络层最重要的协议。采用TCP/IP协议通过互联网传送信息可减少网络中的传输阻塞,方便大批量的数据在网上传输,从而提高网络的传输效率。  TCP/IP协议族中包括上百个互为关联的协议,其中有:Telnet
(Remote Login): 提供远程登录功能; FTP (FileTransfer Protocol):远程文件传输协议,允许用户将远程主机上的文件拷贝到自己的计算机上; SMTP (Simple Messagetransfer Protocol):简单信息传输协议,主要用于传输电子邮件;NFS(Network File Server):网络文件服务器,可使多台计算机透明地访问彼此的目录 ; UDP ( User DatagramProtocol):用户数据包协议。
TCP/IP协议的四层结构
第一层:链路层
包括操作系统中的设备驱动程序、计算机中对应的网络接口卡
第二层:网络层
网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。
网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。
第三层:传输层
在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。在传输层定义了两种服务质量不同的协议。即:传输控制协议TCP和用户数据报协议UDP.
TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,
它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。
TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据.
UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。
第四层:应用层
TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。这一层主要的作用有DNS域名解析
第五层:物理层
物理层中,将数据的0,1转换为电压和脉冲传输给物理的传输介质,而相互直连的设备之间使用地址实现传输。这种地址被称为MAC地址,也可称为物理地址或硬件地址。
采用MAC地址,目的是为了识别连接到同一个传输介质上的设备。因此,在这一层中将包含MAC地址信息的首部附加到从网络层转发过来的
数据上,将其发送到网络。
序号:本报文段发送的数据的第一个字节的序号。
确认号:是“确认报文”中期望收到对方下一个报文的第一个数据字节的序号。
若确认号 = N,表明到N-1为止的所有数据都已正确收到。
数据偏移:指的是首部长度,单位是4字节。
控制位:
--紧急URG:TCP会把紧急数据放在发送缓存的最前面,同时也置于报文数据的最前面。
--推送PSH:使接收方尽快将数据交付应用程序,不必等缓存填满后再交付。
--复位RST:TCP连接中出现严重差错,必须释放连接,然后重新建立。
--同步SYN:SYN置1表明这是一个“连接请求”或“连接接受”报文。
--终止FIN:用来释放一个连接。
窗口:指明现在允许对方发送的数据量,因为接收方的缓存是有限的。窗口值是动态变化的。
紧急指针:指出报文段中紧急数据的字节数。
为什么需要采用三次握手?
主要是为了防止两次握手情况下已失效的连接请求报文段突然又传送到服务端,而产生的错误。
第一次
      第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
     第二次
     第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    第三次
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
举例如下:
客户A向服务器B发出TCP连接请求,第一个连接请求报文在网络的某个节点长时间滞留,A超时后认为报文丢失,于是再重传一次连接请求,B收到后建立连接。数据传输完毕后双方断开连接。而此时,前一个滞留在网络中的连接请求到达了服务端B,而B认为A又发来连接请求,若采用的是“两次握手”,则这种情况下B认为传输连接已经建立,并一直等待A传输数据,而A此时并无连接请求,因此不予理睬,这样就造成了B的资源白白浪费了;但此时若是使用“三次握手”,则B向A返回确认报文段,由于是一个失效的请求,因此A不予理睬,建立连接失败。第三次握手的作用:防止已失效的连接请求报文段突然又传送到了服务器。
6.什么是WEBService,实现WEBService有哪些框架,为什么WEBService经常被认为太重了,只有银行和大型国企才会使用的更多有一些?
 框架介绍
1.1      Apache Axis1
Axis本质上就是一个SOAP引擎(Apache Axis is an implementation of the SOAP),提供创建服务器端、客户端和网关SOAP操作的基本框架。但Axis并不完全是一个SOAP引擎,它还包括:
l  是一个独立的SOAP服务器。
l  是一个嵌入Servlet引擎(例如Tomcat)的服务器。
l  支持WSDL。
l  提供转化WSDL为Java类的工具。
l  提供例子程序。
l  提供TCP/IP数据包监视工具。
1.2      Apache Axis2
Apache Axis2相比Apache Axis1更加有效、更加模块化、更加面向xml,支持容易插件模块扩展新功能和特性,例如安全和可靠。Apache Axis2是基于Apache AXIOM,它是一个高性能、pull-based XML对象模型。Apache Axis2的关键特性:
l  解析xml更快。采用自己的对象模型和StAX (Streaming API for XML)。
l  更低的内存占用。
l  支持热部署。新服务加入到系统,无需重启服务。
l  支持异步webservice、
l  MEP支持,灵活支持在WSDL 2.0定义的Message Exchange Patterns (MEPs)
l  更加灵活。引擎给开发人员提供了充足的自由度可扩展客户头信息处理、系统管理、
l  更加稳定性。
l  传输框架不依赖于具体协议。为集成和传输协议(SMTP, FTP, message-oriented middleware, etc)有一个简单和抽象,引擎核心是完全独立于具体的传输协议。
l  支持WSDL。支持WSDL1.1、WSDL2.0。
l  方便集成其他组件(Add-ons)。几个web services已经被集成,包括:WSS4J for security (Apache Rampart), Sandesha for reliable messaging, Kandula which is an encapsulation of WS-Coordination, WS-AtomicTransaction and WS-BusinessActivity.
l  良好的扩展性。
1.3      Codehaus  XFire
XFire核心是一个轻量的基于STAX消息处理模型,用来与SOAP消息交互,它支持不同类型的绑定机制、容器和传输协议。
支持webservice标准- SOAP, WSDL, WS-I Basic Profile, WS-Addressing, WS-Security, etc.
l  高性能SOAP STACK
l  可插拔绑定POJOs, XMLBeans, JAXB 1.1, JAXB 2.0, and Castor support
l  通过Java1.5 和1.4(Commons attributes JSR 181 syntax)使用JSR 181 API配置服务
l  支持多中传输协议- HTTP, JMS, XMPP, In-JVM, etc.
l  可嵌入的和直观的API
l  支持Spring, Pico, Plexus, and Loom
l  支持JBI
l  客户端和服务端stub代码生成
l  支持JAX-WS early access
1.4      Apache CXF
Apache CXF是一个开源服务框架。Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了Celtix和XFire两大开源项目的精华,比如:JAX-WS and JAX-RS,主要特性包括:
l  支持Web services标准。包括:SOAP、the WSI Basic Profile、WSDL、WS-Addressing、WS-Policy、WS-ReliableMessaging、WS-Security、WS-SecureConversation和WS-SecurityPolicy.
l  支持不同类型前端开发模型。CXF实现了JAX-WS APIs,支持JAX-RS开发。
l  容易使用。CXF设计的简洁和直观,具有简洁APIs迅速的构建基于代码的服务,Maven插件使得工具集成更加容易、JAX-WS API支持、Spring 2.x XML使得配置更加容易。
l  支持二进制和遗留协议。CXF被设计为可插拔的架构,在不同的传输协议结合下,不仅支持XML,也支持非XML类型绑定,例如:JSON和CORBA。
1.5 RESTEasy(百度观点较好)
 
RESTEasy是JBoss的一个开源项目,提供各种框架帮助你构建RESTful Web Services和RESTful Java应用程序。它是JAX-RS规范的一个完整实现并通过JCP认证。作为一个JBOSS的项目,它当然能和JBOSS应用服务器很好地集成在一起。但是,它也能在任何运行JDK5或以上版本的Servlet容器中运行。RESTEasy还提供一个RESTEasy JAX-RS客户端调用框架。能够很方便与EJB、Seam、Guice、Spring和Spring MVC集成使用。支持在客户端与服务器端自动实现GZIP解压缩。 (资料少无法比较)
 
有较专业的人士对CXF、Restlet、RESTEasy、Jersey框架测试数据】,他说从性能上看RESTEasy是最好的,Jersey其次(但Jersey连可查阅的英文文档都比较少故个人不推荐使用),cxf和Restlet最差,
 
1.6  Dubbo (个人观点----无理由)
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。(资料少无法比较)
1.7 java6JAX-WS
JAX-WS2.0 (JSR 224)是Sun新的web services协议栈
JAVA中有三种WebService规范,分别是JAX-WS(JAX-RPC)、JAX-RS、JAXM&SAAJ。
JAX-WS(Java API For XML-WebService),JDK1.6 自带的版本为JAX-WS2.1,其底层支持为JAXB。早期的JAVA Web服务规范JAX-RPC(Java API ForXML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC。()
 
1.8  Apache Wink
 
REST(Representational State Transfer)  based Web Service【http://baike.soso.com/v812054.htm】是相对于传统的Web Service(SOAP+WSDL+UDDI)而提出的。传统的Web Service可以很好的解决异构系统之间的通信问题,但是需要首先定义好XML格式的合同(WSDL),client和server都必须严格遵守协议,不容易升级以及集群伸缩。REST Web Service不需要事先定义格式,传输的内容也可以依据不同的client变化(json,xml,html等),最重要的是使用源URL来唯一定位资源,对资源的增删改查映射为HTTP的四个方法,无状态传输,具有非常好的伸缩性。
 
Apache Wink就是一个纯Java的REST框架。它完整的实现了JSR 311并扩展了部分功能,此外还提供了良好的扩展性,难能可贵的是还可以与流行的Java框架Spring无缝集成。目前该项目还在开发中。所谓框架无非就是定义好格式,提供一些工具和钩子,让开发人员可以专注于业务逻辑的开发。
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.xml文件的特点(规则):
必须有且只有一个根节点,大小写敏感,标签不嵌套,必须配对。
二、web.xml文件的作用:
web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。
当你的web工程没用到这些时,你可以不用web.xml文件来配置你的Application。
三、web.xml能做的事情:
在web.xml的模式(Schema)文件中定义了多少种标签元素,web.xml中就可以出现它的模式文件所定义的标签元素,它就能拥有定义出来的那些功能。
而且web.xml的模式文件中定义的标签并不是定死的,模式文件也是可以改变的,一般来说,随着web.xml模式文件的版本升级,里面定义的功能会越来越复杂,也即标签元素的种类会越来越多,但有些是不常用的,我们只需记住一些常用的就可以了。

2.知识剖析
下面列出web.xml文件中的主要标签及其含义:
一、欢迎页面
访问一个网站时,默认看到的第一个页面就叫欢迎页,一般情况下是由首页来充当欢迎页的。一般情况下,我们会在web.xml中指定欢迎页。
但web.xml并不是一个Web的必要文件,没有web.xml,网站仍然是可以正常工作的。只不过网站的功能复杂起来后,web.xml的确有非常大用处,所以,默认创建的动态web工程在WEB-INF文件夹下面都有一个web.xml文件。
二、命名和定制URL
为Servlet和JSP文件命名并定制URL,其中定制URL是依赖命名的,命名必须在定制URL前。
三、定制初始化参数
定制servlet、JSP、Context的初始化参数,然后可以在servlet、JSP、Context中获取这些参数值
四、设置过滤器
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
五、设置监听器
Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

3.常见问题
1.web.xml 文件中一般包括 servlet, spring, filter, listener的配置。那么他们是按照一个什么顺序加载呢?
2.url-pattern配置为"/"和"/*"的区别

4.解决方案
1.加载顺序为: listener >> filter >> servlet >> spring
加载顺序会影响对spring bean 的调用。
比如filter 需要用到 bean ,但是加载顺序是 先加载filter 后加载spring,则filter中初始化操作中的bean为null;
但加载顺序与他们在web.xml文件中的先后顺序无关。
2.其中/和/*的区别:
< url-pattern > /    不会匹配到*.jsp,即:*.jsp不会进入spring的 DispatcherServlet类 。
< url-pattern > /*
会匹配*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。
9.Annotation和XML两种配置的差别,为什么更喜欢使用Annotaion来配置Spring MVC?
web.xml
用途
此文件为servlet规范中规定的文件。用来把我们要用到的servlet,filter,listener等注册给web服务器。算是一个java web应用的入口。
annotation化
Servlet 3.0中定义了一个接口ServletContainerInitializer,web服务器在启动的时候会扫描classpath下面所有实现了该接口的类,并调用它们。实现该接口,通过编码,可以实现与web.xml同样的功能。当然直接使用ServletContainerInitializer比较麻烦,spring及springmvc又给我们提供了一系列的简化,我们直接继承AbstractAnnotationConfigDispatcherServletInitializer即可。
根容器配置文件applicationContext.xml
用途
spring根容器的配置文件,比如说我们的dao啊,service啊一般都是放在根容器中的。
Annotation化
这个很简单,一个普通的java class就行了。类名上一般要加@Configuration和@ComponentScan注解。注意在@ComponentScan的参数中指定要扫描的包名和要过滤的类。@ComponentScan要过滤的类通常有两种:一种是留给mvc容器的,一种是mvc容器本身的配置类。
mvc容器配置文件mvc.xml
用途
mvc容器的配置文件,mvc容器一般包含了Controller,ViewResolver,HandlerMapping等。
Annotation化
10.使用Annotaion的时候需要有哪些配置,他的加载过程是怎么样的?
Annotation的作用:
不是程序本身,可以对程序作出解释(其实这一点,和注释很像)可以被其他程序(比如:编译器)读取(注解信息处理流程,是注解和注释的重大区别,如果没有注解信息处理流程,则注解毫无意义)
Annotation的格式:
注解是以”@注释名”在代码中存在的,还可以添加一些参数值,例如SuppressWarnings(value=”all”)
Annotation在哪里使用
可以附加在package、class、mehod、field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制实现对这些元数据的访问
11.什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?引用(http://blog.csdn.net/u013456370/article/details/44837051)
Filter(过滤器)与Interceptor(拦截器)和Spring AOP
Filter过滤器:拦截web访问url地址。
Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问。
Spring AOP拦截器:只能拦截Spring管理Bean的访问(业务层Service)
12.生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?
一、json-lib 
json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,在Json.org网站上,Java可以使用的解析Json的组件就有21种之多。这里以使用org.json解析JSON为例。在读本文之前,读者有必要了解一下JSON的结构,这里不作介绍。 
首先下载org.json源码,下载地址:https://github.com/douglascrockford/JSON-java,点Downloads,Windows系统就选zip吧。当然你也可以用Git,只是我不太习惯那玩意。下载完后解压,在你的项目里新建一个名为org.json的包,把除README和Test.java以外的所有文件放入该包内(Eclipse只要拖进去就可以),现在我们就可以用org.json解析JSON.为了以后方便,你也可以把org.json这个包打成jar,在要用的项目上导入就行。
String s = "{\"person\":{\"name\":\"张三\",\"age\":20}}"; JSONObject jsonObj = new JSONObject(s); JSONObject  result = jsonObj.getJSONObject("person"); System.out.println("姓名:"+result.getString("name")+" 年龄:"+result.getInt("age"));
s="{\"persons\":[\"张三\",\"李四\",\"王五\"]}"; jsonObj = new JSONObject(s);JSONArray; jsonarr=jsonObj.getJSONArray("persons");for(int i=0;i<jsonarr.length();i++) {   System.out.println(jsonarr.getString(i)); }
二、开源的Jackson 
相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。 
而且Jackson社区相对比较活跃,更新速度也比较快。 
Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。 
Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
三、Google的Gson 
Gson是谷歌公司研发的。应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。 
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。 
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。 
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
四、阿里的Fastjson 
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。 
无依赖,不需要例外额外的jar,能够直接跑在JDK上。 
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。 
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
该种方式,需要做如下操作,方可以在jsp中使用<json>标签:
1)将json-taglib.jar放入工程的lib下。
2)在jsp页面中做如下声明,即写入如下代码:
<%@ taglib prefix="json" uri="http://www.atg.com/taglibs/json"%>
这样就可以在jsp中使用<json>标签了。



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

1.背景介绍

什么是接口文档?

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

2.知识剖析

为什么要写接口文档?

1、项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发

2、项目维护中或者项目人员更迭,方便后期人员查看、维护

接口规范是什么?

首先接口分为四部分:方法、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里是具体的参数。

3.常见问题

衡量接口(API)设计好和坏的准则是什么?

4.解决方案

单词拼写要准确,接口一旦发布就不能改了,要保持兼容性,拼写错误也不能改了,所以要仔细检查拼写,否则会被同行嘲笑很多年。

方法名称是否可以自描述,即看到方法的名字就能知道方法的作用、看到参数名就知道需要传递什么样的数据(比如getUserById(String userId))

API一定要便于使用者理解,这样才是广泛传播的基础。如果有些API需要用户掌握特定的概念、定义,那么就要保持这个API的一致性,不能轻易的改变API,否则会给使用者带来很大的麻烦。

接口参数验证必不可少,同时异常等返回信息得全面,让调用者明确异常原由;

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

引用(https://www.jianshu.com/p/91f6f7372333)

1.背景介绍

HTTP报文中的Header可以分为请求中的Header和响应中的Header

2.知识剖析

常见Header详解:

Header中”q”值的含义:优先级。

没有q值的优先级默认为1。

q值一样的,范围小的优先级高。

格式:分号。

Accept:

客户端可以接受的Body格式

application/json ——JSON格式

text/plain——纯文本格式

text/html——HTML文本

*/*——所有格式

逗号隔开,有顺序。

分号前是主类型,分号后是子类型。

如果没有Accept请求头,相当于*/*

Accept-Encoding :

Content-Encoding:

Accept-Encoding指定浏览器可以支持的web服务器返回内容压缩编码类型。

服务器会通过Accept-Encoding得到客户端支持的压缩方式,如果服务器和浏览器同时支持某种压缩方式,服务器就会添加一种Content-Encoding,来进行压缩。

如果服务器不支持客户端Accept-Encoding中的任何一个压缩方式,则会返回406错误。

如果请求头中没有Accept-Encoding这个头,则会默认客户端支持任何方式。

Accept-Language:

浏览器可接受的自然语言的类型。

如果没有Accept-Language这个请求头,服务器默认客户端支持所有自然语言。

例如:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4

User-Agent:

主要用于统计和追踪信息,用处不大。可以包含很多信息。

User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36

Content-Type:

表示请求或响应体的格式。

Connection:

设置HTTP连接的持久化,通常都是Keep-Alive。

Connection: close 表示在响应结束后,结束连接。

WWW-Authenticate:

WWW-Authenticate响应头必须包含在401授权错误中,表示通过什么方式进行身份验证。

例如:WWW-Authenticate: BASIC realm="application"

 

3.常见问题

如果没有ACCEPT请求头?

相当于*/*

任何格式都接收

 

如果请求头中没有ACCEPT-ENCODING?

默认客户端支持任何方式

 

如果没有ACCEPT-LANGUAGE这个请求头?

服务器默认客户端支持所有自然语言。

 

POSTMAN测试正常,前端页面测试不正常??

4.解决方法

POSTMAN

JMETER

CHROME

5.编码实战

在JAVA中取得请求头?

取得HttpServletRequest对象

public String getHeader(String name);

public Enumeration getHeaders(String name);

public Enumeration getHeaderNames();

 

在JAVA中添加响应头?

取得HttpServletResponse对象

public void setHeader(String name, String value);——会覆盖

public void addHeader(String name, String value);——添加多个值

 

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

引用(http://blog.csdn.net/z344310362/article/details/52682210)

1.Content-Type

MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。 

[html] view plain copy 在CODE上查看代码片派生到我的代码片 

类型格式:type/subtype(;parameter)? type 

主类型,任意的字符串,如text,如果是*号代表所有; 

subtype 子类型,任意的字符串,如html,如果是*号代表所有; 

parameter 可选,一些参数,如Accept请求头的q参数, Content-Type的 charset参数。 

例如: Content-Type: text/html;charset:utf-8; 

常见的媒体格式类型如下:

text/html  HTML格式 

text/plain :纯文本格式 

text/xml  XML格式 

image/gif :gif图片格式 

image/jpeg :jpg图片格式 

image/png:png图片格式 

以application开头的媒体格式类型:

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 : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式) 

另外一种常见的媒体格式是上传文件之时使用的:

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式 

以上就是我们在日常的开发中,经常会用到的若干content-type的内容格式。

2.Spring MVC中关于关于Content-Type类型信息的使用

首先我们来看看RequestMapping中的Class定义: 

[html] view plain copy 在CODE上查看代码片派生到我的代码片 

@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 {}; 

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进行过滤和判断。

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

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

1.首先是工具比如Eclipse很方便了。   

 

2.用winrar之类的工具,把web-info目录,及跟它同级的所有目录及文件,打包成zip文件就行了,然后把扩展名改成war!   

 3 Jar命令:   

 

假定有一个Web应用:C:\myHome   

myHome/WEB-INF/……   

myHome/files/……   

myHome/image/……   

myHome/src/……   

myHome/index.jsp   

在命令行窗口下执行如下命令:   

C:\>cd myHome   

C:\myHome\>jar cvf myhome.war */ .   

解释:jar cvf [A=》 war包名 ].war [B=》 资源文件及文件夹 ] [C=》 将要生成war包的目标文件夹 ]   

“*/”(B=》)代表当前目录(C:\myHome)下的所有文件及文件夹。   

“.” (C=》)表明将要在当前目录中生成war包。   

 

操作完成后,就可以部署使用生成的war包了。比如在用tomcat容器:找到C:\myHome下新生成的myhome.war,将其拷入TOMCAT_HOME/webapps/下,然后启动Tomcat即可。   

 

附:jar命令用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...   

选项包括:   

-c 创建新的归档文件   

-t 列出归档目录   

-x 解压缩已归档的指定(或所有)文件   

-u 更新现有的归档文件   

-v 在标准输出中生成详细输出   

-f 指定归档文件名   

-m 包含指定清单文件中的清单信息   

-e 为捆绑到可执行 jar 文件的独立应用程序   

指定应用程序入口点   

-0 仅存储;不使用任何 ZIP 压缩   

-M 不创建条目的清单文件   

-i 为指定的 jar 文件生成索引信息   

-C 更改为指定的目录并包含其中的文件   

如果有任何目录文件,则对其进行递归处理。   

清单文件名、归档文件名和入口点名的指定顺序   

与 "m"、"f" 和 "e" 标志的指定顺序相同。   

 

示例 1:将两个类文件归档到一个名为 classes.jar 的归档文件中:   

jar cvf classes.jar Foo.class Bar.class   

示例 2:使用现有的清单文件 "mymanifest" 并   

将 foo/ 目录中的所有文件归档到 "classes.jar" 中:   

jar cvfm classes.jar mymanifest -C foo/ .    

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

引用(https://www.jianshu.com/p/e52ab563de65)

1.专供依赖引用的jar包,也就是我们在maven的pom.xml引入的依赖包

2.Web应用程序的war包,通常我们部署网站使用的都是war包

3.可以直接执行的jar包,在任务8、任务9Web端和Service端分离,Service端的本体就是一个可执行jar包

 

常用的打包工具

非maven的有两个,在maven中配置的有三个

1.package,maven自带的命令打包,平时的打包基本够用,但不能打可直接运行的jar包

2.IDEA自带的打包工具,不过打的包很容易出现冲突

3.jar-dependency插件,繁琐,性能差,不建议使用

4.assembly插件,可以打多种格式的包,具有基本的解决所打jar包内依赖包冲突的问题,但一旦出现冲突则无法解决

5.shade插件,终极杀器,jar包出现依赖包冲突可以通过调整配置解决


三、常见问题

这五种打包工具,有什么区别?


四、解决方案

打包工具虽多,但用途、性能是有所区别的

 

按性能分类

shade>assembly>IDEA自带>package>jar插件

按用途分类

1.打不依赖其他包的引用jar包:全部

2.打依赖其他包的引用jar包:shade、assembly、IDEA自带

3.不依赖其他包的可运行jar包:shade、assembly、IDEA自带、

4.依赖其他包的可运行jar包:shade、assembly、IDEA自带

5.需要将包打成各种格式如zip、tar.gz等格式:assembly

6.当出现jar包冲突时:统一采用shade

总结

懒得不想装插件使用package或IDEA自带,但是经常会出现冲突;需要打不同格式的包使用assembly;上述插件出现冲突使用终极大杀器shade

 

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

jetty,resin,tomcat的常见配置有哪些,内存,端口,日志文件都怎么配置?

tomcat

启动文件在bin下的startup.bat

在Tomcat的配置文件中,一个Web应用就是一个特定的Context,可以通过在server.xml中新建Context里部署一个JSP应用程序。打开server.xml文件,在Host标签内建一个Context,内容如下。

在tomcat中的conf目录中,在server.xml中的,节点中添加:

service.xml

说明:

path是虚拟路径;相当于java中的

@RequestMapping接口

docBase是应用程序的物理路径;即war包所在地

是实际路径,一般为绝对磁盘路径,也可以写相对路径,相对路径是相对于tomcat安装目录的webapps目录,通常设置虚拟目录的目的是将tomcat的安装和项目的保存分开,所以这里建议使用磁盘绝对路径,并且这个磁盘路径不是在tomcat目录下。

workDir是这个应用的工作目录,存放运行时生成的与这个应用相关的文件;

是tomcat运行是对JSP文件做编译后的文件,这个文件最好也是分开

debug则是设定debug level,  0表示提供最少的信息,9表示提供最多的信息

privileged设置为true的时候,才允许Tomcat的Web应用使用容器内的Servlet

reloadable如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重起tomcat的情况下改变应用程序,实现热部署

resin

Resin启动应用时,跟Tomcat一样会将jsp编译成可执行文件,保存到应用的WEB-INF/work目录下,tem是临时文件夹,也是在应用的WEB-INF/temp目录下,这里可以修改指向到其他的地方。

conf下的resin.xml

 

jetty

根目录的start.in

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

1、什么是容器?

Servlet没有main()方法。Servlet受控于另一个Java应用,这个Java应用称为容器。Tomcat就是这样一个容器。如果web服务器应用得到一个指向servlet的请求(而不是其他请求,如请求一个普通的静态HTML),此时服务器不是把这个请求交给servlet本身,而是交给部署该servlet的容器,要由容器调用servlet的方法,如doPost()doGet()

 

web服务器配置在容器里面,和web里面配置容器,前者要好一些

22.Linux服务器上部署的时候,一般都要有哪些脚本,这些脚本该怎么编写?https://www.jianshu.com/p/cc60193376ba

1.背景介绍

当我们在本地写好一个项目测试完毕后 我们一般都要把它上传到服务器上去

这里我们需要的操作都有什么呢

最低级的就是从本地打好war包上传服务器

不过在实际上我们都会使用一些版本管理工具像svn

目的是多人合作开发项目

任务三里面我们对此有一个详尽的使用

今天我们就在这里来谈一下如何从svn上自动下载部署到服务器上

2.知识剖析

我们先谈一下整体思路 要在svn上下载相关项目 然后服务器上打包

然后把war包放在容器内 这里我用的resin 最后重启resin

这些操作命令相信各位大佬都很熟悉 今天我们就用一个脚本实现一个命令解决

首先注意一下脚本文件的基础

程序必须以下面的行开始

#!/bin/sh

符号#!用来告诉系统它后面的参数是用来执行该文件的程序。

当编辑好脚本时,如果要执行该脚本,还必须使其可执行。

要使脚本可执行:编译 chmod +x 这样才能用./ 来运行

3.常见问题

 3.1.执行权限问题

 3.2.echo打印问题

3. 3.打印变量问题

4.解决方案

4.1,使用sh 执行文件

4.2,echo 后面要有空格

4.3.用{}括起来

5.编码实战 

直接贴代码把 更多更具体的可以看一下下文的视频

cat deploy.sh

#!/bin/sh

echo 停止resin服务

sh /opt/stop.sh

echo 停止svn服务

cd /

killall svnserve

echo 删除home下deploy

cd /home

rm -rf deploy/*

echo 从svn下载项目

cd deploy

svn co svn://120.92.4.210/student/task/trunk/baixiaoran/deploy

echo 项目打包

cd deploy

mvn install

echo 将war包复制到webapps下

cd target

cp *.war /home/resin-pro-4.0.53/webapps

echo 启动resin

sh /opt/start.sh

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

(1) IP

IP,(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给网络上使用IP协议的设备的数字标签。常见的IP地址分为IPv4与IPv6两大类。目前我们使用的都是IPv4的地址,IPv4地址由32位二进制数组成,常以XXX.XXX.XXX.XXX形式表现。(以上参考于维基百科)

通俗点说就是IP地址是用于标识出网络上的每一台主机的编号。有这个编号,网络上的其他主机才能在互联网浩若繁星的主机中定位到唯一的一台主机。

(2)域名

域名,(英语:domain name),是由一串用“点”分隔的字符组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。域名按域名系统(DNS)的规则流程组成。在DNS中注册的任何名称都是域名。域名用于各种网络环境和应用程序特定的命名和寻址目的。(以上参考于维基百科)

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

(3)端口号

端口,(英语:port),主要分为物理端口和逻辑端口。我们一般说的都是逻辑端口,用于区分不同的服务。因为网络中一台主机只有一个IP,但是一个主机可以提供多个服务,端口号就用于区分一个主机上的不同服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口,标识是从0~65535.(以上参考于维基百科)

端口号分为公认端口(0~1023)、注册端口(1024~49151)和动态端口(49152~65535)。我们自己的服务一般都绑定在注册端口上。

 

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

(http://blog.csdn.net/liiuijkiuu/article/details/52614835)

1.Nginx的作用:负载均衡,静态图片服务器。其特点是占有内存少,并发能力强 

2.Nginx 的安装: 从nginx 官网下载相应安装包? 解压到相应的目录,比如我是e盘 然后修改目录名字为nginx 

进入nginx目录 双击nginx.exe 来启动nginx这样,nginx 服务就启动了。 

此时 直接在浏览器地址栏输入:localhost 便能看到 欢迎页面,说明你虚拟主机已经搭建好了

打开任务管理器,查看 nginx.exe 进程,有二个进程会显示,占用系统资源,那是相当的少。 

如果需要配置相应的路径可以修改conf 文件夹下的nginx.properties文件 loacation 位置中的root参数 用来指定文件的存放位置。

1.Nginx中的文件目录结构:1.config 配置文件夹 2.html 网页文件夹 3.logs 日志文件 4.sbin 主要二进制文件 

2.Nginx命令参数 1.nginx -t 测试配置是否正确 2. nginx -s reload 加载新配置 3.nginx -s shop 立即停止 4.nginx -s quit 优雅停止 5.nginx -s reopen 重新打开日志

3Nginx集群和负载均衡:具体的负载均衡的方式 ,负载均衡是一种方案实现办法有DNS轮询,DNS服务器允许你一个域名有多个A记录,那么用户访问时,一般按地域返回一个较近的 

解析记录,这样全国不同的地区用户,看到163的主页来自不同的服务器。当解析出结果比如浏览器链接60.217时,这台主机后面还有N台也要做负载均衡 1.硬件上做负载均衡 F5 BIG—IP硬件负载均衡 

直接从tcp/ip底层协议上,直接做数据包的中转 2.软件负载均衡 LVS 3.反向代理+负载均衡,在nginx 中做集群与负载均衡,步骤都是一样的 Upstream{}模块,把多台服务器加入到一个组。更多详细信息还将陆续更新。

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

还是基于controller-service-dao三层来写代码,从入口开始,controller层的方法对应的是某个url,面向的是应用人员,应该返回他们能读懂的信息,所以controller必须做异常处理,一般来说会有统一的异常处理方法; 

service层面向的是controllerservice层中的某些方法,必须保证其事务,所以在service层进行事务控制是相当必要的,对于多条sql进行事务控制,如果某个sql执行失败,那么应当对已经执行的sql语句进行回滚; 

dao层更多是单一的sql语句,没有必要进行事务控制,因为事务开销并不便宜(官方原话); 

基于以上三点,回头再思考关于异常的处理,一般情况应该把异常网上抛,一直抛到最终处理的那一层,所以对于dao层和service其实是没有必要进行try-catch的,直接往上抛异常就可以。 

与之对应的,是spring的事务配置,默认情况下,spring只对运行时异常进行回滚,如果在dao层处理了异常,那么需要进行额外的配置,spring才会对异常进行回滚,常用的配置是@Transactional(rollbackFor=Exception.class) 

 

顺便提一个java知识点,关于try-catch-finally中,finally的作用,finally设计之初就是为了关闭资源,如果在finally中使用return语句,会覆盖try或者catch的返回值,最常见的就是覆盖异常,即便catch往上抛了异常,也会被覆盖,返回finallyreturn语句的返回值。

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

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

什么是null?

表示这个指针并不指向任何的对象.这样的指针称之为Null指针.简单来说就是未被初始化 在c语言中如果定义了一个指针变量设置为null就表明没有该变量没有指向任何内存单元的地址

 

null应用在哪些地方?

在c语言中,将指针设置为null来表明空指针,或释放指针变量指向的内存后将指针变量设置为null,防止成为野指针.在Java中将变量设置为null时有利于gc更早发现回收,能够减少程序占用内存的情况

 

可以编写返回null值的方法吗,为什么?

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

从以上我们可以看到一个方法返回一个null值,使用该null值的地方必须先进行检查.但是人无法保证时刻都做到正常检查后再使用 ,如果某个重要的地方因为没有检查就使用,这就可能造成一些负面影响.如果超级大会上演示时,你的jsp视图没有检查使用而controller却返回的是一个null,那么你的这个页面就挂掉了.可能在一些小场合无足轻重,但类似apple全球发布会就不一样了.

 

用什么替代null?

首先让我们回答大多数人用null来代表什么?就我自己之前写过的方法来说,之所以返回null是因为不能返回给调用方期待的信息时. 我想大多数人也可能如此,也可能是简单想表示空.

知道了多数人用null表示什么,那么就能否有其他方式替代而消除null带来的负面影响呢?

 

1.使用Java8中的optional类

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

因本人还未学习java8,故不演示,请自行查阅相关文档.

2.使用抛出异常替代返回null值

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

如何自定义异常

为什么需要使用自定义异常,第一jdk提供的异常不利于表示业务情况,因此需要自定义异常. 自定义异常主要继承jdk的三大异常即可,runtimeException(非检查型异常), Exception(检查型异常),Error(非检查型系统异常). 在实际中的自定义异常中一般普遍使用的是继承Exception(检查型异常). RuntimeException因为是非检查型异常,表明可以捕捉处理也可以不处理,因此很少使用. 而Error表明系统级别错误,一般即使捕获也无法处理.

 

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

Postman最基础的功能就是发送http请求,支持GET/PUT/POST/DELETE,还有很多我不认识的http方法。

通过填写URL、header、body等就可以发送一个请求,这对于我们平时做一些简单的测试是够用的

SoapUI、Jmeter、Poster。

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

 Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求。下面就来介绍一下Linux系统如何模拟Http的get或post请求。

一、get请求:

  1、使用curl命令:

  curl “http://www.baidu.com” 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地

  curl -i “http://www.baidu.com” 显示全部信息

  curl -l “http://www.baidu.com” 只显示头部信息

  curl -v “http://www.baidu.com” 显示get请求全过程解析

  2、使用wget命令:

  wget “http://www.baidu.com”也可以

 

二、post请求

  1、使用curl命令(通过-d参数,把访问参数放在里面):

  curl -d “param1=value1¶m2=value2” “http://www.baidu.com”

  2、使用wget命令:(--post-data参数来实现)

  wget --post-data ‘user=foo&password=bar’ http://www.baidu.com

  以上就是Linux模拟Http的get或post请求的方法了,这样一来Linux系统也能向远程服务器发送消息了。  

 

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

防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合。 它可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况, 以此来实现网络的安全保护。

就是说他是互联网与局域网之间的一道门,如果没有防火墙,内网的服务器,肯定直接暴露在互联网上,服务器一旦被控制,就会出来网络俗称的“肉鸡”。所以部署防火墙是很重要的。

33.WEB服务器通常要配置哪几个端口,如果一台服务器上有多个不同的WEB服务,该怎么规划端口的使用,修真院的端口分配是怎么样的?

我这有一台web服务器,lnmp架构的,打算配置iptables,三个链默认DROP,要开放80 22 lo 110 25 161 162 ,还有开放哪些端口

这个是你的自由,随便你开什么端口都行,如果想要建议的话,就建议开

 

snmp 161 162

ssh 22

mail 25 110 

http 80 443

tomcat常用的一些端口8000-10000

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

 

1.背景介绍

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 函数


2.知识剖析

JSTL 核心标签库(C标签)标签共有14个,功能上分为4类:

(1)表达式控制标签:

<c:out>标签:用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是标签可以直接通过"."操作符来访问属性。

<c:set>标签:用于设置变量值和对象属性。

<c:remove>标签:用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。

<c:catch>标签:主要用来处理产生错误的异常状况,并且将错误信息储存起来。

(2)流程控制标签:

<c:if>标签:判断表达式的值,如果表达式的值为 true 则执行其主体内容。

<c:choose>标签:与Java switch语句的功能一样,用于在众多选项中做出选择。

<c:when>标签:<c:when>在<c:choose>中,就相对于case在switch语句中。

<c:otherwise>标签:<c:otherwise>在<c:choose>中,就相对于default在switch语句中。

(3)循环标签:

它们封装了Java中的for,while,do-while循环。

<c:forEach>标签:更加通用的标签,因为它迭代一个集合中的对象。

<c:forTokens>标签:通过指定分隔符将字符串分隔为一个数组然后迭代它们。

(4)URL操作标签:

<c:import>标签:提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL

<c:url>标签:将URL格式化为一个字符串,然后存储在一个变量中。

<c:redirect>

标签:通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持<c:param>标签。

<c:param>标签:用于在标签中指定参数,而且与URL编码相关。


3.常见问题

为什么使用c标签?


4.解决方案

JSTL的目标是为了简化JSP页面的设计。对于页面设计人员来说,使用脚本语言(默认值是JAVA语言)操作动态数据是比较困难的,而采用标签和表达式语言相对容易一些,JSTL的使用为页面设计人员和程序开发人员的分工协作提供了便利。



返回列表 返回列表
评论

    分享到