Strusts入门XML配置-action编写

入门操作

创建Web项目

引入jar包

一、将Strusts2文件夹中apps目录下的struts2-blank.war文件复制到tomcat文件夹中的webapps目录下
复制文件
二、运行tomcat,struts2-blank.war文件自动解压
在这里插入图片描述
在这里插入图片描述
三、解压后,进入“apache-tomcat-8.5.30\webapps\struts2-blank\WEB-INF\lib”文件目录下的jar包就是我们需要的。
在这里插入图片描述

编写Action类

/**
 * Strusts入门的Action类 可以不用继承任何类或实现任何接口
 * @autho ban
 * @date 2019/4/13 10:34
 */
public class HelloAction {
    /*
    * 提供返回类型为String的公有无参方法
    * */
    public  String execute(){
        System.out.println("HelloAction");
        return null;
    }
}

对Action进行配置

在src下创建(提供)一个名称为struts.xml的配置文件,注意这个名称是固定的,区分大小写。

  • 在“apache-tomcat-8.5.30\webapps\struts2-blank\WEB-INF\classes”目录下有一个struts.xml配置文件,可以拿过来进行修改使用
    在这里插入图片描述
    删除struts标签中的内容,再配置Struts2的包
<?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>
<!-- name:包名可以随便写不过一个配置当中不能重复-->
    <package name="demo" extends="struts-default" namespace="/">
        <!-- 配置Action name要与访问的路径一致,class就是action类的全路径 -->
        <action name="hello" class="net.zjitc.struts.demo.HelloAction"></action>
    </package>
</struts>

< package>标签中的extends的值是继承Strusts2提供的一个东西,
在这里插入图片描述

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

在这里插入图片描述
那怎么配置这个核心过滤器呢?
在web.xml配置文件中直接配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置Strusts2的核心过滤器-->
    <filter>
        <filter-name>strusts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>strusts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

进行页面跳转

一、修改Action中方法的返回值

/**
 * Strusts入门的Action类 可以不用继承任何类或实现任何接口
 * @autho ban
 * @date 2019/4/13 10:34
 */
public class HelloAction {
    /*
    * 提供返回类型为String的公有无参方法
    * */
    public  String execute(){
        System.out.println("HelloAction");
        return “success”;
    }
}

二、修改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>
<!-- name:包名可以随便写不过一个配置当中不能重复-->
    <package name="demo" extends="struts-default" namespace="/">
        <!-- 配置Action name要与访问的路径一致,class就是action类的全路径 -->
        <action name="hello" class="net.zjitc.struts.demo.HelloAction">
            <result name="success">目标页面路径</result>
        </action>
    </package>
</struts>

Strusts2执行的流程

在这里插入图片描述用户访问某个Action时,首先经过核心过滤器,在核心过滤器中执行一组拦截器(实现部分功能),执行目标Action,根据Class的返回值,来进行页面跳转。

strusts2的相关配置介绍

strusts2.xml

package标签

属性名作用
name包的名称,在一个项目中不能重名
extends继承哪个包 ,一般情况下为“struts-default”
namespace名称空间,与< action>标签的name属性来决定访问路径
abstract用于其他包的继承

action标签

属性名作用
name与< package>标签的namespace属性决定访问路径
class需要执行的Class的全路径
method执行action中的哪个方法名,默认值为“execute”
converter自定义类型转换

strusts2的常量配置

strusts2的常量配置在jar包下的org.apache.strusts下的default.properties中

常量作用
struts.i18n.encoding=UTF-8strusts2中所有的post请求的中文乱码不用处理
struts.action.extension=action,,strusts2请求的默认扩展名为“.action"或不写

修改常量配置文件default.properties

  • strusts.xml中进行修改(推荐使用)
    使用< constan>标签,规定:对于default.properties的修改要放在最上面
    在这里插入图片描述
  • strusts.properties" 中进行修改
  • web.xml中进行修改
    使用filter标签下的< init-param>标签在这里插入图片描述
    注意:如果使用了多个方法进行,那么要考虑它们的优先级。

< include> 标签的使用(团队开发使用)

< include>标签的作用是引用外部的struts的配置,类似于外部链接的css样式或js,在团队开发中,每个人有自己的开发的模块,那么到最后的整合中,就可以使用< include>标签完成strusts.xml的整合,
例如:张三负责了资产借还模块的开发,他有一个资产借还的strusts_assetsBorrowing.xml配置文件,李四负责资产类别模块的开发,他有一个资产类别的strusts_assetClass.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>
	<include file="net/zjitc/assetsBorrowing/struts_assetsBorrowing.xml"></include>
	<include file="net/zjitc/assetClass/strusts_assetClass.xml"></include>
</struts>

Action类的访问

Action的编写

  • POJO类
    POJO类就是一个简单的类,没有实现任何接口,也没有继承任何类,前面我们使用的Action类(HelloAction)就是一个POJO类。
  • 实现一个Action的接口

implements Action , 实现接口后有一个默认的方法

import com.opensymphony.xwork2.Action;
/**
 * @version 1.0
 * @autho ban
 * @date 2019/4/13 10:34
 */
public class HelloAction implements Action {

    @Override
    public String execute() throws Exception {
        System.out.println("实现接口类的Action执行了...");
        return null;
    }
}

这种方式,提供了五个常量(逻辑视图的名称)

常量名作用
SUCCESS成功
ERROR失败
LOGIN登录错误页面跳转
INPUT表单检验是出错,或类型转换出错,这个的值是不允许修改的
NONE不跳转
  • 继承ActionSupport类(推荐使用)
import com.opensymphony.xwork2.ActionSupport;
/**
*ActionSupport中提供了数据校验,国际化等一系列操作的方法
 * @version 1.0
 * @autho ban	
 * @date 2019/4/13 10:34
 */
public class HelloAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("继承ActionSupport类的Action执行了...");
        return NONE;
    }
}

通过method来进行Action的访问

<?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>
<!-- name:包名可以随便写不过一个配置当中不能重复-->
    <package name="demo" extends="struts-default" namespace="/">
        <!-- 配置Action name要与访问的路径一致,class就是action类的全路径 -->
        <action name="studentFind" class="net.zjitc.struts.demo.HelloAction" method="find"></action>
        <action name="studentDelete" class="net.zjitc.struts.demo.HelloAction" method="delete"></action>
    </package>
</struts>

但这种方法,还是比较麻烦,因为我们每访问一个不同的方法就需要写一条< action>的配置

通过通配符来进行Action访问(常用)

jsp的body代码如下

<body>
     <a href="${pageContext.request.contextPath}/student_find.action">查找学生</a>
      <a href="${pageContext.request.contextPath}/student_delete.action">删除学生</a>
  </body>

比较简单的写法

<?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="demo" extends="struts-default" namespace="/">
        <action name="student_*" class="net.zjitc.struts.demo.StudentAction" method="{1}"></action>
</action>
    </package>
</struts>

action中的{1}则是获取到action的name属性中第一个"“的值,而这个”“是一个通配符,表示任意个任意字符,例如点击了<a href="${pageContext.request.contextPath}/student_find.action">查找学生</a>这个链接,那么访问的是"student_find"的action那么的值就是”find",如此一来就会执行StudentAction类中的find()方法。
更抽象的写法
<action name="*_*" class="包的路径.{1}" method="{2}"></action>
{1}是name值中的第一个"
",获取到的是具体的类名,{2}则是name值中的第二个"",获取到的是具体的方法名,这种写法的一个前提是要action的名称(即name)要和访问的action名称一致,且两个之间要有分割符

通过动态方法进行Action的访问

strusts.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="demo" extends="struts-default" namespace="/">
        <action name="student" class="net.zjitc.struts.demo.StudentAction" method="{1}"></action>
</action>
    </package>
</struts>

打开动态方法访问在这里插入图片描述
首先我们找到default.properties文件中的struts.enable.DynamicMethodInvocation常量,可以看到默认值是false,这代表着动态方法访问是关闭的,想要是用这种方法就必须打开动态方法访问,那么我们就可以将该常量值设置为true

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

编写访问路径

<body>
     <a href="${pageContext.request.contextPath}/student!find.action">查找学生</a>
      <a href="${pageContext.request.contextPath}/student!delete.action">删除学生</a>
  </body>

访问路径个格式是固定的,首先要写action的name,其次必须写一个"!"符号,之后写的是方法名,例如<a href="${pageContext.request.contextPath}/student!find.action">查找学生</a>中的“student!find.action”,"student"是action的name,"find"是方法名


版权声明:本文为weixin_43273271原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。