在学习struts2之前首先了解一下MVC模式。

 MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。分层概念

模型(Model)

用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。

视图(View)

视图是用户看到并与之交互的界面,能够显示模型中传递的数据。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。

控制器(Controller)

控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

MVC的组件关系图


交互顺序

(1)首先是展示视图给用户,用户在这个视图上进行操作,并填写一些业务数据

(2)然后用户会点击提交按钮,来发出请求

(3)视图发出的用户请求会到达控制器,在请求中包含了想要完成什么样的业务功能以及相关的数据。

(4)控制器会来处理用户请求,会把请求中的数据进行封装,然后选择并调用合适的模型,请求模型进行状态更新,然后选择接下来要展示给用户的视图。

(5)模型会去处理用户请求的业务功能,同时进行模型状态的维护和更新

(6)当模型状态发生改变的时候,模型会通知相应的视图,告诉视图它的状态发生了改变。

(7)视图接到模型的通知后,会向模型进行状态查询,获取需要展示的数据,然后按照视图本身的展示方式,把这些数据展示出来。

下面动手做一个练习,完成填写用户信息并显示:

使用Servlet中的Filter来充当控制器,他能够拦截用户的请求,通过他来分发这些请求到对应的Model和View。

User动作类:

public class User { private String userName; private String email; private String age; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public void save(){ System.out.println("保存实体"); } }

FilterDispatcher控制器类

import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FilterDispatcher implements Filter { public void init(FilterConfig filterconfig) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletrequest; HttpServletResponse resp = (HttpServletResponse) servletresponse; String uri = req.getRequestURI(); //目标视图url String forwardUrl = null; if (uri.endsWith(".action")) { int lastIndex = uri.lastIndexOf("/"); String action = uri.substring(lastIndex + 1); if ("input.action".equals(action)) { forwardUrl = "/input.jsp"; } else if ("save.action".equals(action)) {//执行save动作 User user = new User(); user.setUserName(req.getParameter("userName")); user.setEmail(req.getParameter("email")); user.setAge(req.getParameter("age")); user.save(); //用于将User对象传递到视图 req.setAttribute("user", user); forwardUrl = "/detail.jsp"; } if (forwardUrl != null) { RequestDispatcher dispatcher = req .getRequestDispatcher(forwardUrl); //跳转到指定视图 dispatcher.forward(req, resp); } } } }

在FilterDispatcher中的doFilter方法中对请求的资源进行处理:

(1)      如果有必要,对相应的动作类进行实例化。

(2)      如果动作对象存在,用请求参数填充该动作的相关属性

(3)      如果动作对象存在,调用相应的动作方法。在这里User对象上的save方法就是Save动作的动作方法。

(4)      把请求转发给视图。

这里的动作指的是能够应用程序可以完成的一项操作,和动作相关的POJO叫做动作对象。

视图

input.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>input</title> </head> <body> <form action="save.action"> username : <input type="text" name="userName"/><br/> email : <input type="text" name="email"/><br/> age : <input type="text" name="age"/><br/> <input type="submit" value="submit"/> </form> </body> </html>

detail.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Detial</title> </head> <body> username : ${user.userName }<br/> email : ${user.email }<br/> age : ${user.age } </body> </html>

测试:

总结:在这个小程序中,使用Servlet的Filter来充当控制器,来实现请求的转发。有input和save两个动作,input动作的作用仅仅是用于显示视图界面,在执行save动作时,控制器实例化一个动作对象(User对象),并且使用请求中携带的参数来填充动作对象中的属性,然后指定动作方法(save方法)来完成保存操作。程序中与业务逻辑和数据操作相关的部分都属于model层。初学struts2,将学习的过程记录下来,如有错误,望大家指出。

转载于:https://www.cnblogs.com/JPAORM/archive/2012/05/16/2509750.html

struts2学习笔记(一) MVC模式相关推荐

  1. 用ajax做级联操作,学习笔记之MVC级联及Ajax操作

    由于刚转型到MVC,MVC的架构模式很多不是很清楚,比如今天就想做个级联的操作,因为之前的ASP.NET的方式是通过:控件-->添加事件-->后台编写级联事件进行触发,但是这个MVC就不同 ...

  2. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

  3. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  4. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  5. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  6. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  7. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

  8. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  9. 设计模式学习笔记——访问者(Visitor)模式

    设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...

  10. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

最新文章

  1. 为什么老外不愿意用 MyBatis?
  2. 【错误记录】Android Studio 中 build.gradle 配置 buildFeatures prefab 错误处理 ( AS 4.1 以上开发环境 | Gradle及插件版本 )
  3. Ubuntu21.04开机自动挂载Windows硬盘分区
  4. openresty 前端开发入门四之Redis篇
  5. python插入排序_从Python看排序:插入排序
  6. mysql加锁语法_MySql 加锁问题
  7. [有限元] 刚度矩阵每一行的元素之和为零的条件
  8. phantomjs执行常见错误
  9. oracle密文怎么弄成明文,明文编码随机化加密方案
  10. 元气骑士机器人的成就皮肤_元气骑士:5把特殊“红武”,想要机器人的皮肤,用它就对了!...
  11. tomcat下载安装及配置【图文教程】
  12. mac mysql 移动硬盘_MAC上安装Fuse for macOS以支持读取NTFS格式的移动硬盘
  13. macOS更换jupyter notebook默认浏览器
  14. xp系统打开internet服务器,xp系统浏览器无法打开internet选项的解决方案
  15. mac日历与iphone日历不无法同步问题
  16. Redis 6 入门到入坟 详细教程 @学习笔记
  17. 杂谈 跟编程无关的事情10
  18. 团队作业1--团队展示选题
  19. JSP概述和页面技术
  20. 设计低通巴特沃斯数字滤波器(matlab)去除ECG基线漂移实例

热门文章

  1. 关于Ajax load页面中js部分$(function(){})的执行顺序
  2. [原]sencha touch之carousel
  3. 如何让Jython自动加载一个Jar包
  4. 【实习】T100开发学习笔记
  5. 【Python笔记】AttributeError: module 'urllib3' has no attribute 'PoolManager'
  6. CentOS6安装netcat 瑞士军刀【附带下载资源链接】
  7. python进阶07并发之三其他问题
  8. 5mins看懂数据分析师必备的「波士顿模型」
  9. python 配置文件对比_Python3实现配置文件差异对比脚本
  10. blood vessel 图像分割_单图像九宫格形式发送朋友圈