Fork me on GitHub

Struts 2.0 入门

1. Struts2.0 概述

  • Struts 2.0 是以 WebWork 为核心,采用拦截器的机制来处理用户的请求;
  • Struts 2.0 是一个基于 MVC 设计模式的 Web 层框架;
  • Struts 2.0 本质上相当于一个 servlet;

1.1 Web 层框架的特点

  • 前端控制器模式;
  • Struts 2.0 框架的前端控制器就是过滤器;
  • 配置 Struts 2.0 的环境,必须在 web.xml 中配置核心的过滤器;

2. Struts 环境搭建

2.1 配置 Struts2 的前端控制器

  • Struts2 的前端控制器就是一个过滤器,需要在 web.xml 中配置;
  • 前端控制器的类路径和名称:
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
// web.xml
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2.2 编写 Action 类

  1. Action 类是动作类,是 Struts2 处理请求,封装数据,响应页面的核心控制器;
    • 一般以 "xxxAction" 方式命名 action类
    • 该类中的方法必须是 public 类型;
    • 该类中的方法必须有 String 类型的返回值;
    • 方法名称是任意的,但是不能有参数;
  2. 页面跳转
    • return "要跳转的页面(字符串)";
    • 需要 src 目录下的 struts.xml 中配置跳转的页面;
    • 路径写法: 在 struts2 框架中,不管是转发还是重定向,都不用写项目名;

2.3 编写 struts 的配置文件

  • 配置文件的名称必须是 struts.xml;
  • 配置文件的路径必须是在 src 目录下;
// action 类
    public class HelloAction{

        public String sayHello(){
            System.out.println(".........");

            // 跳转页面
            return "ok";
        }
    }

//  src/struts.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
	   "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	   "http://struts.apache.org/dtds/struts-2.3.dtd">

    <struts>
        <package name="default" namespace="/" extends="struts-default">
            // 配置 action
            <action name="hello" class="com.itheima.action.HelloAction" method="sayHello">
                // 配置跳转的页面
                // 在 struts2 框架中,不管是转发还是重定向,都不用写项目名;
                <result name="ok">/demo/suc.jsp</result>
            </action>
        </package>
    </struts>

3. Struts2 框架的配置文件

3.1 配置文件加载顺序

  1. Struts2 框架的核心是 StrutsPrepareAndExecuteFilter 过滤器,该过滤器有两个功能:
    • Prepare: 预处理,加载核心的配置文件;
    • Execute: 执行,让部分拦截器执行;
  2. StrutsPrepareAndExecuteFilter 过滤器会加载哪些配置文件?
    • init_DefaultProperties(): 加载 org/apache/struts2/default.properties;
    • init_TraditionalXmlConfigurations():
               加载 struts-default.xml, struts-plugin.xml, struts.xml;
    • init_LegacyStrutsProperties(): 加载自定义的 struts.properties;
    • init_CustomConfigurationProviders(): 加载用户自定义配置提供者
    • init_FilterInitParameters(): 加载 web.xml;
  3. 重点了解的配置文件
    • default.properties: 配置的是 struts2 中的常量值, 例如编码等;
    • struts-default.xml: 配置的是 struts2 的核心功能,例如 Bean, 拦截器和结果类型等;
    • struts.xml: 配置的是 web应用中的内容,在工作中,基本就配置它; 也可以配置常量;
    • web.xml: 配置前端控制器,可以配置常量;
    • 开发中,基本都在 struts.xml 中配置常量;

3.2 struts.xml 配置文件的配置

3.2.1 <package> 标签包含的属性
  • name: 包的名称,要求是唯一的,用来管理 action;
  • extends: 继承,一般都是继承 struts-default; 也可以继承其他的包;
  • namespace: 名称空间, 一般与 <action> 标签中的 name 属性共同决定了访问路径;
  • abstract: 抽象的,这个属性很少被使用,值如果为 true,表示该包是用来被继承的;
3.2.2 <action> 标签包含的属性
  • name: 和 <package> 标签的 namespace 属性一起来决定访问路径;
  • class: 配置 Action 类的全路径(默认值是 ActionSupport 类);
  • method: Action 类中执行的方法, 如果不指定, 默认值是 execute;
3.2.3 <result> 标签包含的属性
  • name: 结果页面逻辑视图名称;
  • type: 结果类型(默认值是转发);

3.3 struts2 配置常量

3.3.1 哪些配置文件中可以配置常量
  • web.xml: 在 StrutsPrepareAndExecuteFilter 配置文件中配置初始化参数;
  • struts.xml: <constant name="常量名" value="常量值"></constant>
3.3.2 常用的常量
  • struts.i18n.encoding=UTF-8: 指定默认编码集;
  • struts.action.extension=action,,: 指定需要 struts2 处理的请求后缀, 默认值是 action
    即所有匹配 *.action 请求,都由 struts2 处理;
  • struts.serve.static.browserCache=true: 设置浏览器是否支持缓存静态内容, 默认值是 true;
    开发阶段最好关闭; 生产环境下使用;
  • struts.configration.xml.reload=false: 当 struts 的配置文件修改后,系统是否自动重新加载该文件;
    默认值是 false;
  • struts.devMode=false: 开发阶段使用,这样可以打印出更详细的错误信息;

3.4 指定多个 struts 的配置文件

  • 为了避免 struts.xml 文件过于庞大,提高 struts.xml 文件的可读性,可以将一个 struts.xml 配置文件
    分解成多个配置文件, 然后在 struts.xml 文件中包含其他配置文件;
// struts.xml
    <struts>
        <include file="cn/itheima/domain/struts_user.xml"/>
    </struts>

4. Action 类

4.1 Action 类的三种写法

  1. Action 类是一个 POJO 类. POJO(Plain Ordinary Java Object),没有继承某个类,没有实现接口,就是 POJO 类.
  2. Action 类可以实现 Action 接口
    • Action 接口中定义了 5 个常量的值,对应的是 5 个逻辑视图跳转页面, 还定义了一个 execute 方法;
    • 5个逻辑视图常量:
      • SUCCESS : 成功;
      • INPUT :用于数据表单校验,如果校验失败,跳转 INPUT 视图;
      • LOGIN :登录;
      • ERROR : 错误;
      • NONE : 页面不跳转;
  3. Action 类可以去继承 ActionSupport 类(开发中使用最多);

4.2 Action 类中方法的访问

4.2.1 第一种方式
  • 通过 <action> 标签中的 method 属性,访问的 Action 中的具体方法;
// 页面代码
    <a href="${pageContext.request.contextPath}/addBook.action">添加图书</a>
    <a href="${pageContext.request.contextPath}/deleteBook.action">删除图书</a>

// 配置文件的代码
    <package name="demo2" extends="struts-default" namespace="/">
        <action name="addBook" class="cn.itcast.demo2.BookAction" method="add"></action>
        <action name="deleteBook" class="cn.itcast.demo2.BookAction" method="delete"></action>
    </package>

// Action 类的代码
    public class BookAction extends ActionSupport{
            public String add(){
                System.out.println("添加图书");
                return NONE;
            }
            public String delete(){
                System.out.println("删除图书");
                return NONE;
            }
    }
4.2.2 第二种方式
  • 通配符的访问方式: 访问的路径和方法的名称必须要有某种联系;
  • 可以简化配置文件的代码编写,而且扩展和维护比较容易
// 页面代码
    <a href="${pageContext.request.contextPath}/order_add.action">添加订单</a>
    <a href="${pageContext.request.contextPath}/order_delete.action">删除订单</a>

// 配置文件代码
    <package name="demo3" extends="struts-default" namespace="/">

        // 通配符的方式, 数字 1, 代表第一个星号
        <action name="order_*" class="cn.itcast.demo2.OrderAction" method="{1}">
            <result name="saveOK">xxxx</result>
            <result name="delOK">xxxx</result>
        </action>
    </package>

// Action 类的代码
    public class OrderAction extends ActionSupport{
        public String add(){
            System.out.println("添加订单");
            return saveOK;
        }
        public String delete(){
            System.out.println("删除订单");
            return delOK;
        }
    }
4.2.3 第三种方式
  • 动态方法访问的方式, 需要开启一个常量 struts.enable.DynamicMethodInvocation=true;
  • 在 struts.xml 中设置该常量
    • <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
// 页面代码
    <a href="${pageContext.request.contextPath}/product!add.action">添加商品</a>
    <a href="${pageContext.request.contextPath}/product!delete.action">删除商品</a>

// 配置文件代码 struts.xml
    <action name="product" class="cn.itcast.demo2.ProductAction"></action>

// Action 类的代码
    public class ProductAction extends ActionSupport{
        public String add(){
            System.out.println("添加订单");
            return NONE;
        }
        public String delete(){
            System.out.println("删除订单");
            return NONE;
        }
}

参考资料

posted @ 2017-10-21 22:05  小a的软件思考  阅读(208)  评论(0编辑  收藏  举报