Struts2入门:简述及基本配置

发布于 2020-04-10  192 热度


Struts2的概述

什么是Struts2

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

常见的WEB层框架

  • Struts2
  • Struts1
  • Webwork
  • SpringMVC

Web层框架基于前端控制器模型设计

传统方式:

graph LR;
A[浏览器]--HTTP请求-->E[Servlet]-->C[处理数据]
B[浏览器]--HTTP请求-->F[Servlet]-->D[处理数据]

前端控制器模型:

graph LR;
A[浏览器]--HTTP请求-->前端控制器--分发-->C[Action]
前端控制器--执行-->F((过滤器))-->前端控制器
B[浏览器]--HTTP请求-->前端控制器--分发-->D[Action]

Struts2入门

下载包

http://struts.apache.org/

解压包

解压后有以下目录文件:
* apps:Struts2提供的应用,war文件:web项目打成war包。直接放入到tomcat可以允许。
* docs:Struts2的开发文档和API
* lib:Strtus2框架的开发的jar包
* src:Struts2的源码

创建web项目,引入jar包

引入jar包,struts-blank项目下找jar包并加入到web项目。

创建JSP页面

demo1.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
        <h1>Struts2的入门</h1>
        <h3><a href="${ pageContext.request.contextPath }/hello.action">去HelloAction</a></h3>
    </body>
</html>

success.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
        <h1>跳转成功页面!!!</h1>
    </body>
</html>

编写Action类

package com.itheima.struts.demo1;
/**
 * Struts2的入门的Action类
 * @author jt
 */
public class HelloAction {

    /**
     * 提供一个方法:
     *  * 方法签名固定的
     *  共有的 返回值是String类型 方法名execute 在这个方法中不能传递参数。
     */
    public String execute(){
        System.out.println("HelloAction执行了...");
        return "success";//页面跳转,如果为null不跳转
    }
}

配置Action

在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>
    <!-- Struts2为了管理Action的配置,通过package元素管理 -->
    <package name="demo1" extends="struts-default" namespace="/">
    <!-- 配置Action -->
    <action name="hello" class="com.itheima.struts.demo1.HelloAction">
        <!-- 配置页面跳转 -->
        <result name="success">/demo1/success.jsp</result>
    </action>
    </package>
</struts>

配置前端控制器(核心过滤器)

需要在web.xml中配置核心过滤器,将下列代码加入到web-app元素中。

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

访问测试

运行tomcat,访问demo1.jsp,点击看能否执行Action。

Struts2的执行流程

访问hello.action,根据web.xml的配置,会执行Struts2的核心过滤器(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter),打开可以看到核心过滤器执行了组拦截器,拦截器中对数据进行了一系列操作。
所有拦截器执行完毕后会根据struts.xml中的配置执行对应的Action的指定方法,并根据方法返回值和struts.xml中result的配置决定跳转哪个页面。

Struts2的常见配置

配置文件加载顺序

  • default.properties:Struts的常亮配置
  • struts-default.xml
  • struts-plugin.xml
  • struts.xml
  • struts.properties
  • web.xml

注意:后配置的常量的值会覆盖先配置的常量的值。

配置struts.xml

引入约束

Edit XML Catelog Element
Location:选中struts-2.X.dtd
Key type:URI
Key:http:struts.apache.org/dtds/struts-2.X.dtd
OK

Action配置

package配置

package标签称为包,这个包与Java中的包的概念不一致。包为了更好管理action的配置。
package标签的属性:
* name:包的名称,只有在一个项目中不重名即可。
* extends:继承哪个包,通常值为struts-default。
* namespace:名称空间,与\<action>标签中的name属性共同决定访问路径。名称空间有三种写法:
* 带名称的名称空间:namespace="/aaa""
* 跟名称空间:namespance="/"
* 默认名称空间:namespace=""
* abstract:抽象的,用于其他包的继承。

action相关配置

action标签配置Action类。
action标签的属性:
* name:与namespace共同决定访问路径
* class:Action类的全路径
* method:执行Action中的哪个方法的方法名,默认值execute
* converter:用于设置类型转换器

Struts2常量的配置

在Struts2的框架中,提供了非常多的常量:(在default.properties)
* struts.i18n.encoding=UTF-8
Struts2中所有的post请求的中文乱码不用处理。
* struts.action.extension=action
Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。

在Struts2中修改一些常量的值:
修改常量的值,可以有三个位置进行修正:
1. struts.xml中进行修改(推荐)

<constant name="struts.action.extension" value="action"/>
  1. struts.properties中进行修改
struts.action.extension=action
  1. web.xml中修改
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <!-- 修改常量 -->
    <init-param>
        <param-name>struts.action.extension</param-name>
        <param-value>action</param-value>
    </init-param>
</filter>

分模块开发

可以在struts.xml中引入其他配置文件,实现分模块开发。
struts.xml:

<include file="com/itheima/struts/demo1/struts_demo1.xml"/>

struts_demo1.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>
    <!-- Struts2为了管理Action的配置,通过包进行管理。 -->
    <!-- 配置Struts2的包 ================ -->
    <package name="demo1" extends="struts-default" namespace="/">
        <!-- 配置Action================ -->
        <action name="hello" class="com.itheima.struts.demo1.HelloAction" >
            <!-- 配置页面的跳转=========== -->
            <result name="success">/demo1/success.jsp</result>
        </action>
    </package>
</struts>

Action的访问

Action类的写法

Action类是POJO的类

package com.itheima.struts.demo1;
public class HelloAction {
    public String execute(){
        System.out.println("HelloAction执行了...");
        return "success";
    }
}

Action类实现一个Action的接口

package com.itheima.struts.demo2;
import com.opensymphony.xwork2.Action;
/**
 * Action的编写方式二:实现一个Action的接口
 * * 实现接口的这种方式:提供了五个常量(五个逻辑视图的名称)
 *      * SUCCESS   :成功
 *      * ERROR     :失败
 *      * LOGIN     :登录出错页面跳转
 *      * INPUT     :表单校验的时候出错
 *      * NONE      :不跳转
 */
public class ActionDemo2 implements Action{

    @Override
    public String execute() throws Exception {
        System.out.println("ActionDemo2执行了...");
        return NONE;
    }
}

Action继承ActionSupport类(推荐)

package com.itheima.struts.demo2;
import com.opensymphony.xwork2.ActionSupport;
/**
 * Action的编写方式三:Action类继承ActionSupport类
 * * 推荐使用继承ActionSupport方式
 * * ActionSupport中提供了数据校验、国际化等一系列操作的方法。
 * @author jt
 */
public class ActionDemo3 extends ActionSupport{

    @Override
    public String execute() throws Exception {
        System.out.println("ActionDemo3执行了...");
        return NONE;
    }
}

Action的访问配置

固定method配置

<action name="userFind" class="com.itheima.struts.demo3.UserAction" method="find"></action>
<action name="userUpdate" class="com.itheima.struts.demo3.UserAction" method="update"></action>
<action name="userDelete" class="com.itheima.struts.demo3.UserAction" method="delete"></action>
<action name="userSave" class="com.itheima.struts.demo3.UserAction" method="save"></action>

这样只要是配置的都可以访问了,但是如果方法太多就要写好多,太繁琐。

通配符(推荐)

<action name="product_*" class="com.itheima.struts.demo3.ProductAction" method="{1}"></action>

这样访问product_xxx.action的就能找到ProductAction的xxx方法。
乃至

<action name="*_*" class="com.itheima.struts.demo3.{1}Action" method="{2}"></action>

这样访问Xxx_xxx.action的就能找到XxxAction的xxx方法。

动态方法访问

需要先修改常量开启动态方法访问。

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

Action配置:

<action name="customer" class="com.itheima.struts.demo3.CustomerAction"></action>

这样访问customer!xxx.action就能访问到CustomerAction的xxx方法了。


我一直在开辟我的天空