欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

【java学习】java web三大框架,

来源: javaer 分享于  点击 47584 次 点评:208

【java学习】java web三大框架,


0,概念

三大框架是用来开发web应用程序中使用的。
MVC是web开发常用的模式:
M即模型层(Model):主要由javabean来实现。
V即视图层(View):主要由jsp、velocity、freemarker等。
C即控制层(Controller):主要由servlet、strtus、springmvc来实现。

1,Struts

1)概念

①概念

Struts是最早的java开源框架之一,它是MVC设计模式的一个优秀实现。

②mvc

Struts定义了通用的Controller(控制器),通过配置文件(通常是 Struts -config.xml)隔离Model(模型)和View(视图),以Action的概念以对用户请求进行了封装,使代码更加清晰易读。 Struts还提供了自动将请求的数据填充到对象中以及页面标签等简化编码的工具。 Struts能够开发大型Java Web项目。

③ActionMapping

在一个web应用中,每个资源都必须通过URI来进行引用。 资源包括HTML页面,JSP页面,和定制动作。为了给定制动作一个 URI或者说路径,Struts框架提供了一个 ActionMapping对象。
描述了struts中用户请求路径和Action的映射关系,在struts中每个ActionMapping都是通过path属性和一个特定的用户请求URL关联。它负责转发用户请求给具体的Action,同时还转发了其他的一些相关信息,这种请求和处理动作之间的映射关系保存在struts-config.xml这个配置文件中,在web服务器初始化的时候,会加载这个配置文件,struts给每一个Action都创建一个ActionMapping对象,用来提供给Action使用,当ActionServlet转发请求的时候,ActionMapping对象会被作为参数传递给Action的execute()方法。

④ActionForm

本质上是一种JavaBean,是专门用来传递表单数据的DTO(Data Transfer Object,数据传递对象)。它包括用于表单数据验证的validate()方法和用于数据复位的reset()方法。
  Struts框架利用ActionForm对象来临时存放视图页面中的表单数据。例如,一个登录页面会有一个用户名输入框和一个密码输入框,以及用来提交登录请求的按扭。当用户提交登录请求后,Struts将 用户名和密码两个输入域的数据自动填充到相应的ActionForm对象中,然后控制层可以从该ActionForm对象中读取用户输入的表单数据,也可以把来自模型层的数据存放到ActionForm中,然后返回给视图显示。
  ActionForm有(request)和(session)两种作用域(scope)。如果ActionForm的作用域设定为request,ActionForm实例将保存在request对象中,像其他保存在request对象中的属性一样,仅在当前请求范围内有效。如果ActionForm的作用域设定为session,那么ActionForm实例将被保存在session对象中,同一个ActionForm实例在整个HTTP会话中有效。

④FilterDispathcer

(org.apache.struts2.dispatcher.FilterDispatcher)
在早期的Struts2开发中使用,从Struts 2.1.3开始,它已不推荐使用。
如果你使用的Struts的版本 >= 2.1.3,推荐升级到新的Filter:StrutsPrepareAndExecuteFilter (org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)。

2)Struts1

①Struts1 工作流程

1 ActionServlet接收由浏览器发出的请求后,检索和请求匹配的ActionMapping对象。如果不存在,返回请求无效的信息。
2 检索和请求匹配的ActionForm对象。如果不存在,就创建一个。把提交的表单中的数据保存在ActionForm对象中
3 根据配置信息决定是否进行校验。如果是,就进行校验。如果通过校验,进行下一步
4 ActionServlet根据ActionMapping对象包含的信息决定把请求转发给哪个Action。如果这个Action的对象不存在,就创建一个,然后调用它的excute方法
5 Action的excute方法返回一个ActionForward对象。ActionServlet把请求转发给ActionForward指定的JSP。
6 ActionFoward对象指定的JSP生成动态网页,返回给浏览器。

3)Struts2

①概念

struts2是webwork升级版,跟struts1没有关系。struts1和servlet耦合度高,各层之间耦合度高,单元测试困难,表示层技术单一,而struts2没有和servlet耦合,更容易测试,支持更多表示层技术。

②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中的配置找到对应的返回结果。
Struts2的核心就是拦截器。Struts.xml中所有的package都要extends=”struts-default”。同理与所有的Java类都要extends自Object一样。struts-default.xml里面就是要做以上事情。

4)Struts1与Struts2对比

①Action 类

struts1要求Action类继承一个抽象基类,而不是接口,struts2继承ActionSupport类或者实现Action接口。

②线程模式

struts1是单例模式的,Action资源必须是线程安全的或同步的,会有线程安全问题,struts2为每一个请求都实例化一个对象,不存在线程安全问题。

③Servlet 依赖

struts1依赖servlet API 因为execute方法的参数有httpservletrequest和httpservletresponse对象,而struts2不用依赖servlet。

④可测性

struts1依赖servlet API,所以测试要依赖web容器,测试难,struts2不依赖于容器,允许Action脱离容器单独被测试。

⑤捕获输入

• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。
• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

⑥表达式语言

• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--”Object Graph Notation Language” (OGNL).

⑦表现层技术

struts1 支持jsp作为表现层技术,struts2支持velocity、freemarker等表现层技术。

⑧生命周期

Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。 Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。

5)Structs中常用的组件

JSP、ActionServlet、ActionForm、Action、JavaBean、配置文件等。
(1)用户输入,JSP表单提交给ActionServlet。
(2)ActionServlet将表单信息封装在ActionForm内,转交Action。
(3)ActionServlet不直接处理业务逻辑,让Action来调用JavaBean(DAO)。
(4)Action返回要跳转的JSP页面地址给ActionServlet。
(5)ActionServlet进行跳转,结果在JSP上显示。
注意:
(1)ActionServlet先实例化LoginForm对象,然后调用LoginForm的setAccount函数,封装表单数据,然后实例化LoginAction进行处理。
(2)LoginForm和LoginAction第一次实例化之后就不会再实例化,这和Servlet的原理是一样的,实际上是一个对象用多线程的方式来运行。

6)Struts三个主要标签库:

(1)struts-html taglib(htm标签库):包含来生成动态HTML用户界面和窗体标签。
(2)struts-bean taglib(bean标签库):包含访问bean和bean属性时使用的标签,也包含一些消息显示的标签。
(3)struts-logic taglib(逻辑标签库):包含的标签来管理一些逻辑条件,根据逻辑条件进行一些操作。

7)工作流程

在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象。
当ActionServlet接收到一个客户请求时,将执行如下流程:
-(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
-(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
-(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
-(4)如果ActionForm的validate()方法返回或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
-(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
-(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
-(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;

2,Hibernate

1)概念

做持久化的,对JDBC轻量级的封装,使得我们能过面向对象的操作数据库。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使java程序员可以随心所欲地使用对象编程思想来操纵数据库。

2)优化

1.尽量使用many-to-one,避免使用单项one-to-many
2.灵活使用**单向**one-to-many
3.不用一对一,使用多对一代替一对一
4.配置对象缓存,不使用集合缓存
5.一对多使用Bag 多对一使用Set
6.继承使用显示多态 HQL:from object polymorphism=”exlicit” 避免查处所有对象
7.消除大表,使用二级缓存

3,Spring

1)概念

Spring采用了控制反转的技术(依赖注入”模式),管理Bean,降低了各层之间的耦合。
Spring是一个轻量级Java EE的框架集合。
Spring的使用可以实现声明事务。

2)“依赖注入”模式(Dependency Injection)

3)mvc

1.spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet将请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。

4)struts2与springmvc比较

1、spring mvc的入口是servlet,而struts2是filter
2、struts2是类级别的拦截, 一个类对应一个request上下文,springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
3、spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
4、spring3mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可

5)xml配置

①可以按照名称自动装配属性的注解是
autowire、Resource

相关文章

    暂无相关文章
相关栏目:

用户点评