美文网首页
一、struts2 入门

一、struts2 入门

作者: cqzhangjian | 来源:发表于2017-12-27 12:28 被阅读0次

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

    1.MVC 设计模式

    • MVC 是 Model-View-Control 的简称,即模型-视图-控制器。它是一个存在于web应用中的表现层的模型,它将应用分开,改变应用之间的高度耦合,进行对程序的扩展性以及后期维护成本降低
    • MVC 模式将应用分为模型、视图和控制器三个部分:
    • 视图:数据的展现。 JSP 、 html 、 freemarker、 pdf 、 execl等
      视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并能接收用户的输入数据,但是它并不进行任何实际的业务处理。视图可以向模型查询业务状态,但不能改变模型。视图还能接受模型发出的数据更新事件,从而对用户界面进行同步更新。
    • 模型:应用对象(数据模型、业务模型)。 JAVABEAN( DOMAIN、S ERVCIE 包下面的java 类)
      模型是应用程序的主体部分。 模型代表了业务数据和业务逻辑; 当数据发生改变时,它要负责通知视图部分;一个模型能为多个视图提供数据。由于同一个模型可以被多个视图重用,所以提高了应用的可重用性。
    • 控制器:逻辑处理、控制实体数据在视图上展示、调用模型处理业务请求。 (servlet 、 filter 充当控制器)
      当 Web 用户单击 Web 页面中的提交按钮来发送 HTML 表单时,控制器接收请求并调用相应的模型组件去处理请求,然后调用相应的视图来显示模型返回的数据。
      Mvc模型图:


      图片.png

    2.三层架构

    • 所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即使这三个层放置到一台机器上。 三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过http协议和web服务器建立连接,找到程序中间层与数据库进行交互。
      三层架构的优点:
      优点:

    • 开发人员可以只关注整个结构中的其中某一层;

    • 可以很容易的用新的实现来替换原有层次的实现;

    • 可以降低层与层之间的依赖;

    • 有利于标准化;

    • 利于各层逻辑的复用。

    缺点:

    • 降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

    • 有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。增加了开发成本。

    3.Struts2 历史

    • 框架的理解:框架其实是一个半成品的程序,业务需求需要程序员去实现,模板性的功能及代码,框架进行了有效的封装,提高了程序员开发的效率,把更多的精力集中到了业务需求的开发上来。
    • Struts2框架在属于表现层的框架(三层架构的表现层)
    • Struts2框架基于MVC的设计模式实现
    • Struts1与Struts2的关系:严格上来讲,Struts2不是Struts1的升级版,Struts2=Struts1+webwork的结合体,吸取两个框架的有点而形成

    早期现有struts1,struts1和struts2都是apache的产品,struts1在2003年左右比较火.在当时,表现层框架有很多:webwork框架。

    • Struts1 vs webwork 区别:

    Struts1比较出名因为后台是apache,webwork不是很出名

    Webwork框架的设计思想比较前卫(AOP),设计思想沿用至今,struts1的耦合性(servlet api)很紧密,入侵性,就导致使用struts1扩展性差

    图片.png

    4.第一个Struts2 小程序

    • 导包:
      asm-5.2.jar
      asm-commons-5.2.jar
      asm-tree-5.2.jar
      commons-fileupload-1.3.3.jar
      commons-io-2.5.jar
      commons-lang3-3.6.jar
      freemarker-2.3.26-incubating.jar
      javassist-3.20.0-GA.jar
      jsp-api.jar
      log4j-api-2.9.1.jar
      log4j-core-2.9.1.jar
      ognl-3.1.15.jar
      servlet-api.jar
      struts2-core-2.5.14.1.jar
      struts2-core-2.5.14.1.jar
    • 配置 web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://java.sun.com/xml/ns/javaee"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
       id="WebApp_ID" version="3.0">
       
       
       <!-- 配置一个 过滤器:该过滤器是 struts2 提供的 过滤器 :StrutsPrepareAndExecuteFilter (前端控制器、中央控制器)
            在 玩 struts2 的使用认识两种控制器 : StrutsPrepareAndExecuteFilter
                              控制器(页面(逻辑)控制器): 自定义的 
       -->
       <filter>
           <filter-name>struts2</filter-name>
           <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
       </filter>
       <filter-mapping>
           <filter-name>struts2</filter-name>
           <url-pattern>*.action</url-pattern>
       </filter-mapping>
       
    </web-app>
    
    • 创建 struts.xml 配置文件,该文件名称不能变,放置的路径一定在是class 路径的顶端
      • 配置的没有提示的问题,解决如下,


        图片.png
        图片.png
        图片.png
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
            "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
        <package name="p1" extends="struts-default" namespace="/hello">
            <action name="struts2" class="com.xingxue.xingxue.web.controller.HelloController">
                <result name="ok">
                    /ok.jsp
                </result>
            </action>
        </package>
    </struts>
    
    • 编写了一个 页面控制器 Controller
    package com.xingxue.xingxue.web.controller;
    
    public class HelloController {
    
        public String execute() {
            System.out.println("execute 方法执行了...");
            return "ok";
        }
    
    }
    
    

    5.Struts2 执行流程

    • 简易图


      图片.png
    • 官方图:


      图片.png

    6.Action 动作类创建三种方式

    • 第一种方式
    public class HelloController {
    
    • 第二种方式: 实现Action 接口
      提供了一个 execute 方法
      提供了4个常量:
    /**
         * The action execution was successful. Show result
         * view to the end user.
         */
        public static final String SUCCESS = "success";
    
        /**
         * The action execution was successful but do not
         * show a view. This is useful for actions that are
         * handling the view in another fashion like redirect.
         */
        public static final String NONE = "none";
    
        /**
         * The action execution was a failure.
         * Show an error view, possibly asking the
         * user to retry entering data.
         */
        public static final String ERROR = "error";
    
        /**
         * <p>
         * The action execution require more input
         * in order to succeed.
         * This result is typically used if a form
         * handling action has been executed so as
         * to provide defaults for a form. The
         * form associated with the handler should be
         * shown to the end user.
         * </p>
         *
         * <p>
         * This result is also used if the given input
         * params are invalid, meaning the user
         * should try providing input again.
         * </p>
         */
        public static final String INPUT = "input";
    
        /**
         * The action could not execute, since the
         * user most was not logged in. The login view
         * should be shown.
         */
        public static final String LOGIN = "login";
    
    public class HelloController2 implements Action {
    
        @Override
        public String execute() throws Exception {
            return null;
        }
    
    • 第三方式: 继承ActionSupport ,可以使用 Struts2 提供的 国际化功能以及 数据校验功能
    public class HelloController3 extends ActionSupport {
    
    }
    

    7.接收请求数据

    • 模型不分离:直接在 动作类的成员位置定义变量来接收
    public class RequestController {
        // 动作类的方法:1,修饰符是 public 2.动作方法没有形参,3.方法的返回值有 String 或者 void
    
        public String name;
        public String password;
    
    
    • 模型分离 封装数据从动作类封装变为用模型来封装
    public class RequestController {
        // 动作类的方法:1,修饰符是 public 2.动作方法没有形参,3.方法的返回值有 String 或者 void
    
        // public String name;
        // public String password;
    
        // 定义接收参数的模型
        public UserModel model = new UserModel();
    
    <a href="${pageContext.request.contextPath }/p1/req2.action?model.name=lisi&model.password=123">a标签提交请求参数</a>
    

    8.动态视图数据处理

    处理的数据带到页面的操作

    • servlet api 紧耦合版
      ServletActionContext:
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        ServletContext servletContext = ServletActionContext.getServletContext();
    
    • 松耦合版 (推荐使用)
      ServletActionContext:
        ActionContext context = ActionContext.getContext();
            // 请求域中放数据
        context.put("", "");
        Map<String, Object> session = context.getSession();
        Map<String, Object> application = context.getApplication();
    

    相关文章

      网友评论

          本文标题:一、struts2 入门

          本文链接:https://www.haomeiwen.com/subject/awfugxtx.html