第一种:使用action标签的method属性(常规方法)

Action类:

package cn.tedu.web;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;import cn.tedu.json.BaseAction;@Controller
@Scope("prototype")
public class BookAction extends BaseAction{//添加public String add(){System.out.println("add.......");return NONE;}//修改public String update(){System.out.println("update.......");return NONE;}
}

struts.xml文件

<!-- Action类中方法的访问(一) -->
<package name="test2" namespace="/" extends="struts-default"><action name="addAction" class="bookAction" method="add"></action><action name="updateAction" class="bookAction" method="update"></action>
</package>

URL

浏览器输入以下两个网址即可:

http://localhost:8000/struts_test/addAction.action

因为没有配置result标签,所以显示空白网页,执行BookAction类中的add方法,可输出add......

http://localhost:8000/struts_test/updateAction.action

因为没有配置result标签,所以显示空白网页,执行BookAction类中的update方法可输出uppdate......

==============================================================================

第二种:使用通配符实现(最实用 最常用)

使用通配符其中的好处就是可以大大减少了配置文件的内容

book_*中的*就是通配符,表示的是可以匹配任意字符,method="{1}"中的{1}就表示的就是*的内容,当然也可以用多个*,比如"*_*", "*_*_*",不过建议不要使用太多的*,这样会降低代码的可读性

Action类不变

struts.xml文件:

<package name="test2" namespace="/" extends="struts-default"><!-- 方法二 --><action name="book_*" class="bookAction" method="{1}"></action>
</package>

在浏览器中输入网址:

http://localhost:8000/struts_test/book_add.action

因为没有配置result标签,所以显示空白网页,执行BookAction类中的add方法,可输出add......

http://localhost:8000/struts_test/book_update.action

localhost:8080/JavaWebProjectName/book_update.action

因为没有配置result标签,所以显示空白网页,执行BookAction类中的update方法可输出uppdate.....

注意:

当请求/book_add.action时,将调用BookAction的add()方法,当请求/book_update.action时,将调用BookAction的update()方法。book前缀与方法名无关,method对应得是占位符从1开始,在提交请求的时候,*是什么,method对应的就是什么,也就是说提交请求的时候,*对应的应该是对应的方法名称

关于通配符匹配的优先权:

(1)如果struts.xml里面有对应的action name ,就算它有其他通配符匹配的,都优先对应完全相同的。
比如 有一个 action name 是 "user_add"  还有一个是 "user_*"。现在,有一个请求是 "user_add.action ",那么它会优先匹配"user_add " 。

(2)如果一个action name对应于两个带通配符的action name 那么,需要看这个配置谁在前面,它匹配写在前面的
比如 有一个 action name 是 "*_*"  还有一个是 "user_*" ,现在,有一个请求是 "user_add.action ",那么它会优先匹配写在前面的那个action

(3)任何带"*"的action name 优先权都是一样的,不是说带一个"*"的优先权就比带两个"*" 的高。

总结:因此我们应该把具有含有最多通配符的Acton配置放在最后,否则Struts2一一匹配所有的Action,这会降低程序的效率。

==============================================================================

第三种:Action中动态方法的调用(Dynamic method Invoc--2.0后的版本不推荐使用)

struts2中无需配置就可以直接调用Action中非execute方法的方式,就是用struts2的动态方法调用。

动态方法调用是在action的名字中使用感叹号(!)来标示要调用的方法名

其语法格式为

actionName!methodname.action

通过URL访问时,action标签中的name属性值 + !+ 方法名

(即:英文的感叹号)这个符号后再加上要调用的这个方法名(注:.action可要可不要)

Action类:

package cn.tedu.web;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;import cn.tedu.json.BaseAction;@Controller
@Scope("prototype")
public class DynamicAction extends BaseAction{public String addUser(){System.out.println("addUser......");return NONE;}public String deleteUser(){System.out.println("deleteUser......");return NONE;}
}

例如我们的struts.xml的配置如下:

<!-- 开启动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="test2" namespace="/" extends="struts-default"><!-- 方法三 动态调用 --><action name="user" class="dynamicAction"></action>
</package>

当请求http://localhost:8000/struts_test/user!addUser.action时,将调用DynamicAction的addUser()方法

当请求http://localhost:8000/struts_test/user!deleteUser.action时,将调用DynamicAction的deleteUser()方法

如果要禁用动态方法调用,则可以在struts.xml配置如下常量<constant name="struts.enable.DynamicMethodInvocation" value="false" />

注意:value的默认值为true

扩展:DynamicMethodInvocation解析

strust2-core jar下的org.apache.struts2包下的StrutsConstants.class里的struts.enable.DynamicMethodInvocation

Struts2中XXX.Action类中方法的访问(三种方式)相关推荐

  1. JavaScript中遍历数组的for for-in和forEach三种方式

    JavaScript中遍历数组的for for-in和forEach三种方式 for循环 let arr = [1,2,3,4,5,6];for(let i = 0; i < arr.lengt ...

  2. jupyter notebook python3路径_详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式...

    方式1. 打开Windows的cmd,在cmd中输入jupyter notebook --generate-config如下图: 可以看到路径为D:\Users--找到此路径修改jupyter_not ...

  3. JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画...

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...

  4. win下配置的ES中的数据在哪里可以看到?三种方式你看那种更加高大上!!!(win_Elasticsearch)

    在上一篇博客<使用logstash将Mysql中的数据导入到ElasticSearch中(详细步骤,win_Elasticsearch)>中我们提到将数据插入到es中,那我怎么知道数据是否 ...

  5. 【大数据开发】SparkCore——进阶算子、Action算子、查看分区数的三种方式

    源代码中的大写V,指的是value rdd.getNumberPartitions获取分区数量 Transformation算⼦全都是RDD[U,T]类型的 Action算子的返回值一般情况下不会是R ...

  6. Java中的深克隆和浅克隆的原理及三种方式实现深克隆

      本文详细介绍了Java中的浅克隆和深克隆的概念,及案例演示如何实现深克隆! 文章目录 1 克隆概述 2 深克隆实现 3 案例 3.1 测试普通clone方法--浅克隆 3.2 使用重写后的clon ...

  7. java中方法调用的三种方式

    直接调用:方法名称(实际参数) 输出调用:把方法调用放到输出语句中,注意:输出调用时,调用的方法必须有返回值 [System.out.println(getSum(12,13))]; 赋值调用:把方法 ...

  8. mysql中如何获取字段类型_MySQL获取字段类型的三种方式

    1. INFORMATION_SCHEMA.COLUMNS INFORMATION_SCHEMA是每个MySQL实例中的数据库,该实例存储有关MySQL服务器维护的所有其他数据库的信息. 如查询某一个 ...

  9. python 类对象转换json的三种方式

    第一种 from datetime import datetime import json from typing import Anyclass Student:def __init__(self, ...

最新文章

  1. VMware虚拟机提示在该系统上全局禁用了虚拟机打印功能
  2. aem是什么意思_一台400匹的宽体RX7不装转子引擎,那装的是什么?
  3. Javascript异步编程之一异步原理
  4. 学python第二天_学习Python的第二天
  5. 基本STRUTS标签-学习笔记-Bean标签
  6. Web 设计师的 50 个超便利工具[下]
  7. 阿里云10 PB+/天的日志系统设计和实现
  8. vc 获得桌面文件坐标_为何 Elementary OS 中使用 Pantheon 桌面
  9. 计算机科学与技术专业导论mooc答案,中国大学MOOC人工智能导论(2017级)网课答案...
  10. 《shell脚本学习指南》自学笔记——入门
  11. CAD弹窗拦截器/CAD字体自动替换工具
  12. android手机 无电池开机画面,还有这种操作,这款手机无电池也能开机
  13. Cain嗅探工具的DNS欺骗
  14. CentOS下载与安装
  15. mysql 存储过程 总结_Mysql存储过程总结
  16. ubuntu优化卸载不常用软件
  17. 数据库系统教程——数据库概论(一)
  18. Android手电筒制作
  19. 【堡垒机测评】关于纽盾堡垒机、jumpserver堡垒机、行云管家堡垒机的使用对比
  20. A股和B股票的区别?

热门文章

  1. 迪杰斯特拉算法(邻接表求解)
  2. 起底知网:大发学术财?学术富士康?定位偏差的知识工程?
  3. 服装店如何根据自身情况使用进销存软件?
  4. 统计建模与R软件-第六章 回归分析
  5. signal函数详解
  6. [OpenGL] 几何着色器
  7. [ Linux ] PCF8563数据手册解析 |CSDN创作打卡
  8. 谷歌浏览器安装vue-devtools
  9. 表格里面出现个别边框线粗细不同的解决
  10. IMPL10. formality 常用变量浅析