【问题标题】:Unable to get value submitted from Jquery post in Struts2 action无法在 Struts2 操作中获取从 Jquery 帖子提交的值
【发布时间】:2012-07-19 06:22:16
【问题描述】:

我是新的 struts,我不确定我在这里缺少什么。当我提交此表单时,struts 操作类中的所有字段都为空。我添加了一个拦截器“adminHomeInterceptor”来检查用户是否是管理员,当我删除该拦截器引用时这工作正常。但是我必须检查所有请求用户是否是管理员,所以不能删除那个拦截器。任何帮助将不胜感激。

这是我的jsp。

    <s:form id="vendorRegister" action="addvendor" method="post" theme="simple">
        <label for="username" class="formLabel">Username/Email</label>
        <s:textfield name="userName" id="txtUname" cssClass="small ui-widget-content ui-corner-all" /><br />
        <label for="phone" class="formLabel">Phone</label>
        <s:textfield name="phone" id="txtPhone" cssClass="small ui-widget-content ui-corner-all" /><br />
        <label for="mobile" class="formLabel">Mobile</label>
        <s:textfield name="mobile" id="txtMobile" cssClass="small ui-widget-content ui-corner-all" /><br />
    <s:submit id="btnRegister" cssClass="button ui-state-default ui-corner-all" value="Add Vendor" />
</s:form>

这是一个动态加载的表单。

$("#btnRegister").live("click",(function(event){
    event.preventDefault();
    var uname = $( "#txtUname" ),
    phone =  $("#txtPhone"),
    mobile = $("#txtMobile"),   
    if ( // Validation Codes ) {
        $("#btnRegister").attr("disabled", true);
        var url = "../addvendor";
        $.post( url , $("#vendorRegister").serialize(), function(data){
            alert("inside");
        });
    }
}));

我的 Strust2 动作类

public class VendorAction extends ActionSupport{

    private int phone;
    private long mobile;
    private String userName;

    public int getPhone() {
         return phone;
    }
    public void setPhone(int phone) {
        this.phone = phone;
    }
    public long getMobile() {
        return mobile;
    }
    public void setMobile(long mobile) {
        this.mobile = mobile;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String recordVendor(){
        System.out.println(userName);
        System.out.println(mobile);
        return "success";
    }
}

这是我的 struts.xml 文件

     <package name="admin" namespace="/admin" extends="json-default">
    <interceptors>
        <interceptor name="adminHomeInterceptor" class="org.admin.interceptors.AdminHomeInterceptor" />
    </interceptors>
    <action name="addvendor" class="org.vendor.action.VendorAction" method="recordVendor">
        <interceptor-ref name="adminHomeInterceptor" />
        <result type="json" /> 
    </action>
</package>

【问题讨论】:

    标签: java jquery jakarta-ee struts2


    【解决方案1】:

    只为您的操作配置了一个拦截器,因此没有其他拦截器应用于请求。

    <action name="addvendor" class="org.vendor.action.VendorAction" method="recordVendor">
      <interceptor-ref name="adminHomeInterceptor" />
      <result type="json" /> 
    </action>
    

    相反,您必须创建一个拦截器堆栈,然后为您的操作(或所有操作)引用它。

    示例

    <interceptors>
      <interceptor name="adminHomeInterceptor" class="org.admin.interceptors.AdminHomeInterceptor" />
      <interceptor-stack name="exampleDefaultStack">
        <interceptor-ref name="exception"/>
        <interceptor-ref name="adminHomeInterceptor"/>
        <interceptor-ref name="alias"/>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>
        <interceptor-ref name="scopedModelDriven"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="multiselect"/>
        <interceptor-ref name="staticParams"/>
        <interceptor-ref name="actionMappingParams"/>
        <interceptor-ref name="params">
          <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
        </interceptor-ref>
        <interceptor-ref name="conversionError"/>
        <interceptor-ref name="validation">
          <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
          <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="debugging"/>
      </interceptor-stack>
    </interceptors>
    

    然后将interceptor-ref 更改为:

    <interceptor-ref name="exampleDefaultStack"/>
    

    或者,您可以默认将此堆栈应用于所有操作,方法是在包部分中包含以下内容:

    <default-interceptor-ref name="exampleDefaultStack"/>
    

    【讨论】:

    • 谢谢,效果很好。我还有一个疑问,我们是否应该在每个动作中引用所有这些拦截器。
    • 不,通常您应该定义一个堆栈(每个包)并将其设为该包中所有操作的默认值。如果您有多个“组”操作,请将它们分成 struts.xml 中的包。您可以为单个操作创建自定义拦截器堆栈,但这应该很少发生。
    【解决方案2】:

    您在使用struts2-json 插件吗? 如果你正在使用它。 你必须包括

    <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" />  in struts.xml
    

    并在包级别定义这样的结果类型 json

    <result-type name="json" class="org.apache.struts2.json.JSONResult" default="false" /> 
    

    否则,getter/setter 将无法与您通过 json 发送的 JSOn 一起使用。

    【讨论】:

    • &lt;result-type name="json" class="org.apache.struts2.json.JSONResult" default="false" /&gt; 不应与您的 &lt;action&gt; 标签一起,而是在您的 &lt;package&gt; 中。
    • 对不起,伙计们,我在那个动作中有一个拦截器,当我删除那个拦截器时它工作正常。但是我需要那个拦截器来检查用户是否是管理员,所以不能删除那个拦截器。
    • 查看我的回答,了解您的自定义拦截器为何会破坏此问题以及如何解决此问题。
    • @nmc 。我的意思只是包装级别。我没有说清楚是不好的。 !
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2014-09-20
    • 2012-08-23
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多