MVC与Struts2


MVC与Struts2
 
•Model1与Model2
 
–Model1顾名思义就是JSP+JavaBean编程,由JSP负责页面展现与业务逻辑的调用。早期的Java Web采用Model1开发
–Model1的优点:
•结构简单,易学上手快
•开发迅速
–Model1的缺点
•页面展现与业务逻辑耦合
•业务分散,维护困难
–Mode1的使用场景
•小型企宣网站
•从asp转型到jsp的web app
•Model2(MVC)
•Model2(MVC)
–Model1有着致命的缺陷,那就是业务逻                                                                      辑和页面展现严重耦合,导致在复杂场景下维护困难,代码可重用度很低。
–为了解决这个问题,Model2即MVC模式营运而生。
–MVC是三个单词的缩写,分别是:模型(Model),视图(View)和控制器(Controller)。MVC模式的目的就是实现Web系统的职能分工。
•Model层实现系统中的业务逻辑,通常是JavaBean或EJB来实现。
•View层用于与用户交互,通常是JSP来实现。
•Controller层是Model与View之间沟通的桥梁,他可以分派用户的请求并选择恰当的视图用于显示,同时它也可以解释用户的输出并将它映射为模型层可执行的操作。
 
•课上演示
•使用JSP+Servlet+JavaBean实现MVC模式
•理解Controller的用意
•Controller负责的三件事:
1.接收用户输入的数据
2.调用Model即业务逻辑实现功能
3.跳转到适当的页面显示结果
•JSP+Servlet+JavaBean的缺点
•在刚才的例子中,我们使用Servlet作为控制器实现了功能模块,但是使用Servlet作为控制器存在很多缺点:
1.Web.xml中配置一个Servlet需要配置很多行代码,切这些代码无法分隔,这在大型项目中会出现协作矛盾。
2.doGet()/doPost()方法有两个参数,Request、Response具有容器依赖性,不能用于单元测试。
3.在Servlet中,在处理多任务时,结构不够优美,且不能够自动扩展。
4.Servlet获取表单信息太麻烦。
•对Controller的重新设计
•设计的思路
1.找一个Servlet的替代者,这个替代者要与容器无关,我们使用一个普通的JavaBean类来作为Controller,为了将这个普通的JavaBean与其他JavaBean区分开,我们将其称之为Action(动作)。
2.利用URL来描述要执行的Action里面的方法, http://localhost:8080/struts2/userAction!reg.action

  执行Action中Add方法。

3.利用过滤器对.action请求进行拦截,然后利用Java反射动态创建Action,并调用需要的方法.
–获取Action对象:userAction
–获取要执行的方法:add
–利用Method.invoke() 动态调用userAction.add()方法
4.Filter中利用反射机制获取用户输入的信息,并提供类型转换。
5.Filter对执行过程中出现的异常进行统一处理。
•什么是框架
•框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
•框架就是游戏规则!!!!!!
•用框架,菜鸟也能写出优质的代码
•Struts2介绍
•了解什么是MVC,我们来正式认识Struts2的章节。
•Struts2这个名字的来源在建筑和旧式飞机中使用的金属支架。Struts2是 apache基金会jakarta项目组的一个开源项目,采用MVC模式,能够很好地帮助我们提高web开发的效率。
•截止到2014.7.14,Struts2的最新版本为2.3.16版本
•我们来开发第一个Struts2的Web程序
•1. 新建struts2 “web project”工程
•2. Struts2需要的Jar
•Struts2需要的Jar放到web-inf/lib目录下:
–struts2-core-2.3.16.3.jar
–xwork-core-2.3.16.3.jar
–Ognl-3.0.6.jar
–freemarker-2.3.19.jar
–asm-3.3.jar
–asm-commons-3.3.jar
–asm-tree-3.3.jar
–commons-fileupload-1.3.1.jar
–commons-io-2.2.jar
–commons-lang3-3.3.2.jar
–javassist-3.11.0.GA.jar
–tools.jar
•3. 配置核心过滤器
•打开web.xml
•4. 创建Action
•Action代码
•5. 增加配置信息
•在src目录下新建struts.xml文件
•Action配置与使用-核心配置文件
•Struts.xml是Struts2的核心配置文件,主要用于配置和管理开发人员编写的Action。在这个配置文件中,开发人员可以配置作用于Action的拦截器、action和Result映射等。
•Struts.xml通常放在web应用程序的WEB-INF/classes下,在该目录下的struts.xml将被Struts2框架自动加载《dtd约束》
•Struts-default.xml
•struts-default.xml是Struts2框架的核心配置文件,为框架提供默认设置,这个文件包含在struts2-core-xxxx.jar,由框架自动加载。
•<package name=“default” extends=“struts-default>
•struts-default包就是在struts-default.xml文件中定义的,这个包定义了Struts2内置类型结果,拦截器及拦截器栈,这些内容我们在后面的课程中会介绍。
•Struts2 如何获得前台的输入数据?
•Controller三件事,获取数据、处理逻辑、显示结果。
•那Struts2的Action作为Controller应该如何获取来自于前台表单的数据呢,Struts2为我们提供了2中方案:
1.PropertyDriven – 属性驱动
2.ModelDriven – 模型驱动
•PropertyDriven(属性驱动) - 1
•PropertyDriven第一种情况:
–当Action中属性名与表单name一致时,下面的表单提交后自动会将值赋给同名属性。
–这种情况适用在Action属性较少时使用。
•PropertyDriven(属性驱动) - 2
•PropertyDriven第二种情况:
–Action中属性不再是String\Integer\Double这些基本类型,而是POJO对象,那么表单元素的name值前增加对象变量名便可Action的POJO对象同名属性进行赋值
–这种用法很方便,可以直接对pojo属性进行赋值。但Action与JSP页面存在耦合,因为HTML编写者必须要知道Action中的属性名。
–有没有两全其美的办法?
•ModelDriven – 模型驱动
•PropertyDriven(属性驱动)-2 之所以需要在input中增加”user.”,是因为如果Action存在多个属性时Action不知道要为哪个属性进行,所以必须要HTML指定。
•要是在Action中指定好唯一的对象来接收表单数据,是不是input就不需要”user.”了.
•为了解决这个问题,ModelDriven应运而生,要使用ModelDriven,Action必须实现ModelDriven接口的getModel()方法,代码如下:
•ModelDriven代码
•Action配置与使用-Package
•Struts2中的包类似于Java中的包,提供将Action、Result、Result类型、拦截器组织为一个逻辑单元的方式,从而简化维护工作,提高了重用性。
•Package使用方式
•Action配置与使用-Action配置
•Struts2的核心是Action,对于开发人员来讲,使用Struts框架,就是编写Action的过程。
•Action是框架基本的“工作单元”。Action映射就是讲一个URL映射到Action,当请求某个Action名字的时候,框架就是用这个映射。
•Action元素的属性
•Action配置与使用-Action的定义方式
•Action定义方式有三种
–1. 标准的JavaBean作为定义
–2. 实现Action接口
–3. 继承ActionSupport
•Action配置与使用- Action定义方式
•Action接口与ActionSupport介绍
•Action接口为我们提供了默认的Result Name值
public static final java.lang.String SUCCESS = "success";
public static final java.lang.String NONE = "none";
public static final java.lang.String ERROR = "error";
public static final java.lang.String INPUT = "input";
public static final java.lang.String LOGIN = "login";
•在实际开发中,action类很少直接实现Action接口,通常都是从ActionSupport继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证、错误信息存取以及国际化的支持,选择从ActionSupport继承,可以简化Action的开发。
•Action的配置-Action方法的访问
•通过URL要访问Action中的方法有三种方式:
–默认的execute()
–动态方法
–使用Method配置
•Action方法的访问-默认方法execute
•当我们访问某一个Action时,如果没有特别声明,默认访问的是execute()方法。
•Action方法的访问-动态方法1
•动态方法(Dynamic Method Invocation , DMI)
•当Action中拥有多个方法时,我们可以在URL中增加“!方法名”的方式访问Action的指定方法。
•Action方法的访问-动态方法2
•动态方法虽然方便,但项目中不推荐使用,因为动态方法存在着严重的安全隐患,恶意用户可以利用这一特性对系统进行敏感操作。
•默认情况下动态方法被Struts2关闭,要打开使用需要更改Struts2的DynamicMethodInvocation设置,做法如下:
•这里的constant是指常量标签,用于更改Struts2的设置选项后面我们会经常用到它。
•Action方法的访问-Method配置
•Method配置
•在我们配置Action时,我们可以通过Action元素的method属性来指定action调用的方法。所指定的方法必须遵循与execute方法相同的格式
•Action配置与使用-结果映射
•结果映射代表一个可能的出处。当Action类的方法执行完成时,它返回一个字符串类型的结果码,根据这个结果码选择相应的result向用户输出。
•Action接口中预定义了一组标准的结果代码,可供开发人员使用。
•在struts.xml文件中,使用result元素来配置结果映射。result元素有两个可选的属性。
•Action配置与使用-结果映射
•全局结果映射
–之前我们配置的result都是针对action内部使用的返回类型,但像error页面这种通用的我们可以将其配置为全局结果,package内所有的Action都可以访问到这个result.
•Action与Servlet的交互
•Action与Servlet通信的桥梁:
1.ServletActionContext从这个类中得到Servlet容器的上下文。
2.ServletActionContext提供获取Request、Response、Session、ServletContext的对象。
•Action与多例模式
•与Servlet不同,Action是多例的,每一次请求Struts2都为我们创建一个Action的实例。

 

•Action配置与使用-多文件配合
•在大型项目中,为了降低项目的复杂度,便于团队成员的分工协作,通常将项目划分为较小的模块,每个单独开发与管理。Struts2也支持这种“分而治之”的策略,为每一个模块提供一个配置文件。

 

转载于:https://www.cnblogs.com/zhaisongfang/articles/4115210.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值