1.什么是MVC?
MVC是Model,View,Controller的缩写,MVC是Application开发的设计模式,也就是大家所知道的Model2.
在MVC的设计模式中,它包括三类对象:
(1)模型(Model)对象:是应用程序的主体部分。
(2)视图(View)对象:是应用程序中负责生成用户界面的部分。
(3)控制器(Control)对象:是根据用户的输入,控制用户界面数据显示及更新Model对象状态的部分。控制器协调M与V,起来一个很好的纽带作用.
2.MVC有哪些优缺点?
优点:
1)视图控制模型分离, 提高代码重用性,提高开发效率,便于后期维护, 降低维护成本。
2)方便多开发人员间的分工。
缺点:
1)清晰的构架以代码的复杂性为代价, 对小项目优可能反而降低开发效率。
2)运行效率相对较低
3)目前没有比较好的rich 客户端的解决方案
4) 控制层和表现层有时会过于紧密,导致没有真正分离和重用
3. struts1的工作流程
Struts的工作流程:
在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中,同时通过IoC的思想注入了一些对象,如request,response等,当接收到一个客户请求时由tomcat进行一些前提的处理,如收集数据到request对象中,并调用ActionServlet对象,ActionServlet截取用户提交的URL,根据最终获得的PATH路径,匹配上struts-config.xml中配置的action,action经过相应的业务逻辑的处理,返回一定内容,最后交由服务器进行跳转.
整个请求与响应的过程中一些细节需要注意:
(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
5。struts1和struts2的区别和对比?
Action 类:
Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
线程模式:
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
Servlet 依赖:
Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测性:
测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
Struts 2 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).
绑定值到页面(view):
Struts 1使用标准JSP机制把对象绑定到页面中来访问。
Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换:
Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
校验:
Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
Action执行的控制:
Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
6.简述Struts Form Bean的表单验证流程
1、当用户提交了HTML表单,Struts框架自动把表单数据组装到ActionForm Bean中。
2、接下来Struts框架会调用ActionForm Bean的validate()方法进行表单验证。
3、如果validate()方法返回的ActionErrors 对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。
4、如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过<html:errors>标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误。
对于以上流程的步骤4 。如果ActionForm的validate()方法返回一个包含一个或多个ActionError的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含客户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute方法。
7. Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因
不是
声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope="prototype"来管理.
但是对于actionForm则不同, 每当有一次用户的请求,ActionFrom就会被创建一次
相关推荐
在本实例集中,我们将深入探讨几个经典的Struts2应用示例,这些示例对于初学者和进阶开发者来说都是极具价值的学习资源。 1. **Struts2 Showcase** `struts2-showcase-2.0.1.war` 是一个全面的演示应用,展示了...
在“Struts经典系列教程”中,你将学习到以下几个关键知识点: 1. **基础概念**:了解Struts的基本架构和工作原理,包括Action、Form Bean、Action Mapping、Servlet Filter以及Dispatcher Servlet等核心组件。 2....
Struts经典教程:深入理解Struts框架 在Java Web开发领域,Struts框架作为三大架构之一,以其强大的功能和灵活性,被广泛应用。本教程将详细介绍Struts的概念、体系结构及其在Web应用程序中的作用,帮助开发者更好...
- "Struts in Action":这本书深入介绍了Struts1的各个方面,包括设计模式、最佳实践以及常见问题解决。 - "MyEclipse开发Struts+Hibernate应用":这可能是一个指南,教读者如何在MyEclipse集成环境中使用Struts和...
这篇经典笔记主要涵盖了Struts2的核心概念,包括过滤器配置、命名空间、动作配置以及Action路径的问题。 首先,配置Struts2过滤器是启动框架的关键步骤。在`web.xml`文件中,你需要定义一个名为`struts2`的过滤器,...
Struts1.3是一个经典的Java Web框架,用于构建企业级应用程序。在Struts1.3中,页面跳转是常见的需求,它涉及到Action类、配置文件(struts-config.xml)以及JSP页面间的交互。本篇文章将深入探讨Struts1.3中的页面...
Struts2是Apache软件基金会的一个开源项目,它是Struts1的升级版,解决了Struts1中的许多问题,并引入了许多新特性。Struts2的核心是Action类,它是处理用户请求的中心,与视图和模型进行交互。此外,Struts2还提供...
它是Struts 1的升级版本,旨在解决其前任在灵活性、可扩展性和性能上的问题。Struts 2的核心是Action类,它作为控制器处理用户的请求,并与模型和视图进行交互。 在Struts 2框架中,动作类是业务逻辑的载体,用户...
Struts经典:深入理解Struts框架 Struts是一款开源的Java Web框架,它在2000年代初被广泛采用,极大地推动了MVC(Model-View-Controller)设计模式在企业级应用中的实践。本知识点将深入探讨Struts的核心概念、工作...
Struts2继承了Struts1的优点并解决了其不足,如性能问题和灵活性。 2. **Action类**:Action是Struts2的核心组件,它是业务逻辑的执行者。每个Action类对应一个特定的用户请求,负责处理请求、更新模型并决定视图。...
Spring、Struts和Hibernate是Java开发中的三大框架,它们各自负责不同的职责,组合起来可以构建出功能强大且架构...在实际开发中,还需要考虑性能优化、异常处理、安全性等方面的问题,以确保应用的稳定性和健壮性。
Struts是Java Web开发中的一个经典MVC(Model-View-Controller)框架,它由Apache软件基金会维护。在深入探讨Struts面试题之前,我们首先理解Struts1的基本架构和工作原理。 **1. Struts1框架的核心组件:** - **...
Struts则是一个经典的MVC(模型-视图-控制器)框架,用于构建Java Web应用程序。将Liferay与Struts整合,可以充分利用Struts的业务逻辑处理能力和Liferay的门户管理特性,打造出高效、灵活的应用系统。 在这个...
Struts2是一个流行的Web应用框架,它是作为Apache软件基金会下的一个开源项目被广泛开发和使用的。它最初由WebWork框架发展而来,并结合了Struts 1的优点...同时,他提及了版权问题,并对因此可能带来的不便表示歉意。
Struts 1是一个经典的Java Web开发框架,它在2000年代初非常流行,为MVC(Model-View-Controller)架构提供了强大的支持。然而,随着时间的推移,Struts 2和其他更现代化的框架如Spring MVC的出现,Struts 1逐渐失去...
Struts 1 是一款经典的Java Web框架,它主要用于构建基于MVC(Model-View-Controller)模式的应用程序。本文将详细介绍Struts 1的核心概念、配置以及开发过程。 首先,开始学习Struts 1需要搭建环境。这通常包括...
1. 使用Struts2提供的Debugging Interceptor,可以在页面上显示请求信息,帮助定位问题。 2. 异常处理:通过全局异常处理类或在struts.xml中配置全局结果,统一处理未捕获的异常。 七、最佳实践 1. 遵循代码规范,...