基于J2EE的MVC设计模式的WEB应用开发应用及探讨

MVC设计思想 【Model-view-controller(模型层-视图层-控制层)】

视图: 视图是用户看到并与之交互的界面,视图向用户展示用户感兴趣的业务数据,并能接受用户输入的数据,但是视图并不进行任何实际的业务处理,视图可以向模型层查询业务数据,但不能直接改变模型中的业务数据,视图还能接收模型发出的业务数据更新事件,从而对用户界面进行同步更新

模型: 模型是应用程序的主题部分,模型表示数据和业务逻辑。一个模型能为多个视图提供业务数据。同一个模型可以被多个视图重用。

控制器:控制器接收用户的输入并调用模型和视图去完成用户请求。当用户在视图上选择按钮或者菜单时,控制器接收请求并调用相应模型组件去处理请求,然后调用相应的视图来显示模型返回的数据。

总结:MVC的三个模块也可以视为软件的三个层次。最上层为视图层,总间的为控制层,下层为模型层。总的来说,层与层之间为自上而下的依赖关系。下层组件为上层组件提供服务。

视图层与控制层依赖模型层用来处理业务逻辑和提供业务数据。此外,层与层之间还存在两处自下而上的调用 一处是控制层调用视图层来显示业务数据,另一处是模型层通过客户层同步刷新界面。为了提供每个层的独立性,应该使每个层对外公开接口,封装其具体实现。
MVC的处理过程 :用户在视图提供的界面上发送请求,视图层把请求转发给控制器,控制器调用相应的模型来处理用户的请求,模型进行相应的业务逻辑处理,并返回数据,最后控制层调用相应的视图来显示模型返回数据

 

WEB发展历程

随着web的发展,传统的C/S(客户端/服务器)开发模式正在向B/S(浏览器/服务器)模式转换,更多的应用系统采用了B/S结构

WEB是一种典型的分布式应用框架,web应用中的每一次信息交换斗要涉及客户端和服务器两个层面,因此web开发技术大体上也可以分为客户端技术和服务器端技术两大类。

web客户端的主要任务是展现信息内容,而html语言则是展现的最有效的载体之一,(Html语言只能在浏览器钟展现静态的文本或者图像信息)

web服务器端的开发技术也是有静态向动态逐渐的发展起来,完善起来。第一种真正使服务器能根据运行时的具体情况,动态生成HTML页面的是CGI技术 ,CGI技术允许服务器端的应用程序根据客户端的请求,动态的生成HTML页面。这样才实现服务器端和客户端实现信息交互。
CGI技术开启了动态Web应用的时代,给了这种技术无限的可能性,但CGI技术存在很多的缺点,其中最大的缺点就是开发动态的Web应用难度非常大。而且在性能等各方面也存在限制。

基于Servlet的MVC设计模式
模型(Model):对应的组件是JavaBean(Java类);
视图(View):对应的组件是JSP或HTML文件;
控制器(Controller):对应的组件是Servlet;

模型可以分为业务模型和数据模型,他们代表应用程序的业务逻辑和状态
视图提供可交互的客户界面,向客户显示模型数据,控制器响应客户的请求,根据客户的请求来操作模型,并把模型的响应结果经由视图展现给客户

相比传统的CGI应用语言Servlet具有大量的优势
1:Servelet是基于java语言创建的,而java语言则内建了多线程的支持,这一点大大提高了动态Web应用的性能呢个
2 Servlet应用可以充分利用java语言的优势,例如JDBC等,同时Java语言提供了丰富的类库,这斗简化了Servlet的开发
3除此之外,Servlet隐匿性在web服务器中,由Web服务器去负责管理Servlet的实例化,并对客户端提供多线程、网络通信等功能。这斗保证Servlet有更好的稳定性和性能。
总结:Servlet在Web应用中被应射成一个URL(统一资源定位),该URL可以被客户端浏览器请求。当用户指定URL对应的Servlet发送请求时,该请求被Web服务器接收到,该Web服务器负责出来多线程、网络通信等功能。而servlet的内容决定了而服务器对客户端响应内容
CGI(定义);(common Gateway Interface 通用网关接口)是HTTP服务器与程序进行“交谈”的一种工具,其程序须运行在网络服务器上
功能: 绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器,CGI程序使网页具有交互功能

 

struts1的mvc
struts1作为一个MVC框架,Struts对Model,View,controller都提供了对应的实现组件
(1)Controller 控制器是struts框架中的核心组件,由ActionServlet类实现。ActionServlet继承了javax.Servlet.http.HttpServlet类。主要负责接收Http请求信息,根据配置文件struts-config.xml的配置信息,把请求转发给适当的Action对象,Action类负责逻辑控制以及对Model的访问,所有Servlet必须在Web配置文件web.xml中声明
 (2)Model 模型表示对应用程序的状态和业务逻辑。struts为Model部分提供了ActionForm和Action对象
ActionForm可封装客户的表单数据,jsp文件使用Struts标签传递用户数据至ActionForm。Action对象封装了具体的处理逻辑,调用业务逻辑模块,并把响应提交到合适的View组件以产生响应。Action类侧重于控制应用程序的流程。而不是控制应用程序的逻辑
(View) Struts 应用中View通过Jsp技术实现,视图中不包含业务逻辑和模型信息只有标签,Strtus提供自定义标签库,大大简化了JSP代码,提高了开发效率,页面里包换标准的Jsp标签或Struts标签库中的标签
另外,利用资源配置文件ApplicationResources.properties可实现消息的国际化和本地化。页面上所有静态文字信息斗可以定义在该属性中,不同语言可定义不同的属性文件,,在改变页面文字信息时直接修改属性文件,不需要修改Jsp
Struts1的优点
1:实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现。
2: 有丰富的tag可用,Struts标签库如果能灵活使用将大大的提高开发效率
3 页面导航 通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有很大的好处
4 提供Exception处理机制
5 数据库链接池管理
6  支持I18N;
strtus1 缺点
1 :需要配置forward,每一次转到视图层,有很多次是直接转到jsp而涉及转向时,需要配置forward,如果有10个视图层jsp,需要配置10次Struts,而且还不包括有时候目录、文件的变更,需要重新修改forward。并且每次修改配置之后,要求重新部署整个项目,而对于Tomcat服务器,就必须要重新启动服务器
2 :Strtus的action必须是thread-safe方式;它仅仅允许一个实例去处理所有的请求。所以Action用到的所有资源都必须是统一同步,这就引起线程安全、
3 :测试不方面,Struts的每一个Action都同Web层耦合在一起,这样它的测试依赖于web容器,单元测试也很难实现。,因为Struts1框架是MOdel2基础上发展起来的,因此她是基于Servlet API的,所以在Struts1的业务逻辑控制内,充满了大量的Servlet API。不过有一个JUnit的扩展工具Struts Test Case 可以实现它的单元测试
//业务逻辑控制器必须继承Struts1 提供的Action类
public class LoginAction extends Action{
 public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws AutionException{

 //获取封装用户请求参数的ActionForm对性
        //将其强制类型转换为登陆用的ActionForm
 LoginForm loginForm=(LoginForm)form;
 //当用户名为Scott、密码为tiger时返回成功
 if("scott".equals(looginForm.getUsername())&& "tiger".equals(loginForm.getPassword())){
 //处理成功,返回一个ActionForward对象
 return mapping.findForward("success");
}
 esle{
  //处理失败,返回一个ActionForward对象
 return mapping.findForward("error");
 }
}

}


 当我们需要测试上面的Action类的execute方法时,该方法有4个参数:ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化这4个参数比较困难,尤其是HttpServletRequest和HttpServletResponse两个参数,通常由Web容器负责实例化。因为HttpServletRequest和HttpServletResponse,连个参数是Servlet API 严重依赖于web服务器,因此,一旦脱离Web服务器,Action的测试非常困难,它严重依赖于Struts1 API属于侵入式设计。
4:类型的转换:Strtus的FormBean 把所有的数据都作为String类型,它可以使用工具COmmons—Beanutils进行类型转化,
5 :对于Servlet的依赖性过强:Struts处理Action时必须要依赖servlet API 中的ServletRequest和servletResponse,所以它摆脱不了Servlet容器
6:对于Action执行的控制困难 :Struts创建一个Action,如果想控制它的执行顺序将会非常困难,甚至要去写Servlet来实现功能需求

 

 

struts的简介
struts2 是struts1的升级产品,不过,从本质上struts2是由WebWork2衍变而来的。
struts2去掉了struts1中的ActionForm 实现了同Servlet API松散耦合,Struts2不是一个全新的框架
,而是继承了Struts1和WebWork的优点。在稳定性,易用性方面都有了很大的提高。

strut的配置文件小述
<package name="mian" namespace="/mian" extends="struts-defauult">
 <action  name="login" class="com.xinyang.action.LoginAction" method="execute">
  <result name="succ">/WEB-INF/page/htllo.jsp<result>
 </action>
</package>
在struts框架中使用包来管理Action,包的作用和java中类包是非常相似的,它主要用于管理一组月ugongneng相关的action。在实际应用中,我们应该把一组业务功能相关的Action放到同一包下


配置包时必须指定name属性,该name属性值可以任意取名,但必须唯一,他不对应java的类包。如果其他包要继承该包,必须通过属性进行指引,包的namespace属性用于定义该包的命名空间,命名空间作为访问该包Action的路径的一部分,如不写namespace 或者 namespace="" 则为默认的匿名空间 。如访问上面例子的Action 访问路径为:/mian/login.action
namespace属性可以不配置,对上面配置代码所言,如果不指定该属性。默认的命名空间为""(空字符串)

通常 每个包都应该继承struts-default包,以为内Struts很多核心的功能都市拦截器来实现。如:从请求中把请求参数封装到action、文件上传、和数据校验等等都市通过拦截器来实现的、struts-default定义了这些拦截器和Result类型。可以这么说:当包继承了Struts-default才能使用struts提供的核心功能。
struts-default包是在struts2-core-2.x.x.jar 文件中struts-default.xml中定义。struts-default.xml也是Struts2默认配置文件。struts2每次斗会自动拦截struts-default.xml文件
包还可以通过abstrace="true" 定义抽象包,抽象包不能包含action


在这里我们把jsp视图文件放到WEB-INF目录下因为当前的jsp仅供struts的Action使用,所以我们不希望用户通过浏览器直接访问 ,反之当用户在浏览器中直接访问是没有意义的,jsp需要通过action获取一系列属性

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值