I have a simple page with validation that I got working with a conventional submit and action.
I'm now trying to explore doing an Ajax form submit, and getting a JSON response. I'm using YUI on the client side. I'd like to see if I can get similar data in the JSON response that I would in a normal submit, for instance, with field errors. There are a couple points I could use some help with, not necessarily related to Ajax or JSON. Please don't hesitate to tell me if I'm doing something else wrong, or something I should be aware of. My first attempt actually did execute the Ajax request, and got the response, but it wasn't JSON. The responseText was just the HTML of my source JSP, which is also the value of my "input" result. I tried setting up the JSON action without an "input" result, but it seemed to complain if I didn't have that. I would have thought the "input" parameter wouldn't be relevant in a Ajax/JSON action. If I filled in all the required fields so it didn't result in any field errors, the response was JSON, and it was reasonable (although setting "wrapWithComments" didn't appear to have any effect). I guess there's no automatic provision for reporting field errors in a JSON response, so I guess I'll have to build something like that by hand? Note that I tried to enable the logging interceptor, but I didn't see any output from it. I have a single action that I was intending to use to handle both the ajax and non-ajax submit. I tried to make it use two different action names in the form, but it seemed to have trouble with that. I noticed in the generated HTML, I had this in the HTML for the form tag: onsubmit="return YAHOO.strutsform.submitform();; return true;" I'm not sure if that "return true;" will cause me trouble, as I'm trying to bypass the normal form submission. I think by returning false from "submitform", I achieved that, however. I'll include here the relevant files. Please comment where appropriate. Thanks for your input. ---form.jsp------------ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Struts Form</title> <link rel="stylesheet" href="${pageContext.request.contextPath}/struts/css_xhtml/styles.css" type="text/css"> <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/style/form.css"> <!-- css --> <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/yui/reset-fonts-grids/reset-fon ts-grids.css"> <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/yui/button/assets/skins/sam/but ton.css"> <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/yui/logger/assets/skins/sam/log ger.css"> <!-- js --> <script type="text/javascript" src="${pageContext.request.contextPath}/yui/utilities/utilities.js"></sc ript> <script type="text/javascript" src="${pageContext.request.contextPath}/yui/button/button-debug.js"></sc ript> <script type="text/javascript" src="${pageContext.request.contextPath}/yui/json/json-debug.js"></script > <script type="text/javascript" src="${pageContext.request.contextPath}/yui/logger/logger-debug.js"></sc ript> <script type="text/javascript" src="${pageContext.request.contextPath}/scripts/strutsform.js"></script> </head> <body class="yui-skin-sam"> <h4>Enter your data</h4> <!-- onsubmit="return YAHOO.strutsform.submitform();" --> <s:form id="form" action="Form" onsubmit="return YAHOO.strutsform.submitform();"> <s:textfield name="lastName" label="Last Name"/> <s:textfield name="firstName" label="First Name"/> <button id="formsubmit" type="submit">Submit</button> </s:form> <script type="text/javascript"> YAHOO.util.Event.onDOMReady(YAHOO.strutsform.init); </script > </body> </html> --------------- ---struts.xml------------ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "struts-2.0.dtd" > <struts> <constant name="struts.devMode" value="true" /> <package extends="struts-default" name="main" namespace="/main"> <action name="main"> <result>/form.jsp</result> </action> <action name="Form" class="com.wamu.strutsform.FormAction"> <result name="input">/form.jsp</result> <result>/form.jsp</result> </action> </package> <package extends="json-default" name="json" namespace="/json"> <action name="Form" class="com.wamu.strutsform.FormAction" method="jsonSubmit"> <interceptor-ref name="logger"></interceptor-ref> <interceptor-ref name="completeStack"></interceptor-ref> <result type="json"> <param name="wrapWithComments">true</param> </result> <result name="input">/form.jsp</result> </action> </package> </struts> --------------- ---FormAction.java------------ package com.wamu.strutsform; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.opensymphony.xwork2.ActionSupport; public class FormAction extends ActionSupport { private static final Log logger = LogFactory.getLog(FormAction.class); private String lastName; private String firstName; public String getLastName() { return lastName; } public String getFirstName() { return firstName; } public void setLastName(String lastName) { this.lastName = lastName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String execute() { logger.info("execute."); return SUCCESS; } public String jsonSubmit() { logger.info("jsonSubmit."); return SUCCESS; } } --------------- ---strutsform.js------------ /** * @author u166705 */ YAHOO.namespace("strutsform"); YAHOO.widget.Logger.enableBrowserConsole(); var $E = YAHOO.util.Event; var $D = YAHOO.util.Dom; YAHOO.strutsform.init = function () { $E.onContentReady("formsubmit", function() { var submitButton = new YAHOO.widget.Button("formsubmit"); }); }; YAHOO.strutsform.submitform = function() { var callback = { success: function(obj) { YAHOO.log("obj.responsetext[" + obj.responseText + "]"); }, failure: function(obj) { YAHOO.log("obj.responseText[" + obj.responseText + "]"); } }; YAHOO.util.Connect.setForm(document.getElementById("form")); YAHOO.util.Connect.asyncRequest("POST", "/strutsform/json/Form.action", callback, null); return false; }; ---------------