Struts 1表单Ajax提交参数映射及表单定义异常求助
Struts 1 Ajax表单提交:解决映射异常及参数绑定问题
一、先修复javax.servlet.jsp.JspException异常
这个异常的核心是表单与Action的映射未正确关联,按以下步骤排查:
- 检查
strut-config.xml配置
确保form-bean的name和action节点的name完全一致,path不要带.do后缀:<form-beans> <form-bean name="productMapForm" type="com.yourpackage.ProductMapForm"/> </form-beans> <action-mappings> <action path="/ProductMapAction" type="com.yourpackage.ProductMapAction" name="productMapForm" scope="request" validate="false"> <forward name="success" path="/result.jsp"/> </action> </action-mappings> - 检查JSP中的表单标签
若使用Struts的html:form,必须指定action为配置里的path值(不带.do),且name匹配form-bean的name:
纯HTML表单的话,<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <html:form action="/ProductMapAction" method="post" name="productMapForm" id="productForm"> <html:hidden property="yourProperty"/> <!-- 其他表单元素 --> </html:form>action要设为ProductMapAction.do,参数名必须和Form类属性名完全匹配。
二、Ajax参数与表单的自动映射
Struts 1会自动通过参数名与Form类属性名一致来绑定数据,无需额外配置,两种常见提交方式:
1. 手动构造参数提交(原生JS/jQuery)
直接传递和Form属性名对应的键值对:
$.ajax({ url: "${pageContext.request.contextPath}/ProductMapAction.do", type: "POST", data: { productId: "1001", productName: "Demo Product", // 其他属性,严格对应Form的getter/setter名称 }, success: function(res) { // 处理响应 } });
2. 序列化表单提交
如果页面已有Struts表单,直接序列化表单数据即可:
var formData = $("#productForm").serialize(); $.ajax({ url: "${pageContext.request.contextPath}/ProductMapAction.do", type: "POST", data: formData, success: function(res) { // 处理响应 } });
三、关键注意点
ProductMapForm必须继承org.apache.struts.action.ActionForm,且所有需要绑定的属性都有符合JavaBean规范的getXXX()和setXXX()方法(比如属性productId对应getProductId()/setProductId())。- Action中要正确强转Form对象:
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ProductMapForm productMapForm = (ProductMapForm) form; // 读取属性:productMapForm.getProductId() // 业务逻辑处理 return mapping.findForward("success"); } - 若需返回JSON等非页面响应,可直接输出响应内容,无需配置forward:
response.setContentType("application/json"); response.getWriter().write("{\"code\":200,\"msg\":\"success\"}"); return null;
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

