struts2学习笔记(一) MVC模式

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

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

模型(Model)

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

视图(View)

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

控制器(Controller)

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

MVC的组件关系图


交互顺序

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

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

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

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

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

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

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

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

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

 

User动作类:

[java]  view plain copy print ?
  1. public class User {  
  2.   
  3.     private String userName;  
  4.     private String email;  
  5.     private String age;  
  6.   
  7.     public String getUserName() {  
  8.         return userName;  
  9.     }  
  10.   
  11.     public void setUserName(String userName) {  
  12.         this.userName = userName;  
  13.     }  
  14.   
  15.     public String getEmail() {  
  16.         return email;  
  17.     }  
  18.   
  19.     public void setEmail(String email) {  
  20.         this.email = email;  
  21.     }  
  22.   
  23.     public String getAge() {  
  24.         return age;  
  25.     }  
  26.   
  27.     public void setAge(String age) {  
  28.         this.age = age;  
  29.     }  
  30.       
  31.     public void save(){  
  32.         System.out.println("保存实体");  
  33.     }  
  34. }  

FilterDispatcher控制器类

[java]  view plain copy print ?
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.Filter;  
  4. import javax.servlet.FilterChain;  
  5. import javax.servlet.FilterConfig;  
  6. import javax.servlet.RequestDispatcher;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.ServletRequest;  
  9. import javax.servlet.ServletResponse;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. public class FilterDispatcher implements Filter {  
  14.   
  15.     public void init(FilterConfig filterconfig) throws ServletException {  
  16.     }  
  17.   
  18.     public void destroy() {  
  19.     }  
  20.   
  21.     public void doFilter(ServletRequest servletrequest,  
  22.             ServletResponse servletresponse, FilterChain filterchain)  
  23.             throws IOException, ServletException {  
  24.   
  25.         HttpServletRequest req = (HttpServletRequest) servletrequest;  
  26.         HttpServletResponse resp = (HttpServletResponse) servletresponse;  
  27.   
  28.         String uri = req.getRequestURI();  
  29.           
  30.         //目标视图url  
  31.         String forwardUrl = null;  
  32.           
  33.         if (uri.endsWith(".action")) {  
  34.   
  35.             int lastIndex = uri.lastIndexOf("/");  
  36.             String action = uri.substring(lastIndex + 1);  
  37.             if ("input.action".equals(action)) {  
  38.                 forwardUrl = "/input.jsp";  
  39.   
  40.             } else if ("save.action".equals(action)) {//执行save动作  
  41.                   
  42.                 User user = new User();  
  43.                 user.setUserName(req.getParameter("userName"));  
  44.                 user.setEmail(req.getParameter("email"));  
  45.                 user.setAge(req.getParameter("age"));  
  46.   
  47.                 user.save();  
  48.                 //用于将User对象传递到视图  
  49.                 req.setAttribute("user", user);  
  50.   
  51.                 forwardUrl = "/detail.jsp";  
  52.             }  
  53.   
  54.             if (forwardUrl != null) {  
  55.   
  56.                 RequestDispatcher dispatcher = req  
  57.                         .getRequestDispatcher(forwardUrl);  
  58.                 //跳转到指定视图  
  59.                 dispatcher.forward(req, resp);  
  60.             }  
  61.   
  62.         }  
  63.   
  64.     }  
  65. }  

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

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

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

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

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

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

视图

input.jsp

[html]  view plain copy print ?
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2. <html>  
  3.   <head>  
  4.     <title>input</title>  
  5.   </head>  
  6.     
  7.   <body>  
  8.     
  9.   <form action="save.action">  
  10.     username : <input type="text" name="userName"/><br/>  
  11.        email : <input type="text" name="email"/><br/>  
  12.          age : <input type="text" name="age"/><br/>    
  13.          <input type="submit" value="submit"/>  
  14.    </form>  
  15.      
  16.   </body>  
  17. </html>  

detail.jsp

[html]  view plain copy print ?
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2. <html>  
  3.   <head>  
  4.     <title>Detial</title>  
  5.   </head>  
  6.     
  7.   <body>  
  8.     
  9.     username : ${user.userName }<br/>  
  10.        email : ${user.email }<br/>  
  11.          age : ${user.age }  
  12.   </body>  
  13.     
  14. </html>  

测试:

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


转自: http://blog.csdn.net/jdluojing/article/category/1148013

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值