- 出现:如果为每个业务逻辑定义一个Action,虽然实现方便,但是Action数量多,struts.xml中需要配置的内容也多,使系统非常庞杂。
- 解决方法:可以用一个Action处理多个业务请求,并在struts.xml指定业务处理所采用的方法。
- 具体方式
- 为Action配置method属性
- 动态方法调用
- 使用通配符映射方式 以设计一个加减乘除的页面为例
前期准备工作
- 创建JavaWeb项目
- 导入struts2的jar包
- 配置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属性
- 表单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>
- 结果展示界面: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>
- 编写计算的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";
}
}
- 编写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>
动态方法调用
- 表单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>
- 结果展示界面: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>
- 编写计算的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";
}
}
- 编写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>
使用通配符映射方式
- 表单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>
- 结果展示界面: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>
- 编写计算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
- 编写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>
结果:
总结
- 这三种方式的差别就在于两个文件的编写:
Input.jsp和struts.xml - 动态方法调用的时候,需要在struts.xml中引入
<constant name="struts.enable.DynamicMethodInvocation" value="true"/> - web.xml文件一定要记得配置struts过滤器,否则方法二和方法三都实现不了,会出现404错误。