文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习

实现了Action处理类之后,就可以在struts.xml中配置该Action,从而让Struts 2框架知道哪个Action处理哪个请求,即建立用户请求和Action类之间的对应关系。

Action基本配置

Struts 2使用package包来组织Action,在struts.xml中通过使用package下的action元素来配置Action。在配置Action时,需要指定action元素的name和class属性。

  1. name属性:指定Action的名字,即指明该Action所处理的请求的URL,例如,若name属性值为login,则请求该Action的URL是login.action
  2. class属性:指定Action的实现类,该属性不是必须的,如果没有指定class属性的值,则默认使用ActionSupport类。

Action基本配置代码如下:

<package name="default" namespace="/" extends="struts-default">
  <action name="example" class="com.example.struts.action.expAction">
</package>

Action只是一个逻辑控制器,不直接对用户请求生成任何相应。因此,Action处理完用户请求后需要将指定的视图资源呈现给用户,即配置Action时,应该配置逻辑视图和物理视图资源之间的映射。

配置逻辑视图和物理视图之间的映射关系是通过<result>元素来定义的,每个<result>元素定义逻辑视图和物理视图之间的一个映射:

<package name="default" namespace="/" extends="struts-default">
  <action name="example" class="com.example.struts.action.expAction">
  <result name = "success">/success.jsp</result>
  <result name = "error">/error</result>
</package>

动态方法调用

有时一个Action内需要包含多个控制处理逻辑。例如,对于同一个表单,当用户通过不同的提交按钮进行提交时,系统需要使用Action的不同方法进行处理用户请求,此时就需要让Action中包含多个控制处理逻辑。

Struts 2框架允许一个Action中包含多个处理逻辑。在Struts 2中请求一个Action中的不同处理逻辑方法的方式成为DMI(Dynamic Method Invocation,动态方法调用),其请求格式如下:

(ActionName)!(methodName).action
  1. ActionName是Action的名字,即struts.xml中配置的Action的name属性值;
  2. methodName是Action实现类中处理逻辑的方法名。

动态方法调用示例

//访问product中的edit()方法
product!edit.action

productList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>商品列表</title>
</head>
<body>
  <table border="1">
    <tr>
      <th>商品ID</th>
      <th>商品名称</th>
      <th>数量</th>
      <th colspan="2">操作</th>
    </tr>
    <tr>
      <td>1001</td>
      <td>小米手机</td>
      <td>128</td>
      <td><a href="product!edit.action?productId=1001" rel="external nofollow" >编辑</a></td>
      <td><a href="product!del.action?productId=1001" rel="external nofollow" >删除</a></td>
    </tr>
    <tr>
      <td>1002</td>
      <td>佳能相机</td>
      <td>100</td>
      <td><a href="product!edit.action?productId=1002" rel="external nofollow" >编辑</a></td>
      <td><a href="product!del.action?productId=1002" rel="external nofollow" >删除</a></td>
    </tr>
  </table>
</body>
</html>```

上述代码中,商品列表中的每个商品使用超链接进行编辑、删除操作。超链接中href属性值采用动态方法调用的方式进行链接请求,并将产品ID作为参数传递给Action。

ProductAction.java代码如下:

package com.qst.chapter03.action;

import com.opensymphony.xwork2.ActionSupport;

public class ProductAction extends ActionSupport {
  private int productId;

  public int getProductId() {
    return productId;
  }

  public void setProductId(int productId) {
    this.productId = productId;
  }

  // 编辑商品
  public String edit() {
    System.out.println("编辑商品" + productId);
    // ...省略一些编辑商品的业务
    return "edit";
  }

  // 删除商品
  public String del() {
    System.out.println("删除商品" + productId);
    // ...省略一些删除商品的业务
    return "del";
  }
}

上述代码创建了两个业务方法edit()和del()方法。当用户单击不同的链接时,系统将交给对应的方法处理。

接下来编写edit.jsp和del.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>

<title>编辑商品</title>
</head>
<body>
  ${param.productId}商品编辑
</body>
</html>
<%@ 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>

<title>删除商品</title>
</head>
<body>
  ${param.productId}商品删除成功!
</body>
</html>

在struts.xml中配置ProductAction代码如下所示:

<?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处于开发阶段,可以进行调试 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />

  <!-- Struts2的Action都必须配置在package里,此处使用默认package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定义一个名为user的Action,实现类为com.qst.chapter03.action.LoginAction -->
    <action name="product" class="com.qst.chapter03.action.ProductAction">
      <result name="edit">/edit.jsp</result>
      <result name="del">/del.jsp</result>
    </action>
  </package>

</struts>

上述配置文件配置了常量struts.enable.DynamicMethodInvocation的值为true,这样Struts 2才会开启动态方法调用,否则默认不会开启动态方法调用。

使用method属性及通配符

除了动态方法调用之外,Struts 2还提供了另一种处理方法,即将Action处理类定义成多个逻辑Action。此时,在配置<action>元素时,需要指定name、class和method属性。这样就可以让Action调用指定方法,而不是execute()方法来处理用户请求。

例如可以将ProductAction类定义成两个逻辑Action,即将该类中的edit()和del()方法映射成不同的Action,示例代码如下:

<action name="editproduct" class="com.qst.chapter03.action.ProductAction" method = "edit">
  <result name="edit">/edit.jsp</result>
</action>
<action name="delproduct" class="com.qst.chapter03.action.ProductAction" method = "del">
  <result name="del">/del.jsp</result>
</action>

上述代码定义了editproduct和delproduct两个逻辑Action,这两个Action对应的处理类都是ProductAction,但处理逻辑不同。分别对应的是edit()和del()方法。

上面的这种方式虽然能够实现,但两个定义绝大部分是相同的,带来冗余问题。Struts 2还提供了通配符“ * ”来解决这个问题。利用通配符在定义Action的name属性时使用模式字符串(即用“ * ”代表一个或多个任意字符串),接下来就可以在class、method属性以及<result>子元素中使用{N}的形式代表前面第N个星号“ * ”所匹配的子串。

* 通配符

<struts>
  <!-- 演示通配符的使用方法 -->
  <package name="product" extends="struts-default">
    <action name=" * product" class="com.qst.chapter03.action.ProductAction" method = "{1}">
      <result name="edit">/edit.jsp</result>
      <result name="del">/del.jsp</result>
    </action>
  </package>

</struts>

上述代码Action的name属性值为“ * product”,使用了通配符,此时定义的不是一个普通的Action,而是定义了一系列的逻辑Action,只要用户请求的URL符合“ * product.action”的模式,都可以通过ProductAction处理。此外,必须要指定method属性,method属性用于指定用户请求的方法。在method属性中使用表达式{1},代表该表达式就是name属性值中第一个“ * ”指代的值。通过上述配置规则可以达到与动态调用同样的运行效果。

此外Struts 2允许在class属性和method属性中同时使用表达式,例如:

复制代码 代码如下:
<action name = " *_* " class = "com.qst.chapter03,action.{1}Action" method = " {2} ">

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持敏而好学论坛/嗨学网。

原文地址是:http://www.piaodoo.com/thread-13233-1-2.html 丝袜控www.txdah.com 131www.buzc.org学习之外可赏心悦目有助更好地学习!

Struts 2 配置Action详解_java - JAVA的更多相关文章

  1. Struts2 配置Action详解

     Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实 ...

  2. springboot扫描自定义的servlet和filter代码详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 这几天使用spring boot编写公司一个应用,在编写了一个filter,用于指定编码的filter,如下: /** ...

  3. Java AtomicInteger类的使用方法详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Samp ...

  4. java 流操作对文件的分割和合并的实例详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...

  5. Java使用wait() notify()方法操作共享资源详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方 ...

  6. Jdbc连接数据库基本步骤详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Jdbc连接数据库的基本步骤,供大家参考,具体内容如下 package demo.jdbc; import java.s ...

  7. (七)Transformation和action详解-Java&Python版Spark

    Transformation和action详解 视频教程: 1.优酷 2.YouTube 什么是算子 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作. 算子分类: 具体: 1.Value ...

  8. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  9. JAVA JDK 环境变量配置 入门详解 - 精简归纳

    JAVA JDK 环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 13 转载请注明出处!️ 目录 JAVA JDK 环境变量配置 入门详解 - 精简归纳 一.为什么j ...

随机推荐

  1. navicat 系列软件一点击菜单栏就闪退

    现象:安装多个版本都出现了闪退的现象 解决方案:后来发现,原来是启动了有道词典屏幕取词才会出现这种现象,关了有道就没事.

  2. mariadb数据库基础

    1.数据库介绍 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据 ...

  3. 【VS开发】VS2013多字节工程问题uilding an MFC project for a non-Unicode character set is deprecated

    VS2013多字节工程问题 使用VS2013编译旧版VC++程序时,提示Building an MFC project for a non-Unicode character set is depre ...

  4. k8s-kubernettes-sercet存储

    Secret Secret存在意义 Secret解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中.Secret可以以Volume或者环境变量的方 ...

  5. 红帽学习笔记[RHCSA] 第十课[计划任务Cron与At、逻辑卷管理]

    计划任务[At & Cron Jobs] at # at 命令只能计划一次性任务但是比较方便. # 先输入时间 [root@localhost Desktop]# at 10:02 # 输入要 ...

  6. 使用graphics.h来绘制图形

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. graphics.h是TC里面的图形库,如果要用的话应该用TC来编译.分为:像素函数.直线和线型函数.多边形函数.填充函数等.然而在我们使 ...

  7. NFC读写器调试总结20191203

    以下为NFC读写器调试经验总结: 1.读写器部分,从TX1/TX2输出的13.56MHZ信号主要由L0/C0构成低通滤波器,用于滤除13.56MHZ的高次谐波,取值L0=1UH,C0=47PF时候,谐 ...

  8. 升级tableau版本

    下载地址: https://www.tableau.com/zh-cn/support/releases 2018以后的版本升级:https://help.tableau.com/current/se ...

  9. maven 报错 -source 1.5 中不支持 diamond 运算符

    maven 执行install 报-source 1.5 中不支持 diamond 运算符 解决办法, 指定编译版本 <build> <plugins> <plugin& ...

  10. zookeeper集群的搭建(CentOS 7)

    注意ip地址为: 虚拟机ip设置 TYPE="Ethernet"BOOTPROTO="static"NAME="enp0s3"DEVICE= ...