我正在尝试使用struts2在jsp中实现ajax(避免表单提交)。我使用ajax代码通过url将请求传递给struts2动作。但struts2的反应并没有在日本出现。它显示“空”值。我使用AJAX在jsp中调用动作的代码如下所示。
function ajaxEditFunctionCall(){
var xmlHttp;
var url = "ajaxcall.action?stateName="+frm.stateName.value;
try{
xmlHttp=new XMLHttpRequest();
}catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}catch (e){
alert("Your browser does not support AJAX!");
return false;
}
}
}
alert(1);
xmlHttp.onreadystatechange = showMessage;
alert(2);
xmlHttp.open("GET", URL, true);
alert(3);
xmlHttp.send(null);
}
function showMessage() {
alert("Inside Show Message1");
alert(xmlhttp.readyState);
if(xmlhttp.readyState==4)
{
alert("Inside Show Message2&ReadyState4");
alert(xmlhttp.responseText);
}
}
Included following code in Action Class:
public String ajaxcall() throws Exception{
System.out.println("Inside AjaxCall");
String errorXml = "This is a Sample to Check";
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/html");
response.getWriter().write(errorXml);
return null;
}
Struts.xml中包含的代码:
<action name="ajaxcall" class="com.logic.action.CustomerAction" method="ajaxcall">
<result name="success" >/pages/customer/addCustomer.jsp</result>
</action>
我认为错误发生在action-response语句和struts.xml中。任何人都可以帮我解决这个问题。在此先感谢。
答案 0 :(得分:5)
我相信这个简单的代码应该适用于Ajax调用。下面的示例使用流结果,但您甚至可以使用JSON,XML或任何其他您想要的格式作为返回。 如果请求来自脚本/ ajax或任何其他方式,服务器端struts2没有考虑到帐户
public class TextResult extends ActionSupport {
private InputStream inputStream;
public InputStream getInputStream() {
return inputStream;
}
public String execute() throws Exception {
inputStream = new StringBufferInputStream("Hello World! This is a text string response from a Struts 2 Action.");
return SUCCESS;
}
}
Struts.xml文件
<action name="text-result" class="actions.TextResult">
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
你可以在JS上使用上面的设置。成功调用Action将返回“Hello World!这是来自Struts 2 Action的文本字符串响应。” string
这是一个完整的工作代码,作为Ajax调用
<head>
<script type="text/javascript">
var xmlHttp;
function ajaxEditFunctionCall(){
var URL = "welcomeAjax.action?stateName=State1";
try{
xmlHttp=new XMLHttpRequest();
}catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}catch (e){
alert("Your browser does not support AJAX!");
return false;
}
}
}
//alert(1);
xmlHttp.onreadystatechange = showMessage;
//alert(2);
xmlHttp.open("GET", URL, true);
//alert(3);
xmlHttp.send(null);
}
function showMessage() {
//alert("Inside Show Message1");
//alert(xmlHttp.readyState);
if(xmlHttp.readyState==4)
{
alert("Inside Show Message2&ReadyState4");
alert(xmlHttp.responseText);
}
}
</script>
</head>
<body>
<s:form id="form">
<input type="button" onclick="ajaxEditFunctionCall()"/>
</s:form>
<body>
以下是Action类的代码
private InputStream inputStream;
public InputStream getInputStream() {
return inputStream;
}
public String ajax() throws Exception {
inputStream = new StringBufferInputStream("Hello World! This is a text string response from a Struts 2 Action.");
return SUCCESS;
}
最后我们需要在struts.xml文件中定义关系
<action name="welcomeAjax" class="com.demo.WelcomeAction" method="ajax">
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
上面的代码工作得很好,希望能帮到你。
答案 1 :(得分:3)
此处,需要对JavaScript函数进行更正。当您说var xmlHttp
时,它在函数ajaxEditFunctionCall
内有一个范围,而不是showMessage
。此外,xmlhttp
中的showMessage()
与xmlHttp
中的ajaxEditFunctionCall
对象不同。因此,请将var xmlHttp
声明保持全局并进行更正。这是工作代码:
<script type="text/javascript">
var xmlHttp;
function ajaxEditFunctionCall(){
var URL = "ajaxcall.action?stateName=State1";
try{
xmlHttp=new XMLHttpRequest();
}catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}catch (e){
alert("Your browser does not support AJAX!");
return false;
}
}
}
//alert(1);
xmlHttp.onreadystatechange = showMessage;
//alert(2);
xmlHttp.open("GET", URL, true);
//alert(3);
xmlHttp.send(null);
}
function showMessage() {
//alert("Inside Show Message1");
//alert(xmlHttp.readyState);
if(xmlHttp.readyState==4)
{
alert("Inside Show Message2&ReadyState4");
alert(xmlHttp.responseText);
}
}
</script>
Java代码是:
public class CustomerAction extends ActionSupport implements ServletResponseAware {
HttpServletResponse response;
public String ajaxcall() {
System.out.println("Inside AjaxCall");
String errorXml = "This is a Sample to Check";
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
try {
response.getWriter().write(errorXml);
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
}
struts.xml是:
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<action name="ajaxcall" class="com.logic.action.CustomerAction" method="ajaxcall">
<result name="success" >/pages/customer/addCustomer.jsp</result>
</action>
</package>
</struts>
答案 2 :(得分:0)
以上示例完美无缺
转换为json对象使用
jsonobj=jQuery.parseJSON(req.responseText);