在Struts2中方法调用概括起来主要有三种形式

第一种方式:指定method属性

<action name="heroAction" class="com.ABC123.HeroAction" method="add">
<result name="add">/add.jsp</result>
</action>

  这样Struts2就会调用heroAction中的add方法。

第二种方式:动态方法调用(DMI)

用这种方法需要设置一个常量

struts2的2.3以上版本的jar包 必须配置DMI

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

  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <package name="goToEat" namespace="/" extends="struts-default"> <action name="heroAction" class="com.ABC123.action.HeroAction" >
<result name="list" >/list.jsp</result>
<result name="gotoupd" >/upd.jsp</result> <!-- 重定向-->
<result name="add" type="redirect">heroAction!list.action</result> </action> </package> </struts>

  动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定Form的action属性

<!-- action属性为action!methodName的形式 -->
action = "action!methodName.action"

  在struts.xml中定义如下Action

<package name="goToEat" namespace="/" extends="struts-default">

	<action name="heroAction" class="com.ABC123.action.HeroAction" >
<result name="list" >/list.jsp</result>
<result name="gotoupd" >/upd.jsp</result> <!-- 重定向-->
<result name="add" type="redirect">heroAction!list.action</result> </action> </package>

  HeroAction中的方法为

package com.ABC123.action;

import java.util.ArrayList;
import java.util.List; import com.ABC123.pojo.Hero; public class HeroAction { private static List<Hero> heroList=new ArrayList<Hero>(); private Hero hero; private int id; static{
heroList.add(new Hero(1, "德玛", 12, "德玛西亚", "很难哦哦"));
heroList.add(new Hero(2, "艾希", 45, "德玛西亚", "很厉害的啊"));
heroList.add(new Hero(3, "亚索", 78, "小学生", "很牛逼"));
} public String list() { return "list"; } //增加
public String add() { System.out.println(hero); heroList.add(hero);
return "add"; } //删除
public String del() { System.out.println("删除的下标===>"+id); Hero hero2 = heroList.get(id); System.out.println(hero2); heroList.remove(hero2);
return "add";
} public String goToUpd() { Hero hero5 = heroList.get(id);
System.out.println("该条点击修改的的hero==>"+hero5); return "gotoupd"; } //修改
public String upd() {
System.out.println(hero.getId());
int id2 = hero.getId();
id2-=1;
System.out.println("id2===>"+id2); //修改前
Hero hero5 = heroList.get(id2);
System.out.println("该条点击修改的的hero==>"+hero5); //接到的值为hero hero5.setAge(hero.getAge()); hero5.setName(hero.getName()); hero5.setStory(hero.getStory()); hero5.setZhenying(hero.getZhenying()); // heroList.set(id2, hero); System.out.println("修改后的hero==>"+hero);
return "add";
} //================================ public List<Hero> getHeroList() {
return heroList;
} public void setHeroList(List<Hero> heroList) {
this.heroList = heroList;
} public Hero getHero() {
return hero;
} public void setHero(Hero hero) {
this.hero = hero;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} }

  则在JSP中用如下方式调用方法

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!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>
<a href="/struts-01/add.jsp">去添加</a>
</br>
</br>
<table border="1">
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>zhenying</td>
<td>story</td>
<td colspan="2">操作</td>
</tr> <c:forEach items="${heroList }" var="hero">
<tr>
<td>${hero.id }</td>
<td>${hero.name }</td>
<td>${hero.age }</td>
<td>${hero.zhenying }</td>
<td>${hero.story }</td>
<td><a href="heroAction!goToUpd.action?id=${hero.id -1}">修改</a></td>
<td><a href="heroAction!del.action?id=${hero.id -1 }">删除</a></td>
</tr>
</c:forEach>
</table> <hr> <a href="/struts-01/add.jsp">去添加</a>
</br>
</br>
<table border="1">
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>zhenying</td>
<td>story</td>
<td colspan="2">操作</td>
</tr> <s:iterator value="heroList"> <tr>
<td><s:property value="id"/></td>
<td><s:property value="name "/></td>
<td><s:property value="age "/></td>
<td><s:property value="zhenying "/></td>
<td><s:property value="story "/></td>
<td><a href="heroAction!goToUpd.action?id=<s:property value='id-1'/>">修改</a></td>
<td><a href="heroAction!del.action?id=<s:property value='id-1'/>">删除</a></td>
</tr>
</s:iterator> </table> </body>
</html>

  第三种方式:通配符(推荐使用)

<action name="heroAction_*" class="com.ABC123.action.HeroAction" method="{1}">
<result name="list" >/list.jsp</result>
</action>

  这里的{1} 相当于传进来字符串进行拼接地址 比如传进来list 拼接为/list.jsp

<action name="heroAction_*" class="com.ABC123.action.HeroAction" method="{1}">
<result name="{1}" >/{1}.jsp</result>
</action>

  

<a href="heroAction_list.action">查询
<a href="heroAction_add.action">增加

  

heroAction_list.action就会调用heroAction中的list方法 然后跳转到list.jsp
heroAction_add.action就会调用heroAction中的add方法 然后跳转到add.jsp

 

Struts2方法调用的三种方式(有新的!调用方法的说明)的更多相关文章

  1. Struts2方法调用的三种方式

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="student" class="com.itmyho ...

  2. Struts2获取Session的三种方式

    1.Map<String,Object> session =  ActionContext.getContext().getSession(); session.put("cod ...

  3. 【Struts2】Struts2获取session的三种方式

    1.Map<String,Object> map =  ActionContext.getContext().getSession(); 2.HttpSession session = S ...

  4. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

  5. 浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...

  6. SpringBoot2.0.2 Application调用的三种方式

    一.注解 @SpringBootApplication            点开查看源码是由多个注解合成的注解,其中主要的注解有:            @SpringBootConfigurati ...

  7. 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝

    第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...

  8. 判断python对象是否可调用的三种方式及其区别

    查找资料,基本上判断python对象是否为可调用的函数,有三种方法 使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False ...

  9. Struts2访问ServletAPI的三种方式

    web应用中需要访问的ServletAPI,通常只有HttpServletRequest,HttpSession,ServletContext三个,这三个接口分别代表jsp内置对象中的request, ...

随机推荐

  1. Swift使用CoreLocation,你必须要看这一篇

    CoreLocation,在我们这里讨论的是一个最常用的东西,就是用Location Manger获取用户当前的位置. 整个的来说非常简单.只要这样: import CoreLocation 需要使用 ...

  2. 23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype

    23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype 2016-07-21 (www.cnblogs.com/icmzn) 模式理解

  3. 寻找最大的K个数(下)

    接着昨天的写,里面的代码包含昨天的 #include <iostream> using namespace std; #define N 50 //初始化数组 , , , , , , , ...

  4. WEBXONE IIS部署C/S程序

    WEBXONE IIS部署C/S程序 在EXE的主窗体的ONCREATE()里添加如下代码,部署的时候记得带wxoBase.dll. uses wxoExec; procedure TFrmMain. ...

  5. css选择器与DOM'匹配的关系

    一道面试题 css 选择器匹配时,只考察是否包含有对应的class,而与class的顺序无关 而css的定义是后面的覆盖前面的定义 原理:http://www.w3.org/html/ig/zh/wi ...

  6. .NET框架源码解读之MYC编译器

    在SSCLI里附带了两个示例编译器源码,用来演示CLR整个架构的弹性,一个是简化版的lisp编译器,一个是简化版的C编译器.lisp在国内用的少,因此这里我们主要看看C编译器的源码,源码位置是:\ss ...

  7. Hadoop 新建集群namenode format

    在hadoop部署好了之后是不能马上应用的,还要对配置的文件系统进行格式化. 使用命令: hadoop namenode -format 注释:namenode和secondary namenode均 ...

  8. c# 中 $符号的用法

    var names = new List<string> { "jason", "Ana", "Felipe" }; forea ...

  9. 10-06 Linux的基本命令以及一些简单的通配符说明

    Shell的通配符 主要用于模式匹配,如:文件名匹配,路径名搜索,字符查找等.常用的有:'*','?','[]' '*':代表任意长度的字串. '?':代表单个任意字符 '[]':代表模式串匹配的字符 ...

  10. 在相应目录下新建或读取xml文件

    string path = AppDomain.CurrentDomain.BaseDirectory+"UserContent1.xml"; //判断相应路径下文件是否存在 不存 ...