当前位置:首页 > 数据库 > 正文

struts2拦截器工作原理 struts2的拦截器

struts2拦截器工作原理 struts2的拦截器

大家好,今天来为大家分享struts2拦截器工作原理的一些知识点,和struts2的拦截器的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相...

大家好,今天来为大家分享struts2拦截器工作原理的一些知识点,和struts2的拦截器的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

http status 404报错怎么解决

httpstatus404报错解决方法如下

1、未部署Web应用

2、URL输入错误排错方法:首先,查看URL的IP地址和端口号是否书写正确。其次,查看上下文路径是否正确Project--------Properties------MyElipse-----Web-----WebContext-root检查这个路径名称是否书写正确。最后,检查一下文件名称是否书写正确。

3、目录不能被引用在Eclipse的“包资源管理器(PackageExplorer)”检查文件存放的位置。

4、Tomcat服务器中web.xml中的问题排错方法:如果你的web应用程序有多个jsp页面的话,当你点击你web应用程序的虚拟根目录时可能会出现404错误,只是你只需要修改Tomcat服务器中web.xml补充说明:在6.0.18版本error:“Therequestedresource()isnotavailable.”

5、WEB-INF下面必须要有几个固定的文件夹和文件web.xml该webapp的配置文件lib该webapp用到的库文件classes存放编译好的servlet

6、如果要运行的不是.jsp文件,而是servlet(.class)文件,要配置web.xml(当然是WEB-INF下面的),加上以下字段:其中的“HelloWorldServlet”改为你要运行的文件名

7、struts.xml配置错误,可能是你的Action值写错或者链接URL写错。

8、增加commons-lang3-3.1.jar文件到啊WEB-INF/lib目录下。

ioc和aop原理和机制

IoC(InversionofControl)

(1).IoC(InversionofControl)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。对于Spring而言,就是由Spring来控制对象的生命周期和对象之间的关系;IoC还有另外一个名字——“依赖注入(DependencyInjection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态地将某种依赖关系注入到组件之中。

(2).在Spring的工作方式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

(3).在系统运行中,动态的向某个对象提供它所需要的其他对象。

(4).依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring中创建被调用者的工作由Spring来完成,然后注入调用者,即所谓的依赖注入or控制反转。注入方式有两种:依赖注入和设置注入;IoC的优点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。

AOP(AspectOrientedProgramming)

(1).AOP面向方面编程基于IoC,是对OOP的有益补充;

(2).AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

(3).AOP代表的是一个横向的关系,将“对象”比作一个空心的圆柱体,其中封装的是对象的属性和行为;则面向方面编程的方法,就是将这个圆柱体以切面形式剖开,选择性的提供业务逻辑。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹,但完成了效果。

(4).实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

(5).Spring实现AOP:JDK动态代理和CGLIB代理JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是InvocationHandler和Proxy。CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强;需要引入包asm.jar和cglib.jar。使用AspectJ注入式切面和@AspectJ注解驱动的切面实际上底层也是通过动态代理实现的。

(6).AOP使用场景:

Authentication权限检查

Caching缓存

Contextpassing内容传递

Errorhandling错误处理

Lazyloading延迟加载

Debugging调试

logging,tracing,profilingandmonitoring日志记录,跟踪,优化,校准

Performanceoptimization性能优化,效率检查

Persistence持久化

Resourcepooling资源池

Synchronization同步

Transactions事务管理

另外Filter的实现和struts2的拦截器的实现都是AOP思想的体现。

我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂。

主要用到的设计模式有工厂模式和代理模式。

IOC就是典型的工厂模式,通过sessionfactory去注入实例。

AOP就是典型的代理模式的体现。

代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

spring的IoC容器是spring的核心,springAOP是spring框架的重要组成部分。

在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。但在spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IoC);创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一个概念。

面向方面编程(AOP)是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对象编程(OOP)。OOP将应用程序分解成各个层次的对象,而AOP将程序分解成多个切面。springAOP只实现了方法级别的连接点,在J2EE应用中,AOP拦截到方法级别的操作就已经足够。在spring中,未来使IoC方便地使用健壮、灵活的企业服务,需要利用springAOP实现为IoC和企业服务之间建立联系。

IOC:控制反转也叫依赖注入。利用了工厂模式将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。注意:面试的时候,如果有条件,画图,这样更加显得你懂了.

AOP:面向切面编程。(Aspect-OrientedProgramming)AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。

实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码.

简单点解释,比方说你想在你的biz层所有类中都加上一个打印‘你好’的功能,这时就可以用aop思想来做.你先写个类写个类方法,方法经实现打印‘你好’,然后Ioc这个类ref=“biz.*”让每个类都注入即可实现。

Java新手如何学习Spring、Struts、Hibernate三大框架

学习Spring、Struts和Hibernate是很多初学者都会经历的阶段,要掌握这三个框架首先要清楚这三个框架都分别解决了哪些问题,同时要知道这三大常见框架的使用场景和框架的内部实现细节。

下面我将分别跟头条的朋友探讨一下这三个框架的细节,从它们分别能解决什么问题入手,然后进一步分析它们的组成结构。

Java基础知识准备

要开始学习Spring、Struts和Hibernate这三个框架,需要做充足的Java基础知识学习,知道这些知识才能知道为什么需要使用这三个框架。下面列出学习三大框架之前的基础知识:

Java面向对象开发基础。这部分内容包括类、对象、方法、属性四大概念,以及封装、继承、多态三大特征的使用。要清晰面向对象的开发过程:类的定义、对象的创建、方法的调用。

Java操作数据库。这部分内容包括Java如何与数据库进行沟通,如何通过java完成数据库的增删改查等基本操作。这部分内容还包括如何使用预处理模式提高效率,如何使用CallableStatement完成存储过程调用,以及如何使用数据库连接池来优化数据库操作。当然还要清楚使用DAO模式来规范化代码结构,而这也为使用Hibernate打下了一定的基础。

Javaweb开发基础。这部分内容包括Servlet、JavaBean、JSP的开发、调试、部署,清楚web开发的范围定义以及web容器的配置管理。要清楚webMVC结构,能使用Model2结构进行web程序开发,而这为使用Struts和Spring打下了基础。

(如果这部分知识你还不太了解可以关注我,我在头条上不断更新关于java开发的系列文章)为什么要使用Hibernate

要清楚为什么使用Hibernate,首先要明白Java操作数据库存在哪些问题,这些问题应该怎么解决?为了描述这些问题,首先我们看一下如何使用JDBC完成数据库操作,我们看一个图示:

这个图示描述了Java通过JDBC(一个专门操作数据库的JavaAPI)来操作各种数据库的结构图,图中Java代码直接完成对数据库的操作。接下来我们再看一下操作的原理图,也就是java操作数据库的细节描述图:

通过这张原理图,我们可以清楚的看到java如何使用JDBC完成与数据库的具体交互过程,使用JDBC操作数据是Java的官方标准,在经过不断的更新后,目前的JDBC性能已经得到了显著的提高。

在具体开发数据库操作的时候,我们通常会采用DAO模式,使用DAO的目的是模块化数据库操作,方便团队之间的协同化开发,为了描述DAO,我们看一张图示:

通过图示我们能发现,DAO位于业务层和数据库的中间,可以说它完成了一个映射的任务。这个映射就是从面向对象的Java代码向面向关系的数据提供了一个映射,再简单点说就是:DAO可以让Java程序员以面向对象的方式操作面向关系的数据库。

Hibernate的作用与DAO的作用是一样的,就是完成这个映射层的创建,可以说Hibernate是DAO的一个通用的实现。通过Hibernate程序员可以很方便的为程序创建与不同数据库产品之间的映射,从而让程序员从开发DAO实现的细节工作中解放出来,这就是为什么要使用Hibernate的原因。

学习Hibernate并不复杂,如果你已经有过编写DAO实验的经验,那么使用Hibernate能让你十分愉快,因为你再也不用编写麻烦的“封包”和“拆包”代码了。

为什么要使用Struts和Spring

为什么把Struts和Spring放在一起呢,因为它俩关系密切(其实Spring完全可以独立一站式解决问题),放在一起解释更加清晰。

在学习javaweb开发的时候,会学习到如何使用基于MVC结构的web开发,具体点就是使用Servlet+Javabean+JSP来完成Model2结构的开发,结构图如下所示:

图中完成了使用java代码的方式来编写MVC结构的程序,MVC的开发模式是大家公认的有效且经典的开发结构,目前基本上web开发的标准配置。

但是在大家自己编写MVC结构的时候,会比较麻烦(如果这部分内容不清楚,关注我,我会在后续文章中详细阐述如何使用java代码完成mvc开发),因为所有的导航代码都需要自己编写,将来调整的时候也非常麻烦。Struts就很好的解决了这个问题,程序员可以通过配置来完成程序的调整,节省了大量的编码时间,也让团队合作开发变得更容易了。简单的说Struts就是完成了程序MVC结构的实现。

那么在上图中,我们还会发现一个问题,在web容器中还运行着Model组件,而通常Model组件就是JavaBean组件。也就是说web容器既提供了web组件的池功能,又提供了业务组件的池功能,这势必会影响业务组件的运行性能。为了解决这个问题,出现了两个阵营:官方标准采用了大名鼎鼎的EJB,解决方案如图所示:

图中清晰的呈现了EJBserver,已经把业务模块从web容器中剥离出来了。而另一个解决方案就是Spring,它也是池化业务模块,只不过Spring更加轻量级,所以得到了广大程序员的喜爱。也就是从此,java开发背上了“较重”的标签。但是EJB目前仍然有它自己的特点,虽然重,但是功能也十分强大。

所以简单的说就是Struts完成了MVC框架的实现,Spring提供了业务模块的轻量级容器。

学习步骤

其实写到这,大家已经清楚了学习的步骤,因为文章的描述过程就是一个顺序的学习步骤。

在简单总结一下:

学习基础开发

学习数据库开发

学习web开发

学习Hibernate

学习Struts

学习Spring

整合

建议多做实验,也要经常到三大框架的官网多看一看,如果应用基础好的读者,可以到这几个框架的官方社区多看看,社区里有很多能力很强的开发者,跟他们交流一定能让你受益匪浅。

如果大家觉得这篇文章帮助你了解这三大框架,那么请关注我,跟我一起学习java知识,学习互联网知识。

谢谢!

JAVA中用Struts2上传文件以后,如何将文件的路径保存到我的数据库中的指定ID中呢

【文件上传】 form表单 //必须设置method="post"enctype="multipart/form-data"

struts.xml配置文件中,在result之后使用拦截器,设置上传文件类型 在Action中规定书写名称 XXXFileName //这个格式struts可以自动注入上传文件的文件名,加后缀名 XXXContextType //这个格式struts可以自动注入上传文件的文件类型 【文件下载】 用url传参或表单提交,将要下载的文件名称,传过去 struts.xml中配置 //下载的时候不需要地址跳转,所以没有result的值 如果需要struts注入传参,可以在result标签之上添加param标签 result配置type=stream 在action类中 方法只需要返回是否成功即可,在InputStream对象的get方法中进行重写

struts.xml配置文件的作用

struts.xml为Struts2的核心配置文件。struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。struts.xml中主要配置Struts项目的一些全局的属性,用户请求和响应Action之间的对应关系,以及配置Action中可能用到的参数,以及处理结果的返回页面。还包括各种拦截器的配置等。

好了,文章到这里就结束啦,如果本次分享的struts2拦截器工作原理和struts2的拦截器问题对您有所帮助,还望关注下本站哦!

最新文章