struts-多方法的Action

100 阅读4分钟
  1. 出现:如果为每个业务逻辑定义一个Action,虽然实现方便,但是Action数量多,struts.xml中需要配置的内容也多,使系统非常庞杂。
  2. 解决方法:可以用一个Action处理多个业务请求,并在struts.xml指定业务处理所采用的方法。
  3. 具体方式
    • 为Action配置method属性
    • 动态方法调用
    • 使用通配符映射方式 以设计一个加减乘除的页面为例

前期准备工作

  1. 创建JavaWeb项目
  2. 导入struts2的jar包
  3. 配置web.xml,导入struts
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	 version="3.1">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
        <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class> 
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

为Action配置method属性

  1. 表单Input.jsp
<%@ page language="java"  pageEncoding="UTF-8"%>
<html>
  <head>   
    <title>提交数据页面,并根据不同的按钮选择不同的业务处理</title>   
    <script type="text/javascript">
        function sub(){ document.aaa.action="sub";} //动态修改表单的action属性
        function mul(){ document.aaa.action="mul";} //动态修改表单的action属性
        function div(){ document.aaa.action="div";} //动态修改表单的action属性
    </script>
  </head>  
  <body>
    <form action="add" method="post" name="aaa">
           请输入两个整数:<br><br>
           第1个运算数:<input name="x"/><br><br>
           第2个运算数:<input name="y"/><br><br>
     <input type="submit" value="求和"/>
     <input type="submit" value="求差" onclick="sub()"/>
     <input type="submit" value="求积" onclick="mul()"/>
     <input type="submit" value="求商" onclick="div()"/>
    </form>
  </body>
</html>

  1. 结果展示界面:Show.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>${msg}</h1>
        result:${value}
    </body>
</html>

  1. 编写计算的Action
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package p1;

/**
 *
 * @author 碎碎念
 */
public class SumAction {

    private int x, y;
    private int value;     // 用于存放计算结果
    private String msg;   // 用于存放计算信息

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String add() throws Exception {   // 求和方法
        value = x + y;
        msg = "你选择的是求和运算!";
        return "show";
    }

    public String sub() throws Exception {  // 求差方法
        value = x - y;
        msg = "你选择的是求差运算!";
        return "show";
    }

    public String mul() throws Exception {  // 求积方法
        value = x * y;
        msg = "你选择的是求积运算!";
        return "show";
    }

    public String div() throws Exception {   // 求商方法
        value = x / y;
        msg = "你选择的是求商运算!";
        return "show";
    }

}

  1. 编写struts.xml
<?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>
	<package name="user" namespace="/" extends="struts-default">
		 
		<action name="add" class="p1.SumAction" method="add">
            <result name="show">/Show.jsp</result>
        </action>
         <action name="sub" class="p1.SumAction" method="sub">
            <result name="show">/Show.jsp</result>
        </action>
        <action name="mul" class="p1.SumAction" method="mul">
            <result name="show">/Show.jsp</result>
        </action>
        <action name="div" class="p1.SumAction" method="div">
            <result name="show">/Show.jsp</result>
        </action>
                
	</package>
</struts> 

动态方法调用

  1. 表单Input.jsp
<%@ page language="java"  pageEncoding="UTF-8"%>
<html>
  <head>   
    <title>提交数据页面,并根据不同的按钮选择不同的业务处理</title>   
    <script type="text/javascript">
        function sub(){ document.aaa.action="cal!sub";} //动态修改表单的action属性
        function mul(){ document.aaa.action="cal!mul";} //动态修改表单的action属性
        function div(){ document.aaa.action="cal!div";} //动态修改表单的action属性
    </script>
  </head>  
  <body>
    <form action="cal!add" method="post" name="aaa">
           请输入两个整数:<br><br>
           第1个运算数:<input name="x"/><br><br>
           第2个运算数:<input name="y"/><br><br>
     <input type="submit" value="求和"/>
     <input type="submit" value="求差" onclick="sub()"/>
     <input type="submit" value="求积" onclick="mul()"/>
     <input type="submit" value="求商" onclick="div()"/>
    </form>
  </body>
</html>

  1. 结果展示界面:Show.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>${msg}</h1>
        result:${value}
    </body>
</html>

  1. 编写计算的Action
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package p1;

/**
 *
 * @author 碎碎念
 */
public class SumAction {

    private int x, y;
    private int value;     // 用于存放计算结果
    private String msg;   // 用于存放计算信息

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String add() throws Exception {   // 求和方法
        value = x + y;
        msg = "你选择的是求和运算!";
        return "show";
    }

    public String sub() throws Exception {  // 求差方法
        value = x - y;
        msg = "你选择的是求差运算!";
        return "show";
    }

    public String mul() throws Exception {  // 求积方法
        value = x * y;
        msg = "你选择的是求积运算!";
        return "show";
    }

    public String div() throws Exception {   // 求商方法
        value = x / y;
        msg = "你选择的是求商运算!";
        return "show";
    }

}

  1. 编写struts.xml
<?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>
	<package name="user" namespace="/" extends="struts-default">
		 
		<action name="cal" class="p1.SumAction" >
            <result name="show">/Show.jsp</result>
        </action>               
	</package>
        <constant name="struts.enable.DynamicMethodInvocation" value="true"/>

</struts> 

使用通配符映射方式

  1. 表单Input.jsp
<%@ page language="java"  pageEncoding="UTF-8"%>
<html>
  <head>   
    <title>提交数据页面,并根据不同的按钮选择不同的业务处理</title>   
    <script type="text/javascript">
        function sub(){ document.aaa.action="cal_sub";} //动态修改表单的action属性
        function mul(){ document.aaa.action="cal_mul";} //动态修改表单的action属性
        function div(){ document.aaa.action="cal_div";} //动态修改表单的action属性
    </script>
  </head>  
  <body>
    <form action="cal_add" method="post" name="aaa">
           请输入两个整数:<br><br>
           第1个运算数:<input name="x"/><br><br>
           第2个运算数:<input name="y"/><br><br>
     <input type="submit" value="求和"/>
     <input type="submit" value="求差" onclick="sub()"/>
     <input type="submit" value="求积" onclick="mul()"/>
     <input type="submit" value="求商" onclick="div()"/>
    </form>
  </body>
</html>
  1. 结果展示界面:Show.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>${msg}</h1>
        result:${value}
    </body>
</html>

  1. 编写计算Action
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package p1;

/**
 *
 * @author 碎碎念
 */
public class SumAction {

    private int x, y;
    private int value;     // 用于存放计算结果
    private String msg;   // 用于存放计算信息

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String add() throws Exception {   // 求和方法
        value = x + y;
        msg = "你选择的是求和运算!";
        return "show";
    }

    public String sub() throws Exception {  // 求差方法
        value = x - y;
        msg = "你选择的是求差运算!";
        return "show";
    }

    public String mul() throws Exception {  // 求积方法
        value = x * y;
        msg = "你选择的是求积运算!";
        return "show";
    }

    public String div() throws Exception {   // 求商方法
        value = x / y;
        msg = "你选择的是求商运算!";
        return "show";
    }

}
va

  1. 编写struts.xml
<?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>
	<package name="user" namespace="/" extends="struts-default">
		 
		<action name="cal_*" class="p1.SumAction" method="{1}">
			<result name="show">/Show.jsp</result>
		</action>          
                
	</package>
</struts> 

结果:

image.png

image.png

image.png

image.png

image.png

总结

  1. 这三种方式的差别就在于两个文件的编写:Input.jspstruts.xml
  2. 动态方法调用的时候,需要在struts.xml中引入<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
  3. web.xml文件一定要记得配置struts过滤器,否则方法二和方法三都实现不了,会出现404错误。