JAVAEE我爱编程

JAVAEE框架学习——Struts2——介绍、搭建、配置

2018-05-23  本文已影响54人  So_ProbuING

Struts2介绍

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

Struts2优势

WEB层框架基于的前端控制器模式

在传统的开发中,有一次请求就会对应一个Servlet。这样会导致出现很多的Servlet。而Struts2将所有请求都先经过一个前端控制器,在前端控制器中实现框架的部分功能。具体的操作交到具体的Action中。


传统开发方式 前端控制器模型

快速入门

下载Struts2开发包

解压开发包

创建一个web工程引入相应jar包

可以参考apps下的一些示例代码,其中struts2-blank.war是struts2的空工程,我们可以查看它的lib目录


基本开发包

这些就是基本的开发包了,具体含义如下:


基本开发包解释

创建一个页面:放置一个链接

首先需要在WebContent下创建一个目录demo1,在demo1下创建一个新的jsp 在jsp中编写

创建Action

/**
 * @Auther: wxblack-mac
 * @Date: 2018/5/23 16:49
 * @Description: Struts2 Action类
 */
public class HelloAction {
    
    public String hello() {
        System.out.println("hello world");
        return "success";
    }
}

编写配置文件 struts.xml

引入dtd约束文件

<?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>

</struts>

将struts2配置到web.xml中

由于Struts2是基于filter,所以需要配置Struts2的核心过滤器

  <!--配置Struts2核心过滤器-->
    <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>

Struts2框架架构演示

访问过程
架构图.png
AOP思想

核心配置详解

Struts2 核心配置 Struts.xml

<struts>
    <!--
        package:将Action配置封装,可以在Package中配置很多action
        name属性:给包起个名字,起到标识作用,不能与其他包名重复
        namespace属性:给action定义一个访问前缀,指定一个命名空间
        extends属性:继承一个指定包,struts2默认提供一个struts-default用于继承,必须继承
        由于struts2的配置文件是从上到下处理的,所以父包应该在子包前面定义
        abstrac属性:包是否为抽象的;标识性属性。抽象包意味着该包不能包含Action定义
    -->
    <package name="hello" namespace="/hello" extends="struts-default">
        <!--
        action:配置Action类
               name属性:决定了action访问的资源名 指定该Action所处理的请求的URL
               class属性:指定action资源完整类名
               method:指定具体调用action的哪个方法
        -->
        <action name="HelloAction" class="cn.probuing.struts2lesson.action.HelloAction"
                method="hello">
            <!--
                result:结果配置
                        name属性:标识结果处理的名称与action方法的返回值对应
                        type属性:指定调用哪一个Result类来处理结果 默认使用转发处理结果
                        标签体:填写处理页面的相对路径
            -->
            <result name="success">/hello.jsp</result>
        </action>
    </package>
</struts>

Struts2常量配置

Struts默认常量配置位置

默认常量配置

修改Struts2常量配置

第一种 在struts.xml文件中使用<constant> 标签 开发中常用

struts.xml

第二种 在src下创建strtus.properties文件

struts.properties
struts.properties

第三种 在项目的web.xml中

web.xml
以上的顺序 也是配置文件的加载顺序 后加载的会覆盖先加载的

常量配置

基本常量配置

<!--常量配置-->
    <!--
        国际化常量配置 可以解决POST提交乱码
    -->
    <constant name="struts.i18n.encoding" value="utf-8"/>
    <!--
    指定访问action时的后缀名,两个逗号表示分割后缀名 两个逗号间为空 表示可以不加后缀
    -->
    <constant name="struts.action.extension" value=",,"/>

    <!--
        开发模式
        提供热加载主配置
        提供更多的错误信息输出,方便开发的时候调试
    -->
    <constant name="struts.devMode" value="true"/>

配置进阶

Struts2动态方法调用

动态方法调用指的是:
我们在配置struts.xml需要配置method属性 代表调用的方法,如果调用的方法过多则会出现复杂且冗余的method配置,这样显然是不合理的。Struts2提供了动态的方法调用,可以让我们在调用方法时 指定方法的名称 调用对应的方法。这样可以大大简化我们的配置

方式一:
  <!--配置动态方法调用常量 false: 关闭 true 开启 默认关闭-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
  <package name="dynamic" namespace="/dynamic" extends="struts-default">
        <action name="Demo1Action" class="cn.probuing.strutsLesson.dynamic.Demo1Action">
            <result name="success">/hello.jsp</result>
        </action>
    </package>
http://localhost:8080/ss/dynamic/Demo1Action!add
> 表示调用Demo1Action中的add方法

这种方式有一个弊端:由于地址路径的特殊,对SEO优化不友好

方式二:
<package name="dynamic" namespace="/dynamic" extends="struts-default">
        <!--
            指定name 为 xxx_*时 在前缀匹配到的时候 *代表任何字符
            Struts2会将*号的值记录下来 填充到{1}中
        -->
        <action name="Demo1Action_*" class="cn.probuing.strutsLesson.dynamic.Demo1Action" method="{1}">
            <result name="success">/hello.jsp</result>
        </action>
    </package>

http://localhost:8080/ss/dynamic/Demo1Action_find 这个地址中 *代表"find" 相当于配置了 method="find"

使用PreResultListener

PreResultListener是一个监听器接口,可以在Action完成控制处理之后,系统转入实际的物理视图之间被回调
Struts2应用可由Action、拦截器添加PreResultListener监听器,添加PreResultListener监听器通过ActionInvocation的addPreResultListener()方法完成。一旦为Action添加了PreResultListener监听器,该监听器就可以在应用转入实际物理视图之前回调该监听器的beforeResult()方法

ActionInvocation invocation = ActionContext.getContext().getActionInvocation();
invocation.addPreResult(ActionInvocation invocation,String resultCode)
{
  .....处理逻辑
  invocation.getInvocationContext().put("extra",new Date());
}

Struts2默认配置

Struts2的很多配置都有默认值,在不配置的时候就以默认值来指定

 <!--
            默认值:
                method属性:默认值 execute 如果配置文件中没有找到method会去对应的类中找execute方法
                class属性:com.opensymphony.xwork2.ActionSupport 
        -->
        <!--
            如果找不到命名空间下的action会使用默认的action处理 也就是DefaultDemo处理请求
        -->
        <default-action-ref name="DefaultDemo"></default-action-ref>
        <action name="DefaultDemo" class="cn.probuing.strutsLesson.defaultconf.DefaultDemo">
            <!--
                result的name属性:success
                result的Type属性:dispatcher 转发
            -->
            <result name="success">/hello.jsp
            </result>
        </action>

配置默认Action

当用户请求找不到对应的Action时,系统默认的Action即将处理用户请求
配置默认Action通过<default-action-ref.../>元素完成

<package name = "lee" extends="struts-default">
      <default-action-ref name="simpleViewResultAction"/>
      <!--通过action元素配置默认的Action-->
      <action name="simpleViewResultAction" class="........">
          <result..../>
       </action>

配置默认Action使用<default-action-ref.../>元素即可,配置该元素时需要制定一个name属性,该name属性指向容器中另一个有效的Action,该Action将成为容器中默认的Action

配置Action默认处理类

在配置<action.../>元素时可以不指定class属性,如果没有指定class属性则系统默认使用ActionSupport作为Action处理类

自定义Action默认处理类

配置默认Action处理类使用<default-class-ref.../>元素,配置该元素时只需要指定一个class属性,该属性指定的类就是Action的默认处理类

action类的详解

action的创建方式

方式一:直接创建一个类,可以是POJO(不用继承任何父类 也不需要实现任何接口)

这种方式并不好,使得Struts2框架的代码浸入性更低

方式二:实现一个接口Action

/**
 * Action的详解
 * @author wx-blackmac
 * @create 2018-05-23 22:34
 * bestwishes for you
 * good luck!
 * Action接口预置了一些字符串
 * SUCCESS
 * NONE
 * 
 **/
public class Demo3Action implements Action {

    /**
     * execute是提示Action方法规范
     * @return
     * @throws Exception
     */
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}

方式三:继承ActionSupport

ActionSupport帮我们实现了 Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable 这些接口 当我们使用这些接口时,不需要自己实现

/**
 * Action的详解
 * @author wx-blackmac
 * @create 2018-05-23 22:34
 * bestwishes for you
 * good luck!
 *
 **/
public class Demo3Action extends ActionSupport {

}

因为ActionSupport完全符合一个Action的要求,所以也可直接使用ActionSupport作为业务控制器,如果配置Action没有指定class属性(没有用户提供Action类),系统自动使用ActionSupport类作为Action处理类

配置异常处理

Struts2的异常处理我们一般希望如果出现异常1的时候系统转入视图资源1,如果出现异常2系统转入视图资源2。我们可以采用如下的方式

public class XxxAction
{
  public String execute(){
    try{
        ....
    }catch(异常1 e){
    return 结果1;
  }catch(异常2 e){
    return 结果2;
}

  }
}

但是,这样的方式会出现大量的try-catch块,完全手动处理异常,非常烦琐。
我们可以声明execute()抛出全部异常,将异常直接抛给Struts2框架。Struts2框架接收到Action抛出的异常之后,根据struts.xml配置异常映射。转入指定的视图

<interceptors>
  <!--执行异常处理的拦截器-->
<interceptor name="exception" class="自定义异常处理类"/>
<!--struts2默认的拦截器栈-->
<interceptor-stack name="defaultStack">
<!--引用异常映射拦截器-->
<interceptor-ref name="exception"/>
</interceptor-stack>
</interceptors>

声明式异常捕捉

Struts2的异常处理机制是通过在struts.xml文件中配置<exception-mapping.../>元素完成的。

异常映射分类

如果局部异常映射和全局异常映射配置了同一个异常类型,在该Action内部局部异常映射会覆盖全局异常映射

上一篇 下一篇

猜你喜欢

热点阅读