Struts2 注解模式的几个知识点

本文详细介绍了Struts2框架中的Result Type配置方法,特别是chain、redirect和redirectAction等类型的使用技巧,并提供了具体的代码示例。同时,还列举了一些常见的配置错误及解决方法。

在百度贴吧看到一个水贴,问大家搭建SSH需要多久。然后突然想到,自己在这段时间一直在看看《Core Java》,struts的东西也只是以前会简单的使用。于是就动手写一写。遇到了一些问题。委屈,还是不熟悉,只是会用,知道怎么配置怎么写action。现将遇到的问题记录如下。

  1. redirect , redirectAction的配置,有的时候,在使用这些result type的时候会需要跳转到不同的namespace中。那么在配置中该怎么写呢?
    package com.struts2.action;
    
    import org.apache.struts2.convention.annotation.Action;
    import org.apache.struts2.convention.annotation.Namespace;
    import org.apache.struts2.convention.annotation.ParentPackage;
    import org.apache.struts2.convention.annotation.Result;
    import org.springframework.stereotype.Controller;
    
    
    @ParentPackage(value="struts-default")
    @Namespace(value = "/admin")
    @Controller
    public class IndexAction{
    	private int i;
    
    	public int getI() {
    		return i;
    	}
    
    	public void setI(int i) {
    		this.i = i;
    	}
    
    	@Action(value = "/login", results = { 
    			@Result(name="sucess", location = "/index.jsp"),
    			@Result(name="chain", location = "chain",type="chain"),//同namespace下 chain
    			@Result(name="otherNsChain", type="chain",params= {
    					"namespace","/user","actionName","chain"
    			}),//不同namespace下
    			@Result(name="redirect",type="redirect",location="redirect.action"),//同namespace
    			@Result(name="otherNsRedirect",type="redirect",location="/user/redirect.action"),//不同namespace
    			@Result(name="redirectAction",type="redirectAction",params= {
    					"actionName","redirectAction"
    			}),//同namespace
    			@Result(name="otherNsRedirectAction",type="redirectAction",params= {
    					"namespace","/user","actionName","redirectAction"
    			})//不同namespace
    	})
    	public String login() {
    		String loc = "sucess";
    		
    		int j = getI();
    		switch (j) {
    		case 1:
    			loc="chain";
    			break;
    		case 2:
    			loc="redirect";
    			break;
    		case 3:
    			loc="redirectAction";
    			break;
    		case 4:
    			loc = "otherNsChain";
    			break;
    		case 5:
    			loc = "otherNsRedirect";
    			break;
    		case 6:
    			loc = "otherNsRedirectAction";
    		}
    		System.out.println(loc);
    		return loc;
    	}
    	
    	@Action(value="chain",results= {
    			@Result(name="chain",location="/chain.jsp")
    	})
    	public String chain() {
    		String loc = "chain";
    		System.out.println("IndexAction.chain()");
    		System.out.println("chain");
    		
    		return loc;
    	}
    	
    	
    	@Action(value="redirect",results= {
    			@Result(name="redirect",location="/redirect.jsp")
    	})
    	public String redirect() {
    		String loc = "redirect";
    		System.out.println("同namespace下的 redirect");
    		System.out.println("IndexAction.redirect()");
    		return loc;
    	} 
    	
    
    	@Action(value="redirectAction",results= {
    			@Result(name="redirectAction",location="/redirectAction.jsp")
    	})
    	public String redirectAction() {
    		String loc = "redirectAction";
    		System.out.println("IndexAction.redirectAction()");
    		System.out.println("同namespace下 的 redirectAction");
    		return loc;
    		
    	
    	}
    
    }
    

    package com.struts2.action;
    
    import org.apache.struts2.convention.annotation.Action;
    import org.apache.struts2.convention.annotation.Namespace;
    import org.apache.struts2.convention.annotation.ParentPackage;
    import org.apache.struts2.convention.annotation.Result;
    import org.springframework.stereotype.Controller;
    
    @ParentPackage(value="struts-default")
    @Namespace(value="/user")
    @Controller
    public class UserAction {
    
    	@Action(value="redirectAction",results= {
    			@Result(name="redirectAction",location="/otherNsRedirectAction.jsp")
    	})
    	public String redirectAction() {
    		String loc = "redirectAction";
    		System.out.println("UserAction.redirectAction()");
    		System.out.println("不同namespace下的redirectAction");
    		return loc;
    		
    	
    	}
    	
    	@Action(value="/chain",results= {
    			@Result(name="chain",location="/OtherNschain.jsp")
    	})
    	public String chain() {
    		String loc = "chain";
    		System.out.println("UserAction.chain()");
    		System.out.println("不同namespace下的chain");
    		return loc;
    	}
    	
    	
    	@Action(value="/redirect",results= {
    			@Result(name="redirect",location="/otherNsRedirect.jsp")
    	})
    	public String redirect() {
    		String loc = "redirect";
    		System.out.println("不同namespace下的 redirect");
    		System.out.println("UserAction.redirect()");
    		return loc;
    	} 
    	
    	
    	
    	
    }
    
    相信大家一定看到了两个class中定义了一样的action,不过看类的元数据,是不同的命名空间。这里比较重要(对我来说)的是
    	@Action(value = "/login", results = { 
    			@Result(name="sucess", location = "/index.jsp"),
    			@Result(name="chain", location = "chain",type="chain"),//同namespace下 chain
    			@Result(name="otherNsChain", type="chain",params= {
    					"namespace","/user","actionName","chain"
    			}),//不同namespace下
    			@Result(name="redirect",type="redirect",location="redirect.action"),//同namespace
    			@Result(name="otherNsRedirect",type="redirect",location="/user/redirect.action"),//不同namespace
    			@Result(name="redirectAction",type="redirectAction",params= {
    					"actionName","redirectAction"
    			}),//同namespace
    			@Result(name="otherNsRedirectAction",type="redirectAction",params= {
    					"namespace","/user","actionName","redirectAction"
    			})//不同namespace
    	})

    这里面results的配置,当result的type是chain的时候,如果是同一个命名空间,那么就可以直接写一个 action的name,如果加上后缀名比如.action的话struts就会报错,找不到execute()方法,如果不是同一个命名空间下,则需要添上params,params是一个String数组形式的容器,{“key1”,“value1”,“key2”,“value2”}以这种形式书写,关与params的更多信息可以参考xwork-core包里的
    com.opensymphony.xwork2.ActionChainResult.class
    。redirect的一致,如果在不同的命名空间,直接写命名空间+action的名字。 redirectAction的和chain差不多,但也有些许的区别。redirectAction没有location的配置,action的name需要在params里面配置,key为actionName,namespace也需要在params里面配置,key为namespace。更多的请参考struts-core下的
    org.apache.struts2.dispatcher.ServletActionRedirectResult.class
    。下面附上一些常用的几个result  type的类
     <result-types>
                <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> 
                <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
                <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
                <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
                <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
                <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
                <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
                <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
                <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
                <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
     </result-types>

    基本上常用的以上都有了,包括上面提到的chain和redirectAction。  其实这些在struts-default.xml  也可以找到  大笑。这些类里面有他们可接受配置的demo。

  2. 写2个在搭建环境的时候遇到的异常。
  • java.lang.NoSuchMethodException: com.struts2.action.IndexAction.execute() 可能是是配置有问题,比如我在上文说的在action的name中加上了后缀名或者也可能是在配置的时候action名前写了一个/ 。 @Result(name="chain", location = "chain",type="chain") 这句代码如果在location的chain前加一个/,可能也会造成这个异常。
  • 还有一个异常是 提示没有create方法,这个可能是因为struts里面rest的插件和action冲突了。
  • 注:以上两个异常不一定就是我说的问题引发的,真正的原因还是需要你自己去细细排查来确认的。


本项目构建于RASA开源架构之上,旨在实现一个具备多模态交互能力的智能对话系统。该系统的核心模块涵盖自然语言理解、语音转文本处理以及动态对话流程控制三个主要方面。 在自然语言理解层面,研究重点集中于增强连续对话中的用户目标判定效能,并运用深度神经网络技术提升关键信息提取的精确度。目标判定旨在解析用户话语背后的真实需求,从而生成恰当的反馈;信息提取则专注于从语音输入中析出具有特定意义的要素,例如个体名称、空间位置或时间节点等具体参数。深度神经网络的应用显著优化了这些功能的实现效果,相比经典算法,其能够解析更为复杂的语言结构,展现出更优的识别精度与更强的适应性。通过分层特征学习机制,这类模型可深入捕捉语言数据中隐含的语义关联。 语音转文本处理模块承担将音频信号转化为结构化文本的关键任务。该技术的持续演进大幅提高了人机语音交互的自然度与流畅性,使语音界面日益成为高效便捷的沟通渠道。 动态对话流程控制系统负责维持交互过程的连贯性与逻辑性,包括话轮转换、上下文关联维护以及基于情境的决策生成。该系统需具备处理各类非常规输入的能力,例如用户使用非规范表达或对系统指引产生歧义的情况。 本系统适用于多种实际应用场景,如客户服务支持、个性化事务协助及智能教学辅导等。通过准确识别用户需求并提供对应信息或操作响应,系统能够创造连贯顺畅的交互体验。借助深度学习的自适应特性,系统还可持续优化语言模式理解能力,逐步完善对新兴表达方式与用户偏好的适应机制。 在技术实施方面,RASA框架为系统开发提供了基础支撑。该框架专为构建对话式人工智能应用而设计,支持多语言环境并拥有活跃的技术社区。利用其内置工具集,开发者可高效实现复杂的对话逻辑设计与部署流程。 配套资料可能包含补充学习文档、实例分析报告或实践指导手册,有助于使用者深入掌握系统原理与应用方法。技术文档则详细说明了系统的安装步骤、参数配置及操作流程,确保用户能够顺利完成系统集成工作。项目主体代码及说明文件均存放于指定目录中,构成完整的解决方案体系。 总体而言,本项目整合了自然语言理解、语音信号处理与深度学习技术,致力于打造能够进行复杂对话管理、精准需求解析与高效信息提取的智能语音交互平台。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值