zoukankan      html  css  js  c++  java
  • 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动作类:

     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控制器类

    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,将学习的过程记录下来,如有错误,望大家指出。

  • 相关阅读:
    2019年9月25日星期三(STM32 ucos3)
    2019年9月23日星期一(STM32 spi接口 rc522)
    2019年9月21日星期六(STM32 spi接口flash)
    2019年9月20日星期五(STM32 flash)
    2019年9月19日星期四(STM32 rtc实时时钟 i2c协议)
    2019年9月18日星期三(STM32 adc转换)
    2019年9月17日星期二(STM32 串口 看门狗)
    2019年9月16日星期一(STM32 串口 超声波 单总线通讯)
    2019年9月12日星期四(STM32 pwm 串口 )
    Win7/8/8.1系统中针对SSD需要禁用和改动的服务(转)
  • 原文地址:https://www.cnblogs.com/jdluojing/p/3212458.html
Copyright © 2011-2022 走看看