Struts2中XXX.Action类中方法的访问(三种方式)
第一种:使用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类中方法的访问(三种方式)相关推荐
- 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 ...
- jupyter notebook python3路径_详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式...
方式1. 打开Windows的cmd,在cmd中输入jupyter notebook --generate-config如下图: 可以看到路径为D:\Users--找到此路径修改jupyter_not ...
- JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画...
bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...
- win下配置的ES中的数据在哪里可以看到?三种方式你看那种更加高大上!!!(win_Elasticsearch)
在上一篇博客<使用logstash将Mysql中的数据导入到ElasticSearch中(详细步骤,win_Elasticsearch)>中我们提到将数据插入到es中,那我怎么知道数据是否 ...
- 【大数据开发】SparkCore——进阶算子、Action算子、查看分区数的三种方式
源代码中的大写V,指的是value rdd.getNumberPartitions获取分区数量 Transformation算⼦全都是RDD[U,T]类型的 Action算子的返回值一般情况下不会是R ...
- Java中的深克隆和浅克隆的原理及三种方式实现深克隆
本文详细介绍了Java中的浅克隆和深克隆的概念,及案例演示如何实现深克隆! 文章目录 1 克隆概述 2 深克隆实现 3 案例 3.1 测试普通clone方法--浅克隆 3.2 使用重写后的clon ...
- java中方法调用的三种方式
直接调用:方法名称(实际参数) 输出调用:把方法调用放到输出语句中,注意:输出调用时,调用的方法必须有返回值 [System.out.println(getSum(12,13))]; 赋值调用:把方法 ...
- mysql中如何获取字段类型_MySQL获取字段类型的三种方式
1. INFORMATION_SCHEMA.COLUMNS INFORMATION_SCHEMA是每个MySQL实例中的数据库,该实例存储有关MySQL服务器维护的所有其他数据库的信息. 如查询某一个 ...
- python 类对象转换json的三种方式
第一种 from datetime import datetime import json from typing import Anyclass Student:def __init__(self, ...
最新文章
- VMware虚拟机提示在该系统上全局禁用了虚拟机打印功能
- aem是什么意思_一台400匹的宽体RX7不装转子引擎,那装的是什么?
- Javascript异步编程之一异步原理
- 学python第二天_学习Python的第二天
- 基本STRUTS标签-学习笔记-Bean标签
- Web 设计师的 50 个超便利工具[下]
- 阿里云10 PB+/天的日志系统设计和实现
- vc 获得桌面文件坐标_为何 Elementary OS 中使用 Pantheon 桌面
- 计算机科学与技术专业导论mooc答案,中国大学MOOC人工智能导论(2017级)网课答案...
- 《shell脚本学习指南》自学笔记——入门
- CAD弹窗拦截器/CAD字体自动替换工具
- android手机 无电池开机画面,还有这种操作,这款手机无电池也能开机
- Cain嗅探工具的DNS欺骗
- CentOS下载与安装
- mysql 存储过程 总结_Mysql存储过程总结
- ubuntu优化卸载不常用软件
- 数据库系统教程——数据库概论(一)
- Android手电筒制作
- 【堡垒机测评】关于纽盾堡垒机、jumpserver堡垒机、行云管家堡垒机的使用对比
- A股和B股票的区别?