Java Struts2有没有办法将元数据添加到struts.xml文件中的操作定义中?

Java Struts2有没有办法将元数据添加到struts.xml文件中的操作定义中?,java,struts2,Java,Struts2,我使用Struts2框架创建一个webapp。我有一个拦截器,它应该根据调用的操作具有不同的行为。例如,登录拦截器应始终允许执行某些操作,但如果用户尚未登录,它应阻止其他操作 我现在解决这个问题的方法是在拦截器中手动检查操作的名称(和/或命名空间),并基于此确定我的行为。这种“硬编码”逻辑的缺点是,如果我编辑struts.xml文件,就很难维护,而且对于其他开发人员来说,这也不明显 我想知道这些是否是在struts.xml文件(或其他文件?)中添加“元数据”的某种方式,以将某些操作“标记”为特定

我使用Struts2框架创建一个webapp。我有一个拦截器,它应该根据调用的操作具有不同的行为。例如,登录拦截器应始终允许执行某些操作,但如果用户尚未登录,它应阻止其他操作

我现在解决这个问题的方法是在拦截器中手动检查操作的名称(和/或命名空间),并基于此确定我的行为。这种“硬编码”逻辑的缺点是,如果我编辑struts.xml文件,就很难维护,而且对于其他开发人员来说,这也不明显

我想知道这些是否是在struts.xml文件(或其他文件?)中添加“元数据”的某种方式,以将某些操作“标记”为特定的“类型”。例如,类似这样的内容:

Struts.xml

<action name="loginPage" types="login, user, viewpage" class="login.controller.LoginPage">
    <result name="success">/login/jsp/Login.jsp</result>
</action>

/login/jsp/login.jsp
然后在我的拦截器类中:

@Override
public String intercept(ActionInvocation invocation)
throws Exception
{
    Set<String> actionTypes = invocation.getInvocationContext().getTypes();

    if(actionTypes.contains("login")
    {
        doSomething();
    }
    else
    {
        doSomethingElse();
    }        

}
@覆盖
公共字符串截获(ActionInvocation调用)
抛出异常
{
设置actionTypes=invocation.getInvocationContext().getTypes();
if(actionTypes.contains(“登录”)
{
doSomething();
}
其他的
{
doSomethingElse();
}        
}

这是可能的,还是名称(空格)的硬编码解析是唯一的方法?

显然您不能这样做,因为DTD不允许您这样做

另一个很好的例子是:

XY问题是询问您试图解决的问题,而不是实际问题

也就是说,你试图解决问题X,你认为解决方案Y是可行的,但是当你遇到麻烦时,不是问X, 你问关于你的事

您真正需要的是定义一组免费运行的操作,以及在登录控制下运行的其他组

为此,您可以在每个操作中手动包含拦截器(在使用约定插件时很有用,否则会浪费时间),或者在struts.xml中以逻辑方式配置操作

在这里是您的朋友:定义两个(或更多)包,一个使用默认设置运行,另一个为包的每个操作运行自定义拦截器:


...
...
...
...
这样,每次您或其他人在struts.xml中添加操作时,只需将其放入正确的包中,它就会自动工作


最好尽可能保持拦截器操作不可知;)

您不能修改DTD,是吗?不,没有,除非您更改DTD,或者在构建或部署期间创建真正的配置文件。规范的方法是使用注释或命名约定。约定优于配置是一种非常常见的技术。与任何其他框架一样,关键是文档。我已经有了多个包来对操作进行逻辑分组(例如,所有涉及项目管理的内容都在项目包中)。我还有多个拦截器,不仅仅是登录示例。为了完成你的计划,我需要几十个包,比如Item\u Login\u NoMessage\u ClearCache\u StorePreferences包。在这种情况下你会怎么处理?你可以使用继承。。。例如,
logged\u in
/
not\u logged\u in
之间的间隔最大。您可能不需要在
not_logged_in
操作中自定义任何内容,但在这种情况下,您可以为这些单个操作配置缺少的拦截器。然后开始定义
登录的
包。当有不同的操作(比如至少3个)需要相同的功能时,添加扩展它的包,这在其他包中是不需要的。它不会产生“几十个”包,但通常(根据webapp的大小)会有4-5个组织良好的包。例如,我不会在包级别使用StorePreferences(假设它与MessageStore拦截器相关),在操作级别会更好。缓存是50%/50%。。。NoMessage已经是StorePreferences的一部分。。。etcOk明白了,我会尝试一些重构,看看是否可以管理。如果我有顾虑,我会给出反馈。thanksI对此进行了尝试,通过仔细构建一个相互扩展的包层次结构,我确实可以产生预期的结果。然而,我必须指出,出现了某种重复。比如,我是创建软件包项目->蓝色/项目->红色和用户->蓝色/用户->红色,还是创建软件包红色->项目,红色->用户和蓝色->项目,蓝色->用户(箭头表示扩展)?我不确定是否存在适合这种“矩阵”的方案。在本例中,它是一个2x2矩阵,但请想象一个更大的矩阵!