基础概念(一)

1.GenericServlet是HttpServlet的父类,如果继承GenericServlet那么就需要重写service方法;

2.如果继承的是HttpServlet,就需要重写doGet和doPost方法;

       doGet:如果浏览器使用的是Get请求方式,那么就会有doGet方法进行处理;

       doPost:如果浏览器使用的是doPost请求方式,那么Servlet就会使用doPost方法进行处理;

3. 浏览器发送的请求信息会封装成一个Request对象传入到service方法中。

4.如果是继承了HttpServlet,那么首先会调用service方法进行处理,然后service方法会根据请求方式把请求分发到对应的doGet或doPost方法进行处理;

5.HTTP请求主要由请求行、请求头、请求正文所组成。

6.请求行 = 请求方式 + 访问的资源 + 协议版本。

7.Get请求和Post的区别?

(1)Get请求的参数会显示在URL上,Post请求的参数是存放到请求正文中;

(2)Get请求的URL的长度不能够大于1Kb,而Post请求的参数没有限制;

3)Get请求会在计算机本地生成一个缓存文件,而Post请求不会在本地生成一个缓存文件;

8. HTTP协议的版本分为1.0和1.1;

(1)       HTTP1.0  每次请求服务器的时候都会重新建立连接;

(2)       HTTP1.1  第一次请求会跟服务器建立连接,以后每次在请求的时候就不会重新再连接;

9. Servlet生命周期

 init():Servlet被创建的时候调用;(只调用一次)

service():每次用户请求Servlet的时候调用一次;(会被调用多次)

destory():Servlet被销毁的时候调用;(只调用一次)

10.Servlet的线程安全问题

Servlet其实使用了单例的设计模式来创建对象。用户向Tomcat服务器发送请求的时候,Tomcat服务器会每一个用户创建一个线程对象。多个线程对象会同时共享一个Servlet对象。这时候就有可能会引发线程安全问题。

解决办法:没有好的解决办法。

建议:(1)不要把用户相关数据存储到Servlet的属性中;(2)建议使用线程安全的类,例如:StringBuffer;

11.请求转发和请求重定向的区别

(1)请求转发只会创建一个request对象和response对象,而请求重定向会创建两个不同request和response对象;

(2)请求转发的地址栏是不会发生变化,而请求重定向的地址栏会发生变化;

(3)请求转发可以使用request域对象传递数据,而请求重定向不能够使用request域对象传递数据;

(4)请求转发不需要写项目名,而请求重定向是需要写上项目名;

       记住:如果请求是由服务器调用,就不需要加上项目名。如果请求是由浏览器调用,就需要加上项目名。

(5)请求转发只能够访问站内资源,而请求重定向可以访问站外资源;

12.请求包含

作用:把另外一个资源包含到当前的页面中来。

13.什么是域对象

域对象就是用来存储数据的对象,该对象可以实现不同Servlet之间的数据传输。

14.Servlet有哪些域对象,以及它们的作用范围是什么?

(1)PageContext:代表当前的JSP页面;

(2) Request:代表一次请求;

(3) Session:代表一次会话;从用户打开浏览器开始,然后发送请求给服务器,直到把浏览器关闭位置,这一个过程就称为一次会话。

(4)ServletContext:代表整个Web应用;

15. 域对象的常用方法

setAttribute(String name,Object value):往域对象中存储数据;

Object getAttribute(Stringname):从域对象中取出指定名称的值;

removeAttribute(String name):从域对象中删除指定数据;

16.ServletContext对象

Tomcat服务器启动的时候,它会为每个Web项目都创建一个ServletContext对象,该对象就代表了当前的Web应用。

17. 如何获取ServletContext对象

在Servlet中使用this关键来获取:ServletContext context =this.getServletContext();

18. 什么是会话?

会话就是指用户打开浏览器开始,然后向服务器发起请求,到浏览器关闭的这个过程,我们称为一次会话。

会话技术有两种:Session和Cookie。

19. 常用的Cookie操作

添加

 new Cookie(String name, Stringvalue):创建一个Cookie对象;

 setMaxAge():设置Cookie的最大有效时间(以秒为单位);

 setPath(String path):设置Cookie有效路径;

注意:

(1)如果设置Cookie的有效路径,那么该路径对应的Servlet中才可以读取该Cookie的数据,不是该路径的Servlet是不能够获取该Cookie;

(2)如果没有指定Cookie的有效路径,默认的路径就是当前工程的路径。也就是说,当前工程中的所有Servlet都可以获取该Cookie;

(3)如果没有设置Cookie的最大有效时间,默认就是浏览器关闭的时候Cookie就会消失;

查询

request.getCookies():获取所有的Cookie;getName():获取Cookie名字;getValue():获取Cookie的值;

删除

(1)第一步:创建一个同名的Cookie对象;

(2)第二步:设置Cookie的最大有效时间为0;

(3)第三步:把Cookie添加到Response对象中;

20. 什么Session技术?

 Session是一种服务端的会话技术。Tomcat服务器会为每一个浏览器都创建一个Session对象,也就是说,一个浏览器独享着一个Session对象。

21. Cookie和Session的区别

Cookie技术是基于浏览器端的会话技术;

Session技术是基于服务器端的会话技术(安全性更高);

22. Session常用的方法

request.getSession():获取一个Session对象。如果服务器没有该Session对象,它就创建一个该用户相对应的一个新的Session。如果服务器已经存在该Session对象,那么就会直接返回已有的Session对象。

 setAttribute(String name,String value):往Session域中存储数据;

getAttribute(String name):从Session域中读取数据;

注意:同一个机器的不同浏览器的session对象是不能够互相访问;不同机器的同一个浏览器是不能够访问;

removeAttribute(String name):删除Session中的执行数据;

疑问1:服务器怎么知道Session对应的浏览器?

浏览器向服务器发送请求的时候。服务器会查找是否已经存在了该浏览器所对应的Session对象,如果不存在就创建一个新的Session对象。如果存在就直接返回一个已有Session对象。然后再把Sesson对象的ID存储到一个Cookie对象中,并返回给浏览器。

疑问2:为什么Session会随着浏览器的关闭而关闭?

Tomcat服务器创建Cookie对象,然后把Session的ID存储到该Cookie对象中的时候,并没有设置该Cookie对象的最大有效时间。

注意:

1)浏览器关闭后,Session也会随之关闭;

2)Session是基于cookie的技术;

22.Session钝化和活化

什么是Session钝化?

Tomcat服务器关闭的时候,它会把Session对象中的数据存储到一个文件中,这个过程我们称为Session的钝化。

 什么是Session活化?

Tomcat服务器启动的时候,它会Session钝化文件读取到服务器的Session对象中,这个过程我们称为Session的活化。      

       注意:Session中的对象必须要是可以序列化的对象。

23. 使用URL重写来保持Session状态

       URL重写其实就在URL的后面添加JSESSIONID上去。通过该JSESSIONID来保持Session的状态。

      response.encodeURL(“访问的资源路径”);   //URL重写

24.JSP的工作原理
当用户第一次访问JSP页面的时候,JSP解析器会把该JSP文件翻译一个Java文件。该Java文件其实就是一个继承HttpServlet的Servlet类。我们在JSP页面上编写的所有Java代码,都会放在该Servlet类中的service方法中去执行 

 

25.JSP的九大内置对象,以及它们的作用?

request --- Request对象

response --- Response对象

session --- Session对象

out --- 是一个带缓存的输出流对象

exception --- 异常对象

page --- this(当前JSP页面)

application --- 相当于ServletContext对象,整个Web应用有效

config --- ServletConfig对象

pageContext --- PageContext对象,代表当前JSP页面的运行环境。

26.简述 Struts2 的工作流程:

①. 请求发送给 StrutsPrepareAndExecuteFilter

②. StrutsPrepareAndExecuteFilter 判定该请求是否是一个 Struts2 请求

③. 若该请求是一个 Struts2 请求,则 StrutsPrepareAndExecuteFilter把请求的处理交给 ActionProxy

④. ActionProxy 创建一个 ActionInvocation 的实例,并进行初始化

⑤. ActionInvocation 实例在调用 Action 的过程前后,涉及到相关拦截器(Intercepter)的调用。

⑥. Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果。调用结果的 execute 方法,渲染结果。

⑦. 执行各个拦截器 invocation.invoke() 之后的代码

⑧. 把结果发送到客户端


Struts2 拦截器 和 过滤器 的区别:

①、过滤器依赖于 Servlet 容器,而拦截器不依赖于 Servlet 容器。

②、Struts2 拦截器只能对 Action 请求起作用,而过滤器则可以对几乎所有请求起作用。

③、拦截器可以访问 Action 上下文(ActionContext)、值栈里的对象(ValueStack),而过滤器不能.

④、在 Action 的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

为什么要使用 Struts2 & Struts2 的优点:

①. 基于 MVC 架构,框架结构清晰。

②. 使用 OGNL: OGNL 可以快捷的访问值栈中的数据、调用值栈中对象的方法

③. 拦截器: Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。拦截器是可配置与重用的

④. 多种表现层技术. 如:JSP、FreeMarker、Velocity 等

Struts2 如何访问 HttpServletRequest、HttpSession、ServletContext三个域对象 ?

①. 与 Servlet API 解耦的访问方式

> 通过 ActionContext 访问域对象对应的 Map 对象

> 通过实现 Aware 接口使 Struts2 注入对应的 Map 对象

②. 与 Servlet API 耦合的访问方式

> 通过 ServletActionContext 直接获取 Servlet API 对象

> 通过实现 ServletXxxAware 接口的方式使 Struts2 注入对应的对象

Struts2 中的默认包 struts-default 有什么作用?

①. struts-default 包是 struts2 内置的,它定义了 struts2 内部的众多拦截器和 Result 类型,而 Struts2 很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到 action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了 struts-default 包才能使用 struts2 为我们提供的这些功能。

② .struts-default 包 是 在 struts-default.xml 中 定 义 ,struts-default.xml 也是 Struts2 默认配置文件。 Struts2 每次都会自动加载 struts-default.xml 文件。③. 通常每个包都应该继承 struts-default 包。

说出struts2中至少 5 个的默认拦截器exception;fileUpload;i18n;modelDriven;params;prepare;token;tokenSession;validation 等

谈谈 ValueStack:

①. ValueStack 贯穿整个 Action 的生命周期,保存在 request 域中,所以 ValueStack 和 request 的生命周期一样. 当 Struts2 接受一个请求时,会迅速创建 ActionContext,ValueStack,Action. 然后把 Action 存放进ValueStack,所以 Action 的实例变量可以被 OGNL 访问。 请求来的时候,Action、ValueStack 的生命开始;请求结束,Action、ValueStack 的生命结束

②. 值栈是多实例的,因为 Action 是多例的(和 Servlet 不一样,Servelt是单例的),而每个 Action 都有一个对应的值栈,Action 对象默认保存在栈顶;

③. ValueStack 本质上就是一个 ArrayList(查看源代码得到);

④. 使用 OGNL 访问值栈的内容时,不需要#号,而访问 request、session、application、attr 时,需要加#号;

⑤. Struts2 重写了 request 的 getAttribute 方法,所以可以使用 EL直接访问值栈中的内容

ActionContext、ServletContext、pageContext 的区别

①. ActionContext Struts2 的 API:是当前的 Action 的上下文环境

②. ServletContext 和 PageContext 是 Servlet 的 API

Struts2 有哪几种结果类型 ?

参看 struts-default.xml 中的相关配置:dispatcher、chain、redirect等

拦截器的生命周期与工作过程 ?

每个拦截器都是需要实现 Interceptor 接口

> init():在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化;> intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次;

> destroy:该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;

如何在 Struts2 中使用 Ajax 功能 ?

①. JSON plugin

②. DOJO plugin

③. DWR plugin

④. 使用 Stream 结果类型

Hibernate 的检索方式有哪些 ?

① 导航对象图检索

② OID 检索

③ HQL 检索

④ QBC 检索

⑤ 本地 SQL 检索

在 Hibernate 中 Java 对象的状态有哪些 ?

①. 临时状态(transient):不处于 Session 的缓存中。OID 为 null 或等于 id 的 unsaved-value 属性值

②. 持久化状态(persistent):加入到 Session 的缓存中。

③. 游离状态(detached):已经被持久化,但不再处于 Session 的缓存中

Session 的清理和清空有什么区别?

清 理 缓 存 调 用 的 是 session.flush() 方 法 . 而 清 空 调 用 的 是session.clear() 方法.Session 清理缓存是指按照缓存中对象的状态的变化来同步更新数据库,但不清空缓存;清空是把 Session 的缓存置空, 但不同步更新数据库;

load()和 get()的区别

①:如果数据库中,没有 OID 指定的对象。通过 get 方法加载,则返回的是一个 null;通过 load 加载,则返回一个代理对象,如果后面代码如果调用对象的某个属性会抛出异常:org.hibernate.ObjectNotFoundException;

②:load 支持延迟加载,get 不支持延迟加载。

hibernate 优缺点

①. 优点:

> 对 JDBC 访问数据库的代码做了封装,简化了数据访问层繁琐的重复性代码

> 映射的灵活性, 它支持各种关系数据库, 从一对一到多对多的各种复杂关系.

> 非侵入性、移植性会好

> 缓存机制: 提供一级缓存和二级缓存

②. 缺点:

> 无法对 SQL 进行优化

> 框架中使用 ORM 原则, 导致配置过于复杂

> 执行效率和原生的 JDBC 相比偏差: 特别是在批量数据处理的时候

> 不支持批量修改、删除

描述使用 Hibernate 进行大批量更新的经验.

直接通过 JDBC API 执行相关的 SQl 语句或调用相关的存储过程是最佳的方式

Hibernate 的 OpenSessionView 问题

①. 用于解决懒加载异常, 主要功能就是把 Hibernate Session 和一个请求的线程绑定在一起, 直到页面完整输出, 这样就可以保证页面读取数据的时候 Session 一直是开启的状态, 如果去获取延迟加载对象也不会报错。

②. 问题: 如果在业务处理阶段大批量处理数据, 有可能导致一级缓存里的对象占用内存过多导致内存溢出, 另外一个是连接问题: Session 和数据库Connection 是绑定在一起的, 如果业务处理缓慢也会导致数据库连接得不到及时的释放, 造成连接池连接不够. 所以在并发量较大的项目中不建议使用此种方式, 可以考虑使用迫切左外连接 (LEFT OUTER JOIN FETCH) 或手工对关联的对象进行初始化.

③. 配置 Filter 的时候要放在 Struts2 过滤器的前面, 因为它要页面完全显示完后再退出.

Hibernate 中 getCurrentSession() 和 openSession() 的区别 ?

①. getCurrentSession() 它会先查看当前线程中是否绑定了 Session,如果有则直接返回, 如果没有再创建. 而 openSession() 则是直接 new 一个新的 Session 并返回。

②. 使用 ThreadLocal 来实现线程 Session 的隔离。

③. getCurrentSession() 在事务提交的时候会自动关闭 Session, 而openSession() 需要手动关闭.

如何调用原生 SQL ?

调用 Session 的 doWork() 方法.

说说 Hibernate 的缓存:

Hibernate 缓存包括两大类:Hibernate 一级缓存和 Hibernate 二级缓存:

(1). Hibernate 一级缓存又称为“Session 的缓存”,它是内置的,不能被卸载。由于 Session 对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的 OID。

(2). Hibernate 二级缓 存又称 为“SessionFactory 的缓存 ”,由于SessionFactory 对象的生命周期和应用程序的整个过程对应,因此 Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory 不会启用这个插件。当 Hibernate 根据 ID 访问数据对象的时候,首先从 Session 一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照 ID 放入到缓存删除、更新、增加数据的时候,同时更新缓存。

开发中主要使用 Spring 的什么技术 ?

①. IOC 容器管理各层的组件

②. 使用 AOP 配置声明式事务

③. 整合其他框架.

简述 AOP 和 IOC 概念

AOP: Aspect Oriented Program, 面向(方面)切面的编程;Filter(过滤器)也是一种 AOP. AOP 是一种新的方法论, 是对传统 OOP(Object-OrientedProgramming, 面向对象编程) 的补充. AOP 的主要编程对象是切面(aspect),而切面模块化横切关注点.可以举例通过事务说明.

IOC: Invert Of Control, 控制反转. 也成为 DI(依赖注入)其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源.作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式

在 Spring 中如何配置 Bean ?

Bean 的配置方式: 通过全类名(反射)、通过工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean

IOC 容器对 Bean 的生命周期:

①. 通过构造器或工厂方法创建 Bean 实例

②. 为 Bean 的属性设置值和对其他 Bean 的引用

③ . 将 Bean 实 例 传 递 给 Bean 后 置 处 理 器 的postProcessBeforeInitialization 方法

④. 调用 Bean 的初始化方法(init-method)

⑤ . 将 Bean 实 例 传 递 给 Bean 后 置 处 理 器 的postProcessAfterInitialization 方法

⑦. Bean 可以使用了

⑧. 当容器关闭时, 调用 Bean 的销毁方法(destroy-method)

Spring 如何整合 Struts2 ?

整合 Struts2, 即由 IOC 容器管理 Struts2 的 Action:

> 安装 Spring 插件: 把 struts2-spring-plugin-2.2.1.jar 复制到当前 WEB 应用的 WEB-INF/lib 目录下

> 在 Spring 的配置文件中配置 Struts2 的 Action 实例

> 在 Struts 配置文件中配置 action, 但其 class 属性不再指向该Action 的实现类, 而是指向 Spring 容器中 Action 实例的 ID

Spring 如何整合 Hibernate整合 Hibernate, 即由 IOC 容器生成 SessionFactory 对象, 并使用Spring 的声明式事务

> 利用 LocalSessionFactoryBean 工厂 Bean, 声明一个使用 XML 映射文件的 SessionFactory 实例.

> 利用 HibernateTransactionManager 配置 Hibernate 的事务管理器

Spring MVC 比较 Struts2

①. Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter

②. Spring MVC 会稍微比 Struts2 快些. Spring MVC 是基于方法设计,而 Sturts2 是基于类, 每次发一次请求都会实例一个 Action.

③. Spring MVC 使用更加简洁, 开发效率 Spring MVC 确实比 struts2 高:支持 JSR303, 处理 ajax 的请求更方便

④. Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些

Spring MVC 的运行流程

①. 在整个 Spring MVC 框架中, DispatcherServlet 处于核心位置,负责协调和组织不同组件以完成请求处理并返回响应的工作

②. SpringMVC 处理请求过程:

> 若一个请求匹配 DispatcherServlet 的请求映射路径(在 web.xml中指定), WEB 容器将该请求转交给 DispatcherServlet 处理> DispatcherServlet 接收到请求后, 将根据请求信息(包括 URL、HTTP方法、请求头、请求参数、Cookie 等)及 HandlerMapping 的配置找到处理请求的处理器(Handler). 可将 HandlerMapping 看成路由控制器,将 Handler 看成目标主机。

> 当 DispatcherServlet 根据 HandlerMapping 得到对应当前请求的Handler 后,通过 HandlerAdapter 对 Handler 进行封装,再以统一的适配器接口调用 Handler。

> 处 理 器 完 成 业 务 逻 辑 的 处 理 后 将 返 回 一 个 ModelAndView 给DispatcherServlet, ModelAndView 包含了视图逻辑名和模型数据信息

> DispatcherServlet 借助 ViewResoler 完成逻辑视图名到真实视图对象的解析> 得到真实视图对象 View 后, DispatcherServlet 使用这个 View 对ModelAndView 中的模型数据进行视图渲染

说出 Spring MVC 常用的 5 个注解:

@RequestMapping 、 @PathVariable 、 @RequestParam 、 @RequestBoy 、@ResponseBody

如何使用 SpringMVC 完成 JSON 操作:

①. 配置 MappingJacksonHttpMessageConverter②. 使用 @RequestBody 注解或 ResponseEntity 作为返回值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值