关于JavaWeb与SSM二十道经典面试题

  1. Servlet的生命周期,以及它和Tomcat怎么结合工作的工作原理?
 答:
 servlet的生命周期:
构造器: servlet第一次被访问服务器创建servlet对象时调用
		Init:servlet对象被创建后立即调用,一次生命周期只会被调用一次
		Service:每次被请求时服务器都会调用service处理用户请求
		Destroy:项目被销毁时服务器会调用destroy销毁servlet对象
		
Servlet与tomcat结合工作的原理:
Servlet本身是一个接口,通过在web.xml中配置实现servlet接口的实现类建立与tomcat的关系,
servlet默认在第一次接收请求时由tomcat创建其实现之后处理。
举例,如UserServlet在web.xml中的配置如下:
package com.atguigu.serlvet
public class UserServlet implement Servlet{ ... }

Web.xml

<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.atguigu.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/UserServlet</url-pattern>
</servlet-mapping>
  1. JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
答:JSP 是Servlet技术的扩展,本质上是Servlet,更强调应用的外表表达。
JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,
Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑
  1. forward 和 redirect 的区别?
答:
1)请求次数: 转发一次,重定向两次
2)浏览器地址:转发不变,重定向改变
3)使用request域共享数据:转发是一次请求可以共享数据,重定向浏览器发起两次请求,不能共享数据
4)相对路径: 转发地址不变会造成转发后的页面中的相对位置发生改变引起相对路径失效,重定向不会
5)效率:转发浏览器一次请求效率高,重定向效率低
6)WEB-INF下资源:转发可以访问,重定向不可以	
  1. JSP 中动态 INCLUDE 与静态 INCLUDE 的区别?
答:
相同点:都可以将指定资源引入到当前页面中
不同点:
①动态include使用<jsp:include >动作标签完成,引入的jsp页面也会翻译相应的java文件再编译成class文件,最后通过一个方法调用将资源引入
②静态include使用<%@ include %>指令标签完成,引入的jsp页面不会被翻译,而是将页面中代码原封不动的搬到当前页面的相应位置上,最后只翻译当前页面成java文件,再编译成class文件。
  1. jsp 有哪些内置对象?作用分别是什么?
答:
	pageContext: 页面上下文对象,在当前页面范围共享数据 、获取其他8个隐含对象
	request: 请求对象、请求域, 在一次请求中共享数据,获取请求报文信息,转发
	session: 会话对象,在浏览器打开第一次访问服务器开始到浏览器关闭期间共享数据
	application:全局上下文对象,在项目运行的一次过程中共享数据
	out:输出流 , 可以向响应报文响应体中写数据最终显示到页面上
	response: 响应对象, 向响应报文中写数据、重定向
	config: jsp翻译后的servlet对应的配置对象,获取配置信息
	page: jsp页面翻译后的servlet的实例对象。
	exception: 如果当前页面是错误页面才有,throwable类型,可以获取异常错误信息
  1. get 和 post 的区别?
答:
① 浏览器和表单的默认提交方式是get,get请求效率比post高
② get请求参数在url地址后拼接,所以有以下特点:
	请求报文没有请求体
	少了和请求体相关的请求头参数
	参数在url地址中拼接,上传参数大小有限制,不能用来上传文件,相对post请求不安全
③ post请求参数在请求报文的请求体中携带,有以下特点:
		请求报文有请求体,相对安全
		请求头多了和请求体相关的参数
		请求体数据没有大小限制可以用来上传文件
  1. jsp 的四种范围?
答:
pageContext:当前页面的上下文,在页面范围中共享数据,JSP页面特有的,每个页面都有自己的 
pageContext对象。
request:请求域,在一次请求中共享数据,转发也是一次请求能使用request共享数据
session:会话对象,浏览器打开第一次访问服务器开始到浏览器关闭的一次过程中可以共享数据
application:项目上下文对象,项目的一次运行过程中可以共享数据
  1. 请简述Session 和 Cookie 的区别和联系,如何实现用户的自动登录
答:
Cookie: 前段技术,服务器将数据设置到响应头中交给浏览器,浏览器会自动保存起来。默认保存一次会话。
Session:后端技术,服务器中的一个对象。保存在服务器中,当浏览器需要使用会话对象时,服务器会创建该对象并交给一个JSESSIONID的cookie给浏览器,浏览器访问服务器只要携带此cookie就能操作服务器中对应的session对象的了。
Session技术离不开cookie,但是它俩不是同一个概念。
  1. 简述Spring中IOC容器常用的接口和具体的实现类。
答:
1) BeanFactory  SpringIOC容器的基本设置,是最底层的实现, 面向框架本身的.  
2)ApplicationContext  BeanFactory的子接口, 提供了更多高级的特定. 面向开发者的.
3)ConfigurableApplicationContext, ApplicationContext的子接口,扩展出了 close 和 refresh等 关闭 刷新容器的方法
4)ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。
5)FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。
6)XmlWebApplicationContext:由Web应用的XML文件读取上下文。
  1. 说出Spring 或者 Springmvc中常用的5个注解 ,并解释含义
答:
[1]. @Component  基本注解,标识一个受Spring管理的组件
[2]. @Controller    标识为一个表示层的组件
[3]. @Service       标识为一个业务层的组件
[4]. @Repository    标识为一个持久层的组件
[5]. @Autowired     自动装配
[6]. @Qualifier(“”)    具体指定要装配的组件的id值
[7]. @RequestMapping()  完成请求映射
[8]. @PathVariable  映射请求URL中占位符到请求处理方法的形参	
  1. 请解释Spring Bean的生命周期?
答:
 1)默认情况下,IOC容器中bean的生命周期分为五个阶段:
	① 调用构造器 或者是通过工厂的方式创建Bean对象
	②给bean对象的属性注入值
	③ 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
	④使用
	⑤IOC容器关闭时, 销毁Bean对象.
	 
 2)当加入了Bean的后置处理器后,IOC容器中bean的生命周期分为七个阶段:
    ① 调用构造器 或者是通过工厂的方式创建Bean对象
    ② 给bean对象的属性注入值 
	③ 执行Bean后置处理器中的 postProcessBeforeInitialization
	④ 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
	⑤ 执行Bean的后置处理器中 postProcessAfterInitialization   
	⑥ 使用
	⑦ IOC容器关闭时, 销毁Bean对象 
  1. 简述SpringMvc里面拦截器是如何定义,如何配置,拦截器中三个重要的方法
答:
	(1).定义: 有两种方式
  		[1]. 实现HandlerInterceptor接口
  		[2]. 继承HandlerInterceptorAdapter
	(2).配置:
	<mvc:interceptors>
	<!--默认是对所有请求都拦截 -->
	<bean id="myFirstInterceptor" class="com.atguigu.interceptor.MyFirstInterceptor">
	</bean>	
<ref />
	<!-- 只针对部分请求拦截或者不拦截 -->
	<mvc:interceptor>
		<mvc:mapping path=" " />  <!—指定拦截-->
		<mvc:exclude-mapping path=””/> <!—指定不拦截-->
		<bean class=" com.atguigu.interceptor.MySecondInterceptor " /> 
	</mvc:interceptor>
	</mvc:interceptors>

	(3).拦截器中三个重要的方法
		[1]. preHandle
		[2]. postHandle
		[3]. afterCompletion
  1. 简单的谈一下SpringMVC的工作流程?
答:
1)用户发送请求至前端控制器DispatcherServlet 
2)DispatcherServlet收到请求调用HandlerMapping处理器映射器。 
3)处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给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响应用户
  1. MyBatis中 #{}和${}的区别是什么?
答:
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
  1. 简述MyBatis的单个参数、多个参数如何传递及如何取值。
答:
MyBatis传递单个参数,如果是普通类型(String+8个基本)的,取值时在#{}中可以任意指定,
${}只能通过两种方式:${_parameter},${value},如果是对象类型的,则在#{}或者${}中使用对象的属性名来取值
MyBatis传递多个参数,默认情况下,MyBatis会对多个参数进行封装Map. 取值时
在#{}可以使用0 1 2 .. 或者是param1 param2.. 

MyBatis传递多个参数,建议使用命名参数,在Mapper接口的方法的形参前面使用
@Param() 来指定封装Map时用的key. 取值时在#{}中使用@Param指定的key.
  1. MyBatis如何获取自动生成的(主)键值?
答:
      在<insert>标签中使用 useGeneratedKeys   和  keyProperty 两个属性来获取自动生成的主键值。
示例: 
    <insert id=”insertname” usegeneratedkeys=true” keyproperty=”id”> 
     insert into names (name) values (#{name}) 
</insert>
  1. 简述@RequestMapping注解的作用、可标注的位置、常用的属性
答:
1)该注解的作用是用来完成请求 与  请求处理方法的映射
2)该注解可以标注在类上或者是方法上
3)常用的属性:
	value: 默认属性, 用于指定映射的请求URL  value=/test”
	method: 指定映射的请求方式 
	params: 指定映射的请求参数  params={“username”,!password”,”sex=1,”age!=10}
	headers: 指定映射的请求头信息 headers={“username”,!password”,”sex=1,”age!=10}
  1. 简述REST中的四种请求方式及对应的操作
答:
	GET   查询操作
	POST  添加操作
	DELETE  删除操作
	PUT   修改操作
Books get
Book/{id} delete
Book/{id} get
Book put
Book post
  1. 简述Spring声明式事务中@Transaction中常用的两种事务传播行为
答:
通过propagation来执行事务的传播行为

REQUIRED: 使用调用者的事务,如果调用者没有事务,则启动新的事务运行
REQUIRES_NEW: 将调用者的事务挂起,开启新的事务运行。
  1. 简述动态代理的原理, 常用的动态代理的实现方式
答:
  动态代理的原理: 使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
      动态代理的方式:
       基于接口实现动态代理: JDK动态代理
       基于继承实现动态代理: Cglib、Javassist动态代理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

destiny- freedom

感觉怎么样呐?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值