[Web] MVC模型

来源:互联网 发布:mac玩魔兽世界非常热 编辑:程序博客网 时间:2024/06/08 18:41

模型1

JSP通常通过链接方式进行JPS页面的跳转,工程量一多,或修改一个JSP路径则会导致大量页面中的链接需要修正

模型2

模型2是基于模型-视图-控制器(MVC)模式

实现MVC模式的应用包含模型、视图、控制器3个模块;
控制器 负责接收用户输入、改变模型以及调整视图的显示
同学A要你的作业(用户请求),要先通过你(控制器),你把该作业做完(逻辑处理),把作业给A同学(跳转到视图界面)
视图 负责应用的展示(即展示页面JSP,FLT等)
你做完了作业写到了小纸条(视图)上,交给了用户(服务器对浏览器操作进行响应)
模型(数据模型)
你做作业时用的公式,数值等(即模型,模子是Javabean,数据在数据库中)

文章:Application Programming in Smalltalk-80(TM):How to use Model-View-Controller(MVC)
模型2中,Servlet和Filter都可以充当控制器,SpringMVC和Structs1使用一个Servlet作为控制器,而Structs2则使用一个Filter作为控制器
名词:POJO(Plain Old Java Object)、EJB

模型2工作流程

  1. 每个HTTP请求都发送给控制器,请求中URL标识出对应的action
    action代表了应用可以执行的一个操作,一个提供了action的java对象称为action对象
    一个action类可以支持多个actions或者一个action
    看似简单的操作可以需要多个action。如,向数据库添加一个产品,需要两个action
    1) 显示一个“添加产品”的表单,以便用户能输入产品信息
    2) 将表单信息保存到数据库中
  2. 控制器会解析出URL并调用相应的action,然后将模型对象放到视图可以访问的区域。最后,控制器利用RequestDispatcher跳转到视图

模型2学习例子

3次优化,工程不断优化来学习思想
给出工程文件,这里就不贴代码了,有问题请纠正
链接:http://pan.baidu.com/s/1slhlU13 密码:bd11
链接若失效请留言或邮箱

工程名product_struct2_a

示例应用支持如下两个action:

1) 展示“添加产品”表单,action发送输入表单到浏览器上,其对应的URI应包含字符串product_input
2) 保存产品并返回图16.3所示的完成页面,对应的URI必须包含字符串product_save

项目列表说明:

1)product类,作为product的领域对象
2)一个productForm类,封装了HTML表单的输入项
3)一个ControllerServlet类,本示例应用的控制器
4)一个SaveProductAction类
5)两个JSP页面(ProductForm.jsp和ProductDetail.jsp)作为View
6)一个css文件,定义了两个JSP页面的显示风格
测试:输入URL/product_input

问题

示例中,业务逻辑代码都写在了Servlet控制器中,这个Servlet随着应用复杂度的增加而不断膨胀。为避免此问题,我们应该将业务逻辑代码提取到独立的被称为controller的类中

解耦控制器代码 product_struct2_b

优化

相比于a示例,控制器中分为两个类来处理业务逻辑(InputProductController、SaveProductController)
这个两个控制器都实现了controller接口,接口中只有handlerRequest一个方法;
而原来唯一的ControllerServlet在b示例中功能更加专注,现在作用更像一个dispatcher,而不是controller,因此改名为DispatcherServlet
DispatcherServlet相当于一个页面分流器,根据请求不同,分流到不同的controller中来处理请求

问题

对输入的内容没有校验结果

校验器

优化

例:product_strcut2_c
Web应用执行action时,要进行输入校验;
java社区专门发布了JSR 303 Bean Validation以及JSR 349 Bean Validation1.1版本,将Java输入检验进行标准化;
两种检测方法:编程式、申明式
测试URL:/product_input
与b不同,ProductValidator类用来校验结果,两个JSTL库

问题

数据没存进数据库

后端

应用MVC,可以在Controller类中调用后端业务逻辑;通常,需要若干封装了后端复杂逻辑的Service类
Service类中,可以实例化一个DAO类访问数据库
此次优化未写例子

原创粉丝点击