一、struts2 入门

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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容