在Struts 2中使用自动完成后,没有为操作定义结果

时间:2014-10-14 12:05:53

标签: java jsp struts2 autocomplete struts2-jquery

我收到的错误是没有为结果输入的操作定义结果。直到我使用Struts2自动完成时才出现。

这是我的自动填充代码:

<s:form class="form-horizontal" style="margin:0 auto" role="form" theme="simple" action="Reports_open_cases">
 <h4>Open Cases</h4>

  ..some controls here

<div class="form-group">              
<div class="col-xs-12 col-sm-4 col-md-4"></div>
 <div class="col-xs-12 col-sm-4 col-md-4" >
 <s:url id="advURL" action="xyz_action"/>    
<sj:select 
 id="abc"  
 name="abc" selectBoxIcon="true"
 href="%{advURL}" 
 list="list_abc" 
 listValue="name" 
 listKey="Id "  
 autocomplete="true"  
 cssClass="form-control"
/>  
</div>

<div class="col-xs-12 col-sm-12 col-md-12 pull-right" style="text-align:right"><br>
     <div class="modal-footer" style="margin:0px; padding:10px 0px 10px">
             <button class="btn btn-success"  type="submit">Generate</button>
            &nbsp;&nbsp;        
            <button class="btn btn-default"  type="Reset">Reset</button>
      </div>
</div>
</s:form>     

我的struts.xml(行动):

<constant name="struts.devMode" value="true" />
<constant name="struts.multipart.maxSize" value="20000000" />      
<package name="login" extends="struts-default,json-default" namespace="/">
    <interceptors>
        <interceptor class="vercelon.actions.LoginInterceptor" name="loginInterceptor">
        </interceptor>    
        <interceptor-stack name="loginStack">
        <interceptor-ref name="loginInterceptor"/>
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="fileUpload"><param name="maximumSize">10485760</param>
  </interceptor-ref>
    </interceptor-stack>  

    </interceptors>    

<action name="Reports_open_cases" class="vercelon.actions.Report" 
                                 method="Generate_OpenCases">
    <result name="success">/CMS/Reports_OpenCases.jsp</result>
    <result name="ERROR">/Error.jsp</result> 
    <result name="input">/CMS/Reports_Menu.jsp</result>
</action> 

<action name="xyz_action" class="vercelon.actions.Report" method="loadreports">
        <result name="success" type="json"></result>
    </action>

除了将下拉菜单替换为自动填充功能之外,我还没有做出任何其他更改。当我向struts.xml添加输入时,它不会显示此错误。但是,对我的表单提交的操作也不起作用。 添加此自动填充功能后,我不明白需要更改的位置。请帮忙。

1 个答案:

答案 0 :(得分:2)

当您从视图层调用某个操作时,拦截器会在执行操作之前运行。

似乎您的操作使用包含validationworkflow拦截器的默认堆栈。第一个拦截器对扩展ActionSupport的操作执行验证,第二个检查是否存在返回INPUT结果的错误。

但是如果你对动作类使用了一些-validation.xml或基于注释的验证,那么映射该类方法的每个动作都会被上面的拦截器验证,除非你已经配置了这些拦截器来排除方法,或者使用基于前缀的验证方法,或者应用跳过验证注释。

所有这些情况都是为了避免为某些操作尚未使用的代码运行验证器,并且需要避免它们或重新配置拦截器堆栈以在没有这些拦截器的情况下运行。

在您的情况下,返回json结果的操作不需要验证字段而不是term。如何配置和覆盖操作的拦截器配置,请参阅:How to get result on same page why input is required?

使用Select Box with JSON Result as Autocompleter的工作示例 The actions source code used in the example