一. Spring MVC 如何接受并处理一个请求的?
两种方法
1、web.xml
首先我们会在 web.xml 中注册一个 DispatcherServlet ,并令这个 servlet 接收所有的请求,项目启动后Spring会扫描配置文件,根据配置加载和实例化类,其中扫描到的带有 @Controller 或者 @RestController 注解的类则是请求要映射到的类,Spring MVC扫描里面所有和请求映射有关的注解, 如 @RequestMapping 、 @ResponseBody 、 @RequestParam 等。当接收到一个请求时,它会根据请求的url映射到对应的controler,并根据返回值判断是渲染jsp页面还是返回普通文本,亦或是返回json。
2、注解
使用@WebServlet注释修饰该接受请求的Servlet类,请求时,发起请求的页面将参数放进请求地址一起传请求的Servlet类,Servlet类到接受请求的参数String fileName = request.getParameter("flieName")得到请求参数然后就进行请求处理处理后根据返回值判断是渲染jsp页面还是返回普通文本,亦或是返回json。
二. HashMap 与 Hashtable 的区别。
HashMap 是 线程不安全 的是单线程的, Hashtable 方法是同步的,意味着多线程的应用程序可以不用采取任何措施就使用Hashtable,线程是安全的。
HashMap 的key和value允许为空, Hashtable 不允许为空。
HashMap 继承自 AbstractMap 是Java1.2引进的map接口的实现, Hashtable 继承自 Directory 。
三. Java的线程状态,生命周期
1. 新建状态(New):新创建了一个线程对象。
2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
四.Java实现同步
使用 synchronized 关键字为方法或代码块加锁。
使用 volatile 修饰变量,但是 volatile不保证原子性 。
使用 ReentrantLock 或者 ReentrantReadWriteLock , 这种方法比 synchronized 更灵活。
使用 Semaphore ,允许最多n个线程同时访问资源
五. AOP实现原理
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
实现
1.通知(Advice):
通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。
2.连接点(Joinpoint):
程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。
3.切入点(Pointcut):
通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,spring中允许我们方便的用正则表达式来指定
4.切面(Aspect)
通知和切入点共同组成了切面:时间、地点和要发生的“故事”
5.引入(Introduction)
引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)
6.目标(Target)
即被通知的对象,如果没有AOP,那么它的逻辑将要交叉别的事务逻辑,有了AOP之后它可以只关注自己要做的事(AOP让他做爱做的事)
7.代理(proxy)
应用通知的对象,详细内容参见设计模式里面的代理模式
8.织入(Weaving)
把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:
(1)编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器
(2)类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码
(3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术
Spring提供了4种实现AOP的方式:
1.经典的基于代理的AOP
2.@AspectJ注解驱动的切面
3.纯POJO切面
4.注入式AspectJ切面
六.高内聚低耦合
七.GET和POST格式是怎么样的?
HTTP请求 分为三部分: 请求行 、 请求头 、 请求体 :
请求行 : 第一行是 METHOD URL protocal ,如 GET http://abc.com HTTP/1.1 。
请求头 : 从第二行开始,每一行的内容都是一个请求头参数值,直到遇到一个 空行为止。
请求体 : 请求头和请求体中间隔着一行 空行 作为分界,请求体包含着本次请求携带的内容。
GET 方式的请求没有请求体,其是将参数追加到 URL 后面, URL 中 ? 后面的内容为请求参数。
POST 方式则三部分都有,且 POST 的请求头应当包含 Content-Type 来指明请求体中内容的类型。