参考 https://blog.csdn.net/Holmofy/article/details/78387958

错误总结在后面

*通配符的使用

   <action name="The_*" class="action.{1}Action" method="{1}"><result name="success"></result><result name="failure">/mainMenu.jsp</result><result>{1}.jsp</result></action>
   <action name="*Action" class="action.{1}Action" method="{1}"></action>

匹配一个或者多个字符,允许匹配所有以Action结束的url。
如/loginAction.action,loginAction
出现多个
的时候,{1}可以代表第一个*,{2}可以代表第二个。

<action name="/edit*" class="struts.webapp.example.Edit{1}Action"><result name="failure">/mainMenu.jsp</result><result>{1}.jsp</result>
</action>

上面name属性中的*通配符就是允许匹配任意以/edit开头的url,比如/editSubscription, /editRegistration,但是需要注意的是/editSubscription/add这种url是无法匹配的。

在标签的其他属性中,甚至子标签中以及result的子标签都可以使用{n}这种方式去替换url映射中由通配符表示的部分,其中n的范围是0到9,特殊地,当n=0时,表示完整的请求路径。

比如/edit*匹配/editRegistration请求,那么{1}就是Registration,{0}就是/editRegistration(这方面和正则表达式类似)。

注意下面的
<action name="List*s" class="actions.List{1}s"><result>list{1}s.jsp</result>
</action>

当url为ListAccounts,上面的配置会正常运行。当url为ListSponsors时,由于ListSponsors中间也出现了s,所以最终会得到下面的匹配结果:

<action name="ListSpons" class="actions.ListSpons"><result>listSpons.jsp</result>
</action>

*号最好不要出现在中间

** 通配符

前面说到/edit通配符无法匹配/editSubscription/add这样的url。如果确实需要匹配这种url可以使用两个号, 也就是/edit**。

注意:如果需要让Action的name属性包含/,需要配置一个常量:
<constant name="struts.enable.SlashesInActionNames" value="true"/>
虽然能够让Action的name包含/,但Struts2官方并不推荐使用这种配置(因为有副作用),可以参看Struts2官网对Action name包含/的讨论:https://issues.apache.org/jira/browse/WW-1383

另外如果需要对Action name中能出现的字符进行限制,可以配置如下变量:

<constant name = “struts.allowed.action.names” value = “[a-z{}]” */>

上面这中使用*或?的通配符模式有很多名字,有人把它叫做glob匹配模式,也有人把它叫做Ant-style…

命名空间的配置

https://blog.csdn.net/Holmofy/article/details/78387958
虽然不推荐Action的name属性包含/,但是对于使用/进行模块划分有更好的解决方案——package的namespace属性。
Struts2中,package标签的namespace属性是用来细分项目模块的,比如:

<!-- 没有配置namespace,则为默认命名空间 -->
<package name="default"><action name="foo" class="mypackage.simpleAction"><result name="success" type="dispatcher">greeting.jsp</result></action><action name="bar" class="mypackage.simpleAction"><result name="success" type="dispatcher">bar1.jsp</result></action>
</package>
<!-- 配置namespace为"/",则为根命名空间 -->
<package name="mypackage1" namespace="/"><action name="moo" class="mypackage.simpleAction"><result name="success" type="dispatcher">moo.jsp</result></action>
</package><!-- 配置namespace为"/barspace",是精确命名空间 -->
<package name="mypackage2" namespace="/barspace"><action name="bar" class="mypackage.simpleAction"><result name="success" type="dispatcher">bar2.jsp</result></action>
</package>

命名空间的匹配优先级为:精确命名空间 > 根命名空间 > 默认命名空间

动态方法调用

除了通配符方法,Struts2还提供了一种更便捷的方式进行Action的方法映射。
动态方法调用(Dynamic Method Invocation)。不过官方文档中说,DMI方式存在安全性问题,所以Struts2中默认把这个功能关闭了(default.property文件中struts.enable.DynamicMethodInvocation=false),如果需要使用需要设置常量将该功能打开。

<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<action name="use!*" class="cn.hff.struts.UserAction" method="{1}">...
</action>

报错

There is no Action mapped for namespace [/users] and action name [User_login] associated
with context path [/Struts2AndHibernate].

解决method中的问题

https://blog.csdn.net/Holmofy/article/details/78387958

  <action name="The_*" class="action.{1}Action" method="{1}"><result name="success"></result></action>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />

当使用动态调用方法时(action名 + 感叹号 + 方法名进行方法调用),需要将其属性改为true,
当使用通配符调用语法时,建议将其属性改为false(struts2.5.2中默认是false)
当我们需要将其属性改成false时,
只在struts.xml配置文件中加入此句即可修改属性

1.使用通配符方法进行映射,和使用!符号的“动态方法调用”可能会重叠,需要设置一个常量来禁用动态方法调用(Struts2.5默认是禁用状态):

<constant name="struts.enable.DynamicMethodInvocation" value="false" />

2.对于Struts2.3之前的版本可以不配置<allowed-methods>,但是对于之后的版本,如果不配置<allowed-methods>将会出现如下异常:

Struts has detected an unhandled exception:
Message:There is no Action mapped for namespace [/] and action name [user_login] associated with context path

1. Action里面添加<allowed-methods>

<allowed-methods>delete,update,insert,select</allowed-methods>

2. Package里面添加<allowed-methods>

<global-allowed-methods>regex:.*</global-allowed-methods>

或者

//设定全局允许通行的方法
<global-allowed-methods>method1,method2</global-allowed-methods>
<global-allowed-methods>execute,input,back,cancel,browse,save,delete,list,index</global-allowed-methods>

4.注解加在action类上

     @AllowedMethods("method")public class TestAction extends ActionSupport {......}

3. 关闭严格方法调用

struts2从2.5版本开始,为了提升安全性,默认开启了严格的方法调用。
如果要使用通配符*,必须在package中设置 strict-method-invocation=“false”,代码如下:

<package name = "default" namespace="/" extends="struts-default" strict-method-invocation="false">

等于说放弃了新引进的DMI机制,一劳永逸,但有风险(不过想想原来都是这样用的……

在Struts2.3中在package标签中添加了一个属性来限制DMI,该选项告诉Struts2框架拒绝所有未通过method属性配置或者<allowed-methods>标签标明的方法。
在Struts2.5中不仅仅限制了DMI的调用,还对Action的可使用的方法进行了限制,也就是默认开启了strict-method-invocation选项(在struts-default.xml文件中可以看到)

最后一个坑,遇到红字怎么办,但是有解决不了。仔细看看你的struts.xml的版本有没有错


<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN""http://struts.apache.org/dtds/struts-2.5.dtd">


我只用了这个

Struts2通配符和它的各种问题总结相关推荐

  1. struts2通配符_基于Struts2框架的名片管理系统

    本篇博文将分享一款基于Struts2框架的名片管理系统,JSP引擎为Tomcat9.0,数据库采用的是MySQL5.5,集成开发环境为Eclipse IDE for Java EE Developer ...

  2. Struts2通配符映射/Struts action name=/*/* method={2} class=com.jxc.action.{1}Action result

    struts2的关于method="{1}"意思详解 <action   name= "Login_* "   method= "{1} &qu ...

  3. struts2——通配符

    struts2的配置文件是 struts.xml.. 在这个配置文件里面可以使用通配符..其中的好处就是,大大减少了配置文件的内容..当然,相应付出的代价是可读性.. 使用通配符的原则是 约定高于配置 ...

  4. struts2 通配符简化配置

    在struts映射中反复出现的模式 动作方法 描写叙述 下一个动作方法 add 为save准备网页 save save 提交INSERT list edit 为update准备网页 update up ...

  5. android基础的博客,【复习】Android基础

    网络互通1.同网段互通-交换     终端     网络        交换机       多层交换机         原理  &nbsp... temp1 = 1.5 print " ...

  6. java 运行窗口_eclipse java 底部的那个显示运行结果的框被我一不小心关掉了,如何打开...

    展开全部 打开方法:点击工具栏上的window输入reset perspective即可或者点击windows->show view->console 初学者可62616964757a68 ...

  7. [JavaWeb基础] 018.Struts2 Action通配符使用

    Struts2中有一个很牛逼的action通配符,可以用来简化action配置,以我们将要讲解的案例来说,如果我们要对一个学生信息进行增加,删除,修改,那么按照原来的做法,我们需要写3个Action来 ...

  8. 【struts2】action中使用通配符

    在以前的学习中,<action>元素的配置,都是用明确的配置,其name.class等属性都是一个明确的值.其实Struts2还支持class属性和method属性使用来自name属性的通 ...

  9. Struts2的2.5.10版本找不到StrutsPrepareAndExecuteFilter过滤器 与 struts.xml文件通配符异常问题

    一.异常描述: 今天在整合ssh的时候,在配置Struts2框架之后,启动之后,项目报错抛异常:主要异常信息如下: java.lang.ClassNotFoundException: org.apac ...

  10. Struts2的通配符配置方式

    Struts2的Action类很有意思,你可以使用3种方式来实现具体的Action类: 让你的Action类继承自ActionSupport类(项目中最常用这种方式,因为ActionSupport类中 ...

最新文章

  1. 010_logback中的SocketAppender
  2. jdbc连接数据scanip_java数据库连接_jdbc
  3. linux 服务器账号及安全杂谈
  4. 模板方法模式(Template Method Pattern)学习笔记
  5. SQL Server中关于跟踪(Trace)那点事(转载)
  6. python爬取小说项目概述_Python实战项目网络爬虫 之 爬取小说吧小说正文
  7. Android AP模式下获取SSID/PASSWORD
  8. HCIE-RS面试---STP拓扑变化过程
  9. pmp培训机构哪个好?各pmp培训机构排名如何?
  10. Lena,Pepper等图像,图像处理必备资料。
  11. 【回眸】安装Hightec后如何导入源码及相关环境配置
  12. Android Split的用法
  13. ANSYS的几种动画模式
  14. 阿包也是兔娘cosplay全套超清图包合集
  15. 【UML】— 用例图
  16. python:实现IIR 滤波器算法(附完整源码)
  17. 硅谷华人高管少?看印度 CEO 怎么培养软实力!
  18. H5背景音乐解决方案
  19. 【太极创客】零基础入门学用Arduino 第一部分 合辑笔记
  20. python+django+Vue社区医院管理服务系统

热门文章

  1. 如何进入oppo云服务器,OPPO云服务(查找手机)
  2. Guthrie QA-CAD2019(CAD绘图修订管理工具)A.04中文版
  3. 调用远程摄像头进行人脸识别_怎样快速搭建人脸识别通道?
  4. 【基础】华为设备RIP协议原理及配置全集
  5. 基于Python编写的倒计时工具
  6. 2021蓝桥杯Java复习【史上最详细攻略】【持续更新】
  7. smartdns使用指南_OpenWrt之SmartDNS 使用教程(PW版)
  8. 【论文查重】常用论文写作查重润色网站
  9. matlab输电线路模型,输电线路模型及其特性.ppt
  10. 【Proteus仿真】51单片机+DAC0832+LCD1602制作LM317数控直流电源