发表于: 2018-01-15 23:06:18
3 680
任务二 总结+深度思考
1.什么是restful?rest的请求方法有哪些,有什么区别?
简单地说,就是“看Url就知道要什么;看http的method就知道干什么;看status的code就知道结果如何”,这些东西可以在postman里面看的清清楚楚。
我任务二中用到了POST(新增) PUT(更新)DELETE(删除)GET(浏览)
2.为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的?
没有HTTP协议的话 只能把动词写进url了吧,于是显得特别冗长和丑陋。
在Rest风格之前,只能一个行为独占一个接口,做不到前端和后端的设计分离。
3.了解maven的module。
Maven Project可以理解为父工程。
Maven Module可以理解为子工程。
创建Maven Module工程必须有存在的父工程,maven就是通过父子工程进行工程管理的。
感觉和大学学的模块化生产有点像,生产完然后快速装配。
4.什么是http协议?Get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?
HTTP协议定义服务器端和客户端之间文件传输的沟通方式。目前HTTP协议版本是Http1.1,我昨天拿postman测的看见的也是1.1
关于Get和Post的区别...嗯,前几天我给我自己项目做测试的时候,发现:GET的方式可以URL手动输入,JSP里面都可以用a标签 href直接加地址跳转,而对于POST 你是不能这样子弄得。我百度了一下,摘录了一些觉得有用的东西放上来:
以下情况请使用GET:- 请求中的URL可以被手动输入- 请求中的URL可以被存在书签里,或者历史里,或者快速拨号里面,或者分享给别人。- 请求中的URL是可以被搜索引擎收录的。- 带云压缩的浏览器,比如Opera mini/Turbo 2, 只有GET才能在服务器端被预取的。- 请求中的URL可以被缓存。
反之,就用POST. 特别是有一些东西你是不想让人家可以在浏览器地址栏里面可以输入的。比如,如果你设计一个blog系统, 设计这样一个URL来删掉所有帖子。http://myblog.com/?action=delete_all 我只能说很快你就知道什么叫不作死就不会死这个道理了,搜索引擎的爬虫分分钟教你做人。另外一个准则是,可以重复的交互,比如取个数据,跳个页面, 用GET.不可以重复的操作, 比如创建一个条目/修改一条记录, 用POST, 因为POST不能被缓存,所以浏览器不会多次提交。
http content-Type: http://blog.csdn.net/jam_yin/article/details/51837204 关于json,我就只做了一个简单测试...不懂他机制是什么
http适合的场景:公司OA服务,互联网服务
http状态码:http://tool.oschina.net/commons?type=5 非常地多,不过常用的应该是404和500吧。
5.什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?
TCP/IP模型也被称作DoD模型(Department of Defense Model)。TCP/IP字面上代表了两个协议:TCP(传输控制协议)和IP(网际协议)。1983年1月1日,在因特网的前身(ARPA网)中,TCP/IP协议取代了旧的网络控制协议(NCP,Network Control Protocol),从而成为今天的互联网的基石。
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP 窗口大小信息。在socket编程中,客户端执行connect()时,将会触发三次握手。
除此之外我还了解了下四次挥手....感觉这些协议,就是为了完成数据的各种包装,以及在四个层之间完成有效的传输。整个页面访问到显示的过程里,我们JAVA编程只是完成了很小的一块部分,没有这些协议,我们是无法完成工作的。
6.什么是WEBService,实现WEBService有哪些框架,为什么WEBService经常被认为太重了,只有银行和大型国企才会使用的更多有一些?
WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
目前开发Web Service的几个框架:Axis,axis2,Xfire,CXF以及JWS。其中,以axis2与cxf所最为常用,Axis与XFire已随着技术不断的更替慢慢落幕,而目前也只有axis2和cxf官方有更新,Axis与XFire都已不再更新。
WEBservice不适用的情况:目前,企业和个人还使用着很多桌面应用程序。其中一些只需要与本机上的其它程序通信。在这种情况下,最好就不要用WebService,只要用本地的 API就可以了。COM非常适合于在这种情况下工作,因为它既小又快。运行在同一台服务器上的服务器软件也是这样。最好直接用COM或其它本地的API来进行应用程序间的调用。当然WebService也能用在这些场合,但那样不仅消耗太大,而且不会带来任何好处。
7.Spring MVC和Struts的区别是什么,为什么更倾向于使用Spring MVC?
因为没有学过Struts,所以只能贴个链接:
http://www.cnblogs.com/huajiezh/p/6415444.html
仔细看了下,好像Spring MVC功能比较强大些,而且天生亲近Spring,对REST接口友好,在实用性上更胜一筹。
8.web.xml里的主要配置都包括什么,都代表什么含义,比如怎么加载Spring 配置的?
包括了服务器名字和一些基本属性
包括了各种过滤器:我任务二用到了两个,一个为了处理中文乱码的,一个是为了实现REST风格接口的
包括了springmvc.xml(前端适配器配置)和spring配置文件的加载路径。这些我在日报里面说到过:
http://www.jnshu.com/daily/46500?dailyType=others&total=19&page=7&uid=20549&sort=0&orderBy=3
反正就是各种关联....web.xml作为入口,去加载spring的配置,然后spring的配置再去加载其他的....
9.Annotation和XML两种配置的差别,为什么更喜欢使用Annotaion来配置Spring MVC?
从主观情况上看:
XML的优点:
1. XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新编译。
2. 在处理大的业务量的时候,用XML配置应该更加好一些。因为XML更加清晰的表明了各个对象之间的关系,各个业务类之间的调用。同时spring的相关配置也能一目了然。
缺点:
配置文件读取和解析需要花费一定的时间,配置文件过多的时候难以管理,无法对配置的正确性进行校验,增加了测试难度。
Annotation的优点:
1. 在class文件中,可以降低维护成本,annotation的配置机制很明显简单
2. 不需要第三方的解析工具,利用java反射技术就可以完成任务
3. 编辑期可以验证正确性,差错变得容易
4. 提高开发效率
缺点:
1. 如果需要对于annotation进行修改,那么要重新编译整个工程
2. 业务类之间的关系不如XML配置那样容易把握。
3. 如果在程序中Annotation比较多,直接影响代码质量,对于代码的简洁度有一定的影响。
但是springMVC的层次比较简单,自带的几个注释功能很强大,也很好用,所以我采用的也是注解的方法完成任务2的。
10.使用Annotaion的时候需要有哪些配置,他的加载过程是怎么样的?
打个比方,关于@autowired注解:
@autowired是通过动态代理和反射,在类加载过程中动态生成代理类,当初始化全局变量时,代理类跳到invoke方法,然后通过反射获取field字段对象,在method.invoke()的调用前即可实现注入。aop和拦截器以及常用注解等功能的实现都是基于动态代理实现的。
当然也可以用java自带的另外一种注解完成,比如我在任务二控制器里面写的:
@Resource
private StudentDao studentDao;
不过,在service层这里依旧要打一个@Service的标签,因为在spring里面我们只配置了这个:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
相当于是把dao层自动扫进去了,但是没有装配到service层。打个service标签相当于是实现了一个接口,相当于是有了一个property属性,运行的时候会自动识别MapperScannerConfigurer这个bean,然后自动装配。当然也可以在xml里面显式配置一个service的类。
PS:除了@service,还有其他类似功能的标签,比如@repository(dao层),等等。
11.什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?
Filter 过滤器 比如说JSP是只支持POST和GET的,我们可以在服务器端根据隐藏域属性把它过滤为对应REST方法。
Interceptor 拦截器 比如我在任务二里面就写了一个异常拦截器HandlerExceptionResolver,专门用来处理异常的。我百度了一下,好像以后做登录的身份验证的时候也需要用到。
他们两个的区别主要有:
更详细的内容可以看:http://blog.csdn.net/chenleixing/article/details/44573495
我仔细看了下,总结一下:过滤器是依赖于servlet的,工作都是在servlet外面(也就是前期和后期)完成处理的,完成的基本上都是与内部的业务逻辑无关的东西,比如都是一些外部的东西:REST接口的方法字面量的改变、编码的改变等,相当于只是改变的是数据本身,并没有进入到servlet里面进行处理。而对于servlet内部的业务逻辑,只能交给拦截器完成。
12.生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?
1、第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew。
2、第二种使用JSON工具将对象序列化成json,常用工具Jackson,fastjson,gson。
3、第三种利用spring mvc3的注解@ResponseBody。
4、利用JsonTaglib从JSP中提取json
JsonTaglib的设计目的就是简化,它的功能只有一个,就是从jsp中提取json数据,功能强大而且简单。
PS:JsonTaglib和前三种所需的依赖包不一样,应该是atg.taglib.json.json-taglib这个包
13.一份规范的接口文档应该包括什么内容,衡量接口(API)设计好和坏的准则是什么?
接口规范:首先接口分为四部分:方法、uri、请求参数、返回参数 这些都可以在postman上面看见
好的接口应该满足:简洁、表意清晰、功能齐全
14.Http的Header里面包含哪些字段,每个字段都有哪些含义?
http://www.cnblogs.com/printN/p/6534529.html
里面涉及到cookie什么的,打算以后学到了再好好回顾。
15.Content-type中的数据类型,在Spring MVC中都怎么接收数据?
可以通过设置改变,比如我可以在web.xml里面这样子配置:
<!--把静态资源交给tomcat的defaultSerlvet处理-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
具体的可以看:http://blog.csdn.net/blueheart20/article/details/45174399
17.War包是什么,为什么WEB服务通常打出来的都是War包?除了War包,还有几种打包格式,他们之间的区别呢?
WAR是Sun提出的一种Web应用程序格式,是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类。
其实我们用Maven创建一个web工程,会自动生成一个webapp的文件夹,和war的结构一模一样的的:
其他的打包类型:
18.maven常用的打包插件有哪些?有什么区别?如何使用 ?
我用的是
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
还有TOMCAT的,在pom.xml的<bulid>里的<plugins>里面添加 然后导入 就能在右上角maven的板块里面看见了。
19.jetty,resin,tomcat的差别在哪里,在线上服务应该选择哪一种WEB服务器?
根据我个人实践的话,发现本地测试还是jetty好用的多,支持热部署,速度也快一点,但是Tomcat报错信息更加详细。
详细可以看:https://www.jianshu.com/p/c9d3744de1ba
20.jetty,resin,tomcat的常见配置有哪些,内存,端口,日志文件都怎么配置?
比如jetty是这样子配置的:
<configuration>
<stopPort>9988</stopPort>
<stopKey>foo</stopKey>
<scanIntervalSeconds>5</scanIntervalSeconds>
<connectors>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<port>8080</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
<webAppConfig>
<contextPath>/</contextPath>
</webAppConfig>
</configuration>
Tomcat我用的是客户端,可以在servlet.xml里查看其配置,也是8080端口,不过一些细节好像和jetty不太一样。
25.在Controller里应该怎么处理Service的异常,大段的Try Catch 会有什么坏处?
Service是不具备处理异常的能力的(包括DAO),需要上抛到Controller层进行处理。另外,在Controller层也不适合写大段的Try Catch,这会降低代码的可读性,而且提高维护的难度。我是采用继续上抛到前端处理器,然后由SpringMVC的异常处理器bean类进行处理。这样子可以统一处理异常,而且不返回具体的异常信息给用户。
26.对Service返回的结果是否要判空,为什么?
需要判定 比如返回一个null对象或者size为0的集合,会使得回显的页面特别丑陋。为了提高用户友好,比如查询结果为空时,我是这样子处理的:
if (studentForNumber == null)
throw new StudentException("该搜索结果不存在,请核对学号信息!");
抛出一个异常 然后由异常处理器捕获,返回错误页面给用户,传递信息。
27.对Service返回的结果是否要打日志,应该打什么样的日志,为什么?
我按照任务二的要求,getlogger了一个log4j对象进行记录。
29.PostMan是什么,为什么要使用他来测试接口,除了Postman,还有哪些工具可以测试?
PostMan是用于开发接口(API)的完整工具链 用它可以把传送接收的数据看的清清楚楚
其他的测试工具:我百度了一下,至少有十四种,我在这里放个链接吧:http://www.51testing.com/html/01/n-3723801.html
34.C标签是什么,为什么要使用C标签,有哪些常见的指令?
任务二中很多地方需要遍历集合分条显示信息,就需要C标签foreach实现,常见的指令有:
PS:因为任务二根本没有做到服务器那一块,但深度思考里面有太多超纲的内容,所以就不放在这里了,等任务三完成,统一放在任务三的深度思考板块里面完成。分别是:16、21~24、28、30~33
明天要做的事情:可能要开始任务三吧
遇到的问题:一些概念性的东西的理解
今天的收获:对任务二进行了总结
评论