SSH笔记-Struts2的通配符

1、一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系
(就是一个action类里面包含多个能被不同action调用的方法的时候,用通配符就能简化为一个通用的映射关系,即配置一个就完成struts.xml对应映射的设置)

2、通配符规则
- (1)如果找到多个匹配,则没有用通配符的优先使用
- (2)如果找不到指定的匹配,Struts2会尝试把这个 URL 与任何一个有通配符 * 的action名进行匹配
- (3)被通配符匹配到的URL字符串子串可以用{1} {2}来引用,数字从1开始算
- (4)用{0}匹配整个字符串
- (5)如果找到多个带通配符的匹配,则按照先后顺序进行匹配
- (6)可以匹配多个字符,但是如果要包含 / 则需要使用两个 替换 / ,字符转义就用 \ + 需要转义的字符

3、项目目录
项目目录

4、struts.xml配置

<?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>
    <constant name="struts.action.extension" value="action,do,"></constant>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
        <action name="*_*" class="com.demo.sshtest.WildcardTest" method="{1}_{2}">
            <result>/{1}_{2}1.jsp</result>
        </action>
    </package>
</struts>

将要调用的action名:Test_One、Test_Two 、Test_Three
将要调用的方法名:Test_One、Test_Two、Test_Three
name: name中用了两个通配符,用于分别匹配action名中的Test和One/Two/Three
class:要被调用的action类的包名+类名
method:action类中被调用的方法的方法名,两个通配符用于匹配方法名中的Test和One/Two/Three
result:里面的{1}代表第一个通配符替代的Test,{2}代表第二个通配符替代的One/Two/Three

5、action类

package com.demo.sshtest;

public class WildcardTest {

    public int pid = 0;
    public String pName = "";

    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getpName() {
        return pName;
    }
    public void setpName(String pName) {
        this.pName = pName;
    }

    public String Test_One(){
        System.out.println(">>>into TestOne");
        System.out.println("pid:"+getPid()+" pName:"+getpName());
        return "success";
    }

    public String Test_Two(){
        System.out.println(">>>into TestTwo");
        System.out.println("pid:"+getPid()+" pName:"+getpName());
        return "success";
    }

    public String Test_Three(){
        System.out.println(">>>into TestThree");
        System.out.println("pid:"+getPid()+" pName:"+getpName());
        return "success";
    }
}

注意方法名字要对应struts.xml配置的就可以了

6、调用action的页面

<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script>
function changeaction(){
    var obj = document.getElementById("pid");
    var index = obj.selectedIndex;
    var text = obj.options[index].text;
    var value = obj.options[index].value;
    if(1==value){
        document.getElementById("ActionForm").action="Test_One.action";
    }else if(2==value){
        document.getElementById("ActionForm").action="Test_Two.action";
    }else if(3==value){
        document.getElementById("ActionForm").action="Test_Three.action";
    }
}
</script>
</head>
<body>
    <form method="post" id="ActionForm" name="ActionForm" action="Test_One.action">
        <select id="pid" name="pid" onChange="changeaction()">
            <option value="1" select>1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>
        <input type="text" id="pName" name="pName" value="pName">
        <input type="submit" id="submit" name="submit" value="submit">
    </form>
</body>
</html>

这里的action名写清楚就好了

7、结果跳转页面Test_One1.jsp、Test_Two1.jsp、Test_Three1.jsp(三个页面内容相同,只是用来测试result会不会对应不同{}来跳转)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<% request.setCharacterEncoding("UTF-8"); %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test_One1</title>
</head>
<body>
    Test_One1
    <br><br>
    pid: ${pid }   <!--${} 这种表达方式叫做EL,仅仅是表达式-->
    <br><br>
    pName: ${pName }
    <br><br>
    pid: <%=request.getParameter("pid") %>
    <br><br>
    pName: <%=request.getParameter("pName") %>
    <br><br>
</body>
</html>

8、注意事项:
- 配置多少个通配符,{}就有多少个数,不管什么位置,第一个出现的通配符就用{1}表示,如此类推
- {0}就表示通配整个名
- result标签不写name的时候,action类里面对应方法的返回值都要是success,不然会说没有定义name的值
- {}外面能添加任何字符串,反正不影响使用、跟对应方法名或者jsp页面文件名对应就可以了 如:{}_{}1.jsp,添加了1是不影响的,只要对应好jsp文件名就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值