欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Struts 2 配置Action详解

程序员文章站 2024-04-01 18:51:10
实现了action处理类之后,就可以在struts.xml中配置该action,从而让struts 2框架知道哪个action处理哪个请求,即建立用户请求和action类之...

实现了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} ">

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。