目录
10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别
18、Spring 中 Autowired 和 Resource 关键字的区别
22、Spring 基于 xml 注入 bean 的几种方式
1、HTTP 请求的 GET 与 POST 方式的区别
1. get 是从服务器上获取数据,post 是向服务器传送数据;
2. 请求的时候参数的位置有区别:get 的参数是拼接在 url 后面,用户在浏览器地址栏可以看到;post 是放在 http 包的包体中;
3. 能提交的数据有区别, get 方式能提交的数据只能是文本,且大小不超过 1024 个字节,而 post 不仅可以提交文本还有二进制文件。 所以说想上传文件的话,那我们就需要使用 post 请求方式;
4. get 安全性非常低, post 安全性较高;比如说用户注册,不能把用户提交的注册信息用 get 的方式,会把用户的注册信息都显示在 Url 上,是不安全的;
2、什么是 servlet?
Servlet 是服务器端的程序;动态生成 html 页面发送到客户端;
但是这样程序里会有很多 out.println(),java 与 html 语言混在一起很乱,所以后来 sun 公司推出了 JSP .其实 JSP 就是 Servlet ,每次运行的时候 JSP 都首先被编译成 servlet 文件,然后再被编译成 (.class) 文件运行。有了 jsp ,在 MVC 项目中 servlet 不再负责动态生成页面,转而去负责控制程序逻辑的作用,控制 jsp 与 javabean 之间的流转;
3、Servlet 的生命周期
Servlet 生命周期包括三部分:
1、初始化:Web 容器加载 servlet,调用 init()方法;
2、理请求:当请求到达时,运行其 service()方法。service()自动派遣运行与请求相对应的 doXXX(doGet 或者 doPost)方法;
3、销毁:服务结束,web 容器会调用 servlet 的 distroy()方法销毁 servlet;
4、Servlet 的基本架构
package com.yx.test;
public class Servlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
5、什么情况下调用 doGet()和 doPost()?
Jsp 页面中的 FORM 标签里的 method 属性为 get 时调用 doGet(),为 post 时调用 doPost();
6、Request 对象的主要方法
setAttribute(String name,Object) | 设置名字为 name 的 request 的参数值 |
getAttribute(String name) | 返回由 name 指定的属性值 |
getAttributeNames() | 返回 request 对象所有属性的名字集合,结果是一个枚举的实例 |
getCookies() | 返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组 |
getCharacterEncoding() | 返回请求中的字符编码方式 |
getContentLength() | 返回请求的 Body 的长度 |
getHeader(String name) | 获得 HTTP 协议定义的文件头信息 |
getHeaders(String name) | 返回指定名字的 request Header 的所有值,结果是一个枚举的实例 |
getHeaderNames() | 返回所以 request Header 的名字,结果是一个枚举的实例 |
getInputStream() | 返回请求的输入流,用于获得请求中的数据 |
getMethod() | 获得客户端向服务器端传送数据的方法 |
getParameter(String name) | 获得客户端传送给服务器端的有 name 指定的参数值 |
getParametervalues(String name) | 获得有 name 指定的参数的所有值 |
getRequestURI() | 获取发出请求字符串的客户端地址 |
getRemoteAddr() | 获取客户端的 IP 地址 |
getSession([Boolean create]) | 返回和请求相关 Session |
getServerName() | 获取服务器的名字 |
7、forward 和 redirect 的区别
(1) 从地址栏显示来说forward 是服务器请求资源,服务器直接访问目标地址的 URL ,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址;redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的 URL ;
(2) 从数据共享来说forward :转发页面和转发到的页面可以共享 request 里面的数据;redirect :不能共享数据;
(3) 从运用地方来说
forward :一般用于用户登陆的时候,根据角色转发到相应的模块;redirect :一般用于用户注销登陆时返回主页面和跳转到其它的网站等;
(4) 从效率来说
forward :高;redirect :低;
8、jsp 有哪些内置对象?作用分别是什么
exception
|
针对错误页面才可使用
|
request | 包含用户端请求信息 |
response | 包含服务器传回客户端响应信息 |
session | 与请求有关的会话期 |
pageContexe | 管理网页属性 |
application |
服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息
|
out | 向客户端输出数据 |
config
|
servlet 的架构部件
|
page
|
指网页本身
|
9、JSP 的常用指令
(1) page 指令: 属性最多的指令( 实际开发中 page 指令默认 ),属性最多的一个指令,根据不同的属性,指导整个页面特性格式: <%@ page 属性名 1= "属性值 1" 属性名 2= "属性值 2" ...%>常用属性如下:language : jsp 脚本中可以嵌入的语言种类,这个没用,写与不写一样的;pageEncoding :当前 jsp 文件的本身编码---内部可以包含 contentType ;contentType : response.setContentType(text/html;charset=UTF-8) ;import :导入 java 的包;errorPage :当前页面出错后跳转到哪个页面;isErrorPage :当前页面是一个处理错误的页面;
(2) include 指令: 页面包含(静态包含)指令,可以将一个 jsp 页面包含到另一个 jsp 页面中格式:<%@ include file="被包含的文件地址"%>;
(3) taglib 指令: 在 jsp 页面中引入标签库 (jstl 标签库、struts2 标签库)格式: <%@ taglib uri="标签库地址" prefix="前缀"%> ;
10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别
动态 include 用 jsp:include 动作实现, <jsp:include page="included.jsp" flush="true"/> 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数;静态 include 用 include 伪码实现,不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.html" %> ;
11、四种会话跟踪技术作用域
page :一个页面;request ::一次请求;session :一次会话;application :服务器从启动到停止;
12、MVC 的各个部分都有那些技术来实现?如何实现
MVC 是 Model-View-Controller 的简写;Model 代表的是应用的业务逻辑( 通过 JavaBean,EJB 组件实现 );View 是应用的表示面( 由 JSP 页面产生 );Controller 是提供应用的处理过程控制( 一般是一个 Servlet );通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用;
13、web.xml 文件中可以配置哪些内容
web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面;
14、session 和 cookie 有什么区别
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上;
2、cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session;
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie;
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie;
15、Java 反射技术主要实现类有哪些,作用分别是什么
在 JDK 中,主要由以下类来实现 Java 反射机制,这些类都位于 java.lang.reflect 包中:
(1) Class 类:代表一个类;
(2) Field 类:代表类的成员变量 ( 属性 ) ;
(3) Method 类:代表类的成员方法;
(4) Constructor 类:代表类的构造方法;
(5) Array 类:提供了动态创建数组,以及访问数组的元素的静态方法;
16、讲一下什么是 Spring
Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。
主要由以下几个模块组成:
Spring Core :核心类库,提供 IOC 服务;Spring Context :提供框架式的 Bean 访问方式,以及企业级功能 ( JNDI、定时任务等 );Spring AOP : AOP 服务;Spring DAO :对 JDBC 的抽象,简化了数据访问异常的处理;Spring ORM :对现有的 ORM 框架的支持;Spring Web :提供了基本的面向 Web 的综合特性,例如多方文件上传;Spring MVC :提供面向 Web 应用的 Model-View-Controller 实现;
17、Spring 的 IOC 和 AOP 机制
IOC:控制反转也叫依赖注入。利用了工厂模式 :将对象交给容器管理,你只需要在 spring 配置文件总配置相应的 bean ,以及设置相关的属性,让 spring 容器来生成类的实例对象以及管理对象。在 spring 容器启动的时候, spring 会把你在配置文件中配置的 bean 都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些 bean 分配给你需要 调用这些 bean 的类(假设这个类名是 A),分配的方法就是调用 A 的 setter 方法来注入,而不需要你在 A 里面 new 这些 bean 了;
AOP:面向切面编程。( Aspect-Oriented Programming):AOP 可以说是对 OOP 的补充和完善。 OOP 引入 封装、继承和多态性 等概念来建立一种对象层次结构, 用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候, OOP 则显得无能为力。 也就是说, OOP 允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。将程序中的交叉业务逻辑( 比如安全,日志,事务等 ),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。实现 AOP 的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码.简单点解释,比方说你想在你的 biz 层所有类中都加上一个打印‘你好’的功能,这时就可以用 AOP 思想来做.
18、Spring 中 Autowired 和 Resource 关键字的区别
@Resource 和 @Autowired 都是做 bean 的注入时使用,其实 @Resource 并不是 Spring 的注解,它的包是 javax.annotation.Resource ,需要导入,但是 Spring 支持该注解的注入。
1 、共同点两者都可以写在字段和 setter 方法上。两者如果都写在字段上,那么就不需要再写 setter 方法。
2 、不同点(1) @Autowired@Autowired为 Spring 提 供 的 注 解, 需 要 导 入 包 org.springframework.beans.factory.annotation.Autowired ; 只按照 byType 注入。
package com.yx.test;
public class AutowiredAndResource {
// 下面两种@Autowired 只要使用一种即可
@Autowired
private UserDao userDao; // 用于字段上
@Autowired
public void setUserDao(UserDao userDao) {
// 用于属性的方法上
this.userDao = userDao;
}
}
}
@Autowired 注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName)来装配,可以结
合 @Qualififier 注解一起使用。如下:
package com.yx.test;
public class AutowiredAndResource {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
(2) @Resource
@Resource 默认按照 ByName 自动注入,由 J2EE 提供,需要导入包 javax.annotation.Resource ;@Resource 有两个重要的属性: name 和 type ,而 Spring 将 @Resource 注解的 name 属性解析为 bean 的 名字,而 type 属性则解析为 bean 的类型。所以,如果使用 name 属性,则使用 byName 的自动注入策 略,而使用 type 属性时则使用 byType 自动注入策略。如果既不制定 name 也不制定 type 属性,这时将通过反射机制使用 byName 自动注入策略。注:最好是将 @Resource 放在 setter 方法上,因为这样更符合面向对象的思想,通过 set、get 去操作属 性,而不是直接去操作属性。
package com.yx.test;
public class AutowiredAndResource {
// 下面两种@Resource 只要使用一种即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上
@Resource(name="userDao")
public void setUserDao(UserDao userDao) {
// 用于属性的 setter 方法上
this.userDao = userDao;
}
}
}
@Resource 装配顺序:
①如果同时指定了 name 和 type ,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。②如果指定了 name ,则从上下文中查找名称(id )匹配的 bean 进行装配,找不到则抛出异常。③如果指定了 type ,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会抛 出异常。④如果既没有指定 name ,又没有指定 type ,则自动按照 byName 方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。@Resource 的作用相当于 @Autowired ,只不过 @Autowired 按照 byType 自动注入。
19、依赖注入的方式有几种,各是什么
1、构造器注入将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入;优点:对象初始化完成后便可获得可使用的对象;缺点:当需要注入的对象很多时,构造器参数列表将会很长;不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函数,麻烦;
2、setter 方法注入IoC Service Provider 通过调用成员变量提供的 setter 函数将被依赖对象注入给依赖类;优点:灵活。可以选择性地注入需要的对象;缺点:依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用;
3、接口注入依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象;优点接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可;缺点:侵入行太强,不建议使用;PS:什么是侵入行?如果类 A 要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性;
20、解释一下 spring bean 的生命周期
首先说一下 Servlet 的生命周期:实例化,初始 init,接收请求 service,销毁 destroy;Spring 上下文中的 Bean 生命周期也类似,如下:
(1)实例化 Bean :对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 bean 时,或初始化 bean 的时候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化。对于 ApplicationContext 容器,当容器启动结束后,通过获取 BeanDefifinition 对象中的信息,实例化所有的 bean;
(2)设置对象属性(依赖注入):实例化后的对象被封装在 BeanWrapper 对象中,紧接着, Spring 根据 BeanDefifinition 中的信息 以及 通过 BeanWrapper 提供的设置属性的接口完成依赖注入;
(3)处理 Aware 接口:接着, Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean :①如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId) 方法,此处传递的就是 Spring 配置文件中 Bean 的 id 值;②如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory() 方法,传递的是 Spring 工厂自身;③如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用setApplicationContext(ApplicationContext) 方法,传入 Spring 上下文;
( 4)BeanPostProcessor:如果想对 Bean 进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,那将会调用 postProcessBeforeInitialization(Object obj, String s) 方法;
( 5) InitializingBean 与 init-method :如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法 ;
( 6)如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s) 方法;由于这个方法是在 Bean 初始化结束时调用的,所以可以被应用于内存或缓存技术;以上几个步骤完成后, Bean 就已经被正确创建了,之后就可以使用这个 Bean 了
( 7) DisposableBean :当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的 destroy() 方法;
(8)destroy-method:
最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法。
21、解释 Spring 支持的几种 bean 的作用域
( 1) singleton :默认,每个容器中只有一个 bean 的实例,单例的模式由 BeanFactory 自身来维护;
(2) prototype:为每一个 bean 请求提供一个实例;
(3) request:为每一个网络请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回收器回收;
(4) session:与 request 范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean会随之失效。
(5) global-session :全局作用域, global-session 和 Portlet 应用相关。当你的应用部署在 Portlet 容器中工作时,它包含很多 portlet 。如果你想要声明让所有的 portlet 共用全局的存储变量的话,那么这全局变量需要存储在 global-session 中。全局作用域与 Servlet 中的 session 作用域效果相同;
22、Spring 基于 xml 注入 bean 的几种方式
(1) Set 方法注入;(2) 构造器注入:①通过 index 设置参数的位置;②通过 type 设置参数类型;(3) 静态工厂注入;(4).......
23、Spring 框架中都用到了哪些设计模式
(1)工厂模式: BeanFactory 就是简单工厂模式的体现,用来创建对象的实例;(2)单例模式: Bean 默认为单例模式;(3)代理模式: Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术;(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate ;(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如 Spring 中 listener 的实现-- ApplicationListener 。
24、Spring MVC 流程
工作原理:
1、 用户发送请求至前端控制器 DispatcherServlet。
2、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。3、 处理器映射器找到具体的处理器( 可以根据 xml 配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成 )一并返回给 DispatcherServlet 。4、 DispatcherServlet 调用 HandlerAdapter 处理器适配器。5、 HandlerAdapter 经过适配调用具体的处理器( Controller,也叫后端控制器 )。6、 Controller 执行完成返回 ModelAndView 。7、 HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet 。8、 DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。9、 ViewReslover 解析后返回具体 View 。10、 DispatcherServlet 根据 View 进行渲染视图( 即将模型数据填充至视图中 )。11、 DispatcherServlet 响应用户。
25、SpringMVC 怎么样设定重定向和转发的
(1) 转发:在返回值前面加" forward :",比如 "forward:user.do?name=method4"(2) 重定向:在返回值前面加" redirect :",比如"redirect:http://www.baidu.com
26、SpringMVC 常用的注解有哪些
@RequestMapping :用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。@RequestBody :注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。@ResponseBody :注解实现将 conreoller 方法返回对象转化为 json 对象响应给客户。