一、Struts1的运行原理

在启动时通过前端总控制器ActionServlet加载struts-config.xml并进行解析,当用户在jsp页面发送请求被struts1的核心控制器ActionServlet接收,ActionServlet在用户请求时将请求参数放到对应的ActionForm对象中的成员变量中,然后ActionServlet则会根据struts-config.xml中的映射关系找到相应的Action中的方法,将对应的ActionForm一并传给这个Action中的方法里,然后执行相应的业务逻辑操作,最后就根据ActionMapping的findforward方法返回一个ActionForward,之后在struts-config.xml中找到与之对应的forward标签,根据它的配置路径找到对应的jsp页面。

二、Struts2的运行原理opp

1、tomcat 启动的时候会加载 web.xml 、核心控制器 FilterDispatcher 会加载并解析 struts.xml

2、客户端会发送一个请求到 action 、FilterDispatcher  会根据后缀名进行拦截

3、FilterDispatcher根据 struts.xml  的配置文件信息 找到 某个action 对应的某个类里的指定方法

4、执行相关的业务逻辑最后返回 一个String

5、<action/> 里配置 <result/> name的属性值与返回的String 进行匹配,跳转到指定的jsp 页面

三、struts2的体系结构

1、客户端向Servlet容器(例如Tomcat)发送一个请求;

2、这个请求经过一系列的过滤器(Filter);

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是jsp或者FreeMarker的模版。(体系结构图见下一页)

四、Spring MVC运行原理

整个处理过程从一个HTTP请求开始:

1.Tomcat在启动时加载解析web.xml,找到spring mvc的前端总控制器DispatcherServlet,并且通过DispatcherServlet来加载相关的配置文件信息。

2.DispatcherServlet接收到客户端请求,找到对应HandlerMapping,根据映射规则,找到对应的处理器(Handler)。

3.调用相应处理器中的处理方法,处理该请求后,会返回一个ModelAndView。

4.DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将要显示的数据传给对应的视图,最后显示给用户。

五、Struts1.x与Struts2.x的区别

Struts 2以WebWork为核心,

采用拦截器的机制来处理用户的请求,struts1严重依赖于servletAPI,

属于侵入性框架,struts2不严重依赖于servletAPI,属于非侵入型框架。

线程模型方面:

Struts1的Action是单实例的,

一个Action的实例处理所有的请求。

Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),

没有线程安全方面的问题

封装请求参数:

Struts1中强制使用ActionForm对象封装请求的参数。

Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。

struts1的前端总控制器(核心总控制器)为ActionServlet,

struts2的前端总控制器(核心总控制器)为FilterDispather

六、Spring MVC、struts1和struts2区别

1.spring mvc 单例 非线程安全

struts1单例 非线程安全

struts2线程安全对每个请求都产生一个实例

2.spring mvc的入口是servlet,而struts2是filter

spring 的前端总控制器为 DispatcherServlet

struts2 的前端总控制器为 FilterDispatcher

struts1 的前端总控制器为 actionServlet

3. 参数传递:struts是在接受参数的时候,

可以用属性来接受参数,这就说明参数是让多个方法共享的。

springmvc 用方法来接受参数

4.spring mvc是基于方法的设计,而sturts是基于类

七、Struts2中result中的type类型

1.dispatcher:它是默认的,用来转向页面,通常处理JSP

    2.redirect:将用户重定向到一个已配置好的URL

    3.redirectAction:将用户重定向到一个已定义好的action

    4.chain:将action和另外一个action链接起来

    5.freemarker:呈现Freemarker模板

    6.httpheader:返回一个已配置好的HTTP头信息响应

    7.stream:向浏览器发送InputSream对象对下载的内容和图片非常有用

    8.velocity:呈现Velocity模板

    9.xslt :该XML可以通过XSL模板进行转换

    10.plaintext:显示原始文件内容,例如文件源代码

八、Struts2标签

首先需要引用 <%@taglib prefix="s" uri="/struts-tags"%>

1.<s:if></s:if> 判断标签 后面可跟 <s:else>

2.<s:iterator> </s:iterator> 迭代标签

3.<s:include></s:include> 引入标签 可以把一个JSP页面或者servlet引入一   个页面中

4.<s:property></s:property> 输出标签

5.<s:set></s:set> 标签赋予变量一个特定范围内的值

6.<s:form></s:form> 表单标签

7.<s:testarea></s:textarea> 文本域标签

8.<s:select></s:select> 下拉标签

9.<s:url></s:url> 声明一个url的路径

最常用的是:

判断<s:if></s:if>

循环<s:iterator></s:terator>

输出<s:property></s:property>

九、SSI整合

1、Action继承于Actionsupport

2、引入struts-spring-plugin.jar包,从而完成struts和spring的整合

3、在struts2的action中注入service,保证service的名字和配置文件中的一致,  并生成get,set方法

4、Dao层继承于SqlMapClientDaoSupport

5、在dao层的配置文件中注入sqlMapClient

十、SSH整合

1.首先在web.xml中通过ContextLoaderListener来融入spring,

并加载spring的相关配置文件

2.同样配置sturts2的前端总控制器filterDispatcher来过滤相关的

请求并且加载struts.xml

3.action继承ActionSupport,然后通过引入struts-spring-plugin.jar

包并且根据配置文件中service的id生成get,set方法来注入service层。

4.dao层继承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory.

5.通过spring中的配置文件加载hibernate.cfg.xml文件从而融入hibernate.

在ssh框架中是怎么整合spring?

首先在web.xml中通过ContextLoaderListener来融入spring,

并加载spring的相关配置文件

在ssh框架中是怎么整合hibernate?

通过spring中的配置文件加载hibernate.cfg.xml文件从而融入hibernate

dao层继承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory

在ssh框架中是怎么整合struts2?

配置sturts2的前端总控制器filterDispatcher来过滤相关的

请求并且加载struts.xml

十、Spring MVC整合

1.首先,要在web.xml里面配置SpringMVC的核心控制器,DispatcherServlet,对指定的后缀请求进行拦截。

2.Controller层要加 @Controller注解,表明该类是MVC的控制层。

3.创建Service接口,给接口加上注解 @Component或者 @Service 表明这是Service业务处理层

4.在Controller层声明Service变量(属性),给变量(属性) 加上 @Autowired注解,通过自动绑定机制将Service注入到Controller。 (注:@Autowired默认是ByType,如果想根据属性名注入,那么就再加上注解 @Resource(name="属性名"))

5.在Controller层的方法上加上注解 @RequestMapping("requestAddress") 表明该方法的请求地址

6.Dao层要加上注解 @Repository 表明这是数据库持久层

7.同样将dao实例注入到service层中。

8.配置视图解析器 "InternalResourceViewResolver",对处理后的跳转进行统一配置。

十一、Hibernate 中get 和 load的区别

加载方式:

    load为延迟加载(返回的是一个只有id属性的代理,只有使用该对象属性时,才   发出sql语句);

    get为立即加载(执行时,会立即向数据库发出sql语句)

返回结果:

    load检索不到记录时,会抛ObjectNotFoundException异常

    get检索不到记录时,会返回null

十二、Hibernate、Ibatis、Jdbc三者的区别

Hibernate属于全自动, Ibatis属于半自动,Jdbc属于手动,从开发效率上讲hibernate较高,ibatis居中,jdbc较低,从执行效率上讲hibernate较低,ibatis居中,jdbc较高,因为jdbc是手工写sql语句,程序员对sql的控制能力更大,可以根据业务需要进行优化,而ibatis虽然也可以对sql进行优化,但是他里面将resultset封装为实体的过程中采用了反射机制所以一定程度上影响了性能,而hibernate因为高度封装所以开发效率相对较高,但正因为这个原因,所以程序员在对sql语句的控制和优化方面相对比较弱,而且在将resultset封装成实体的过程中也采用了反射机制,所以在性能方面较低

十三、Hibernate的运行原理

首先通过configuration去加载hibernate.cfg.xml这个配置文件,根据

配置文件的信息去创建sessionFactory,sessionFactory是线程安全的,

是一个session工厂,用来创建session,session是线程不安全的,相当于

jdbc的connection,最后通过session去进行数据库的各种操作,在进行操作

的时候通过transaction进行事务的控制。

十四、Hibernate五大核心(类/接口)简述

1 .Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。(加载  hibernate.cfg.xml)并创建一个SessionFactory对象。

2 .SessionFactory接口

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建  Session对象。SessionFactory是线程安全的。

3 .Session接口

Session(会话)接口是Hibernate应用使用的主要接口。Session接口负责执行被持久化对象的CRUD操作(增删改查)。Session对象是非线程安全的。Session 相当于jdbc的connection

4 .Query与Criteria接口

总之Query和Criteria接口负责执行各种数据库查询。

5 .Transaction接口

Transaction(事务)负责操作相关的事务。

十五、Hibernate与JDBC的区别

1、hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库.

2、Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合

3、Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。

4、如果正确的使用JDBC技术,它的执行效率一定比hibernate要好,因为hibernate是基于jdbc的技术.

5、JDBC使用的是SQL语句,Hibernate使用的是HQL语句,但是HQL语句最终还会隐式转换成SQL语句执行。

十六、Hibernate中的两大配置文件

*.hbm.xml:主键生成策略,映射关系,一对多,一对一的关系。

Hibernate.cfg.xml:方言(用哪个数据库),数据库连接信息,包含*.hbm.xml内容,映射  文件,也可以配事务。

十七、Hibernate事务处理

开启事务 session.beginTransaction();

执行相关的操作,如果成功则session.getTransaction().commit();

执行操作失败则 session.getTransaction.rollback();

十八、Hibernate的三种状态以及状态的转换

Transient(临时)

new 一个初始化对象后,并没有在数据库里保存数据,处于临时状态;

Persistent(持久化)

当执行save()方法,调用session.close()方法之前,内存中的对象与数据库有           对应关系处于持久化状态;

Detached(托管/游离)

   当执行session.close()之后,处于托管状态;

状态的转换

处于托管状态下,调用update()方法后,转换为持久化状态;

在持久化状态下,执行delete()方法后,转换为临时状态;

在未初始化对象之前,调用get(),load(),find(),iterate()之后,直接进入持久化    状态。

十九、分页步骤

①前台封装一个显示分页的组件

②查询总条数

③后台封装分页工具类,计算开始位置、结束位置、总页数

④后台写支持分页的sql语句

⑤前台包含分页组件,实现分页效果

注意:

查询总条数的where和查询列表信息的where条件要保证一致。

二十、hibernate缓存概述

hibernate分为一级缓存即session缓存也叫事务级别的缓存以及

二级缓存sessionFactory即应用级别的缓存,还有查询缓存即三级缓存.

一级缓存的生命周期和session的生命周期保持一致,

hibernate默认就启用了一级缓存,

不能将其关闭,可以通过session.clear()和session.evict(object)来管理一级缓存。其中get,load,iterate都会使用一级缓存,一级缓存缓存的是对象。

二级缓存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多个session共享,hibernate3默认开启二级缓存,也可以手动开启并指定缓存插件如ehcache,oscache

等。二级缓存也只能缓存对象。

三级缓存也叫查询缓存,查询缓存是针对普通属性结果集的缓存,

对实体对象的结果集只缓存id。对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存

二十一、Ssh的概述:

ssh是web开发中常见的一种框架

s-struts

s-spring

h-hibernate

其中struts在框架中充当控制器,实现MVC,主要用来处理用户的请求,和跳转页面。使项目结构清晰,开发者只需要关注业务逻辑的实现即可。

spring在ssh充当粘合剂,粘合struts-sping-hibernate,主要用来进行事物的控制,

hibernate-充当数据库持久层,主要用它来与数据库交互,提高开发效率,减轻程序员sql控制要求,而且hibernate通过反射机制,有灵活的映射性,还支持各种关系,一对一,一对多,多对多。

在进行ssh整合的时候,我们应该注意:

1. Action继承于ActionSupport

引入struts-spring-plugin.jar包,从而完成struts和spring的整合

在struts2的action中注入service,保证service的名字和配置文件中的一致,并生成get,set方法

Dao层继承于hibernateDaoSupport

在dao层的配置文件中注入sessionFactory

二十二、防止表单重复提交

针对于重复提交的整体解决方案:

1.用redirect来解决重复提交的问题

2.点击一次之后,按钮失效

3.通过loading

4.自定义重复提交过滤器

5.解决struts2重复提交

可以结合s:token标签来解决重复提交问题

利用token的原理:

1.在前端的jsp页面中加入s:token标签,在访问该页面时就会生成

隐藏域,该隐藏域中包含一个随机生成的字符串,并把该字符串

存入session中

2.在struts2的配置文件中加入token拦截器后,当正常访问action

的时候,会从session中取出该字符串,然后和页面隐藏域中提交

字符串做对比,如果一致则正常执行并删除session中存储的字符串。

二十三、JSP标签:

1.JSP  include动作

jsp:include  动作

以“<jsp: 动作名 ” 开始,以“</jsp:动作名>  ” 结束

比如:<jsp:include page=" Filename" />

2.JSP指令:<%@ include%><%@   %>

以“<%@ ” 开始,以“%> ” 结束。比如:

<%@ include file = " Filename" %>

3.JSP输出表达式:<%= %><%=Java表达式 %>

输出变量的值,后边不能加<%= ; %>

4.JSP Scriptlet【脚本】:<% ;%>  <% Java 代码 %>

例子:

<% Calendar now = Calendar.getInstance(); %>

5.JSP声明:<%! %> <%! 函数或者方法 %>

例子:

<%!

String getHello(String name) {

return "Hi," + name + "!";

}

%>

6.迭代标签:<c:foreach>

Jstl中的核心标签(core)

7.JSP注释:

<!-- 这是注释,但客户端可以查看到 -->

<%-- 这也是注释,但客户端不能查看到 --%>

8.el表达式:${}

9.jsp:include动作是在运行时动态包含。

@include指令是在编译时包含。

它们两个都只能包含本项目的相关文件,不能包含其他项目的。

如果要包含其他项目的文件可以使用c:import

二十四、过滤器

filter的概述:

filter是一个过滤器,用来在请求前和响应后进行数据的处理。

filter的生命周期是:

实例化--->初始化(init)-->进行过滤(doFilter)--->销毁(destroy)-->释放资源

一个Filter必须实现javax.servlet.Filter接口

在项目中我们通常通过filter进行编码转换,

进行安全验证,进行重复提交的判断。

了解(不需要主动说)

filter 相当于 拦截器 相当于Spring AOP

servlet+jsp+javabean+jdbc+filter

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.leopard.filter.EncodingFilter</filter-class>

<init-param>

<param-name>encode</param-name>

<param-value>utf-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>*</url-pattern>

</filter-mapping>

二十五、拦截器的理解

什么是拦截器:

拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用

正如上面 Struts2的Reference中讲述的,Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或者之后执行拦截器的代码。

在项目中,我们经常用来拦截通过非正常程序而进行的访问

Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。

其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:

<package name="demo" extends="struts-default" > ... </package>

拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作

在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。struts2中默认的拦截器是defaultStack.

自定义拦截器需要特别注意的是不要忘记引入struts2默认的拦截器。为了实现某些操作,我们可以自定义拦截器,

自定义拦截器有三种方式定义。分别为实现Interceptor接口,继承抽象类AbstractInterceptor,继承MethodFilterInteceptor类。

拦截器在项目中的运用:

同时可以减轻代码冗余,提高重用率。

如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。对符合的登入者才跳转到正确页面。

二十六、Spring融入框架

我们通过在web.xml中配置ContextLoaderListener这个监听器也加载

spring的配置文件,从而融入到项目框架中。

二十七、项目的部署方式

1、如果项目单独部署到tomcat中的时候,应该看tomcat中的server.xml;

2、如果和eclipse结合使用进行项目部署的时候,应该看eclipse里面的server.xml.

Java框架知识点总结的更多相关文章

  1. 程序员必懂:javaweb三大框架知识点总结

    原文链接:http://www.cnblogs.com/SXTkaifa/p/5968631.html javaweb三大框架知识点总结 一.Struts2的总结 1.Struts 2的工作流程,从请 ...

  2. Java基础知识点

    以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...

  3. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  4. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  5. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  6. Java 面试知识点解析(五)——网络协议篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  8. Java基础知识点总结

    前言 本文主要是我之前复习Java基础原理过程中写的Java基础知识点总结.Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其 ...

  9. JAVA基础知识点总结(全集)

    1.JAVA简介 1.1java体系结构:j2se,javaweb,j2ee 1.2java特点:平台无关(虚拟机),垃圾回收(使得java更加稳定) 1.3 JDK与JRE,JDK:java开发环境 ...

随机推荐

  1. 将某视图View转换为UIImage

    + (UIImage *)getSharedScreenView{ UIWindow *screenWindow = [[UIApplication sharedApplication]keyWind ...

  2. MySQL8.0的安装与配置(Windows 10)

    MySQL的下载 进入MySQL官网 https://www.mysql.com/ 选择 DOWNLOAD 到页面底部找到 MySQL Community Edition (GPL) 找到MySQL ...

  3. 爬虫初窥day1:urllib

    模拟“豆瓣”网站的用户登录 # coding:utf-8 import urllib url = 'https://www.douban.com/' data = urllib.parse.urlen ...

  4. [AI]神经网络章3 损失函数

    损失函数 作用 在有监督的学习中,需要衡量神经网络输出和所预期的输出之间的差异大小.这种误差函数需要能够反映出当前网络输出和实际结果之间一种量化之后的不一致程度,也就是说函数值越大,反映出模型预测的结 ...

  5. VMware 15 Pro密钥

    YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8 UG5J2-0ME12-M89WY-NPWXX-WQH88 UA5DR-2ZD4H-089FY-6YQ5T-YPRX6 GA590-86Y0 ...

  6. oracl之导入dmp文件

    导入步骤比较简单SQL Develep->Tools->Import tables->选择上该dmp文件即可. 导出步骤也比较简单SQL Develep->Tools-> ...

  7. servlet 知识点 WebServlet("/")与WebServlet("/*")的区别

    (1)一个servlet的请求路径,如果配置成"/",那么它可以拦截除了.jsp之外的所有的请求. (2)一个servlet的请求路径,如果配置成"/*",那么 ...

  8. Codeforces 1107 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意简述:问你能不能把一个数字串切成若干块,使得切出来的kkk个数k≤2k\le2k≤2满足a1<a2<...&l ...

  9. 2019.01.03 bzoj3456: 城市规划(生成函数+多项式取对)

    传送门 生成函数好题. 题意:求n个点的简单(无重边无自环)无向连通图数目 思路: 对简单无向图构造生成函数f(x)=∑n2Cn2xnn!f(x)=\sum_n2^{C_n^2}\frac{x^n}{ ...

  10. 2018.11.07 NOIP模拟 分糖果(贪心)

    传送门 考虑 n = 2 时的情况:假定两个人分别为(a, b),(c, d),则当且仅当min(a,d) ≤ min(b,c)时,把(a, b)放在前面更优,否则把(c, d)放在前面更优 然后把n ...