当前位置: 首页 > 知识库问答 >
问题:

如何在与grails中的请求(REST调用)位于同一页面的gsp上正确呈现响应

夏嘉德
2023-03-14

我是grails和groovy的新手。我正在尝试找出如何在相同的gsp中从grails控制器中的操作中呈现响应-但在gsp的不同部分-作为接受请求的gsp(在这种情况下是Web表单gsp页面)?

欢迎任何链接或turorials或直接回复“do this”。

========= background with my code attempt) =========

这是我正在使用的代码。这是一个Grails应用程序,我在其中使用了一个引导模板(当然可以在互联网上免费获得)。

现在,功能的实际代码本身起作用了。我的问题是:

我有一个gsp页面,使用css模板和另一个gsp模板进行布局(这来自引导主题)。我可以在我的gsp页面中使用以下代码(片段)以gsp css tempate开始页面:

<g:layoutBody/>

这使我可以调用此gsp文件中的呼叫控制器代码来请求:

<body>
<g:form name="form" controller="apiStart" id="form">
    <div><g:select name="protocolType" value="restCall" from="${["-select-", "GET", "POST", "PUT", "DELETE"]}"/> &nbsp <label>URL: </label><g:textField name="url" value="${url}" />
    &nbsp <label>username: </label><g:textField name="userName" value="${userName}" />  &nbsp <label>password: </label><g:textField name="passWord" value="${passWord}" /></div>

    %{--<div class="text-field"><label>URL: </label><g:textField name="url" value="${url}" /></div>--}%
    %{--<div class="text-field"><label>username: </label><g:textField name="userName" value="${userName}" /></div>
    <div class="text-field"><label>password: </label><g:textField name="passWord" value="${passWord}" /></div>--}%
    <br>
    <div><label>Use Advanced Parameters?</label><g:checkBox name="useAdvParms" value="${false}" /></div>
    <div class="text-field"><label>Header1: </label><g:textField name="header1" value="${header1}" /> &nbsp <label>Value1: </label><g:textField name="value1" value="${header2}" /></div>
    %{--<div class="text-field"><label>Value1: </label><g:textField name="value1" value="${header2}" /></div>--}%
    <div class="text-field"><label>Header2: </label><g:textField name="header2" value="${header3}" /> &nbsp <label>Value2: </label><g:textField name="value2" value="${header4}" /></div>
    %{--<div class="text-field"><label>Value2: </label><g:textField name="value2" value="${header4}" /></div>--}%
    <br>
    <div class="submit"><g:actionSubmit value="Submit" action="save"/></div>
</g:form>
</body>

然后是响应的gsp代码:

<body>
<h3>API Test Results</h3>
API Tested: ${apiStart.url}, Response: ${apiStart.response3}
<br>
%{--<g:textArea name="myField" value="myValue" rows="20" cols="100"/>--}%
<div class="textarea"><label>Output</label><br><g:textArea name="myField" value="${apiStart.result3}"  />
</div>
%{--Responce Code: ${apiStart.response3}<br>--}%
%{--Response: <br> ${apiStart.result3} <br>--}%

</body>

我的问题是:它作为单独的页面工作得很好。我想将请求的结果呈现在与调用请求相同的页面上。

我假设grails中的模板是实现它的方法;但是当我尝试将模板插入到代码的那一部分时,我得到了一个Java的空指针异常。

这是模板gsp代码:

<div>
    API Tested: ${apiStart.url}, Response: ${apiStart.response3}
    <br>
    %{--<g:textArea name="myField" value="myValue" rows="20" cols="100"/>--}%
    <div class="textarea"><label>Output</label><br><g:textArea name="myField" value="${apiStart.result3}"  />
    </div>
    %{--Responce Code: ${apiStart.response3}<br>--}%
    %{--Response: <br> ${apiStart.result3} <br>--}%
</div>

=======更新:添加控制器代码===========控制器:

package hellograils

import org.springframework.http.HttpMethod
import org.springframework.web.client.RestTemplate

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;

import org.springframework.stereotype.Component;
import java.util.Base64;
import java.util.Map;

import static javax.xml.bind.DatatypeConverter.parseString;

class ApiStartController {

    def index() {

    }

    def save() {
        def apiStart = new ApiStart(params)
        apiStart.save()
        render (view: "apiStart", model: [apiStart: apiStart])

        System.out.println(apiStart.url);
        System.out.println(apiStart.passWord);
        System.out.println(apiStart.userName);

        RestTemplate restTemplate = new RestTemplate();

        System.out.println ("URI under Test is: " + String.valueOf(apiStart.url) + ". \n" + "Please stand by for results ... \n \n ");

        //String linkUT = apiStart.url;


//        apiStart.result3 = restTemplate.exchange(apiStart.url, HttpMethod.GET, null, String.class).getBody();
//        apiStart.response3 = restTemplate.exchange(apiStart.url, HttpMethod.GET, null, String.class).getStatusCode();



        if (apiStart.protocolType == "GET") {

            apiStart.result3 = restTemplate.exchange(apiStart.url, HttpMethod.GET, null, String.class).getBody();
            apiStart.response3 = restTemplate.exchange(apiStart.url, HttpMethod.GET, null, String.class).getStatusCode();
            render(view: "apiStart", model:[apiStart: apiStart])

            System.out.println(apiStart.protocolType);
            System.out.println(apiStart.result3);
            System.out.println(apiStart.response3);

        }

        else if (apiStart.protocolType == "POST") {

            //apiStart.result3 = restTemplate.exchange(apiStart.url, HttpMethod.POST, request, String.class).getBody();
            apiStart.result3 = restTemplate.execute(apiStart.url, HttpMethod.POST, null, String.class).getBody();
            apiStart.response3 = restTemplate.exchange(apiStart.url, HttpMethod.POST, null, Map.class).getStatusCode();
//            apiStart.result3 = restTemplate.exchange(apiStart.url, HttpMethod.POST, null, String.class).getBody();
//            apiStart.response3 = restTemplate.exchange(apiStart.url, HttpMethod.POST, null, String.class).getStatusCode();
            render(view: "apiStart", model:[apiStart: apiStart])

            System.out.println(apiStart.protocolType);
            System.out.println(apiStart.result3);
            System.out.println(apiStart.response3);

        }

        else if (apiStart.protocolType == "PUT") {

            render(view: "apiStart", "coming soon ....")

            System.out.println(apiStart.protocolType);
            System.out.println(apiStart.result3);
            System.out.println(apiStart.response3);

        }

        else if (apiStart.protocolType == "DELETE") {

            render(view: "apiStart", "coming soon ....")

            System.out.println(apiStart.protocolType);
            System.out.println(apiStart.result3);
            System.out.println(apiStart.response3);

        }

    }
}

=============控制器代码结束==================

这是域控制器代码:

================ 域模型代码 ==========================

域:

package hellograils

class ApiStart {

    String url
    String userName
    String passWord
    String result3
    String response3
    String header1
    String header2
    String value1
    String value2
    String protocolType

//    static constraints = {
//    }
}

================域结束================

有人能给我建议并告诉我最好的方法吗?

谢谢。

ironmantis7x

共有1个答案

周阳波
2023-03-14

在gsp中包含结果窗格,但用g: if标签包装它。提供一个标志变量来确定grails是否呈现输出的该部分。

<g:if test="${apiStart != null}"> 
  <div class="textarea">
    <label>Output</label><br>
    <g:textArea name="myField" value="${apiStart.result3}"  />
  </div>
</g:if>

在编辑方法中,将apiStart定义为:

def apiStart = params.apiStart

最初渲染编辑视图时,不应显示“结果”窗格。

在save方法中,执行任何操作,定义apiStart映射,填充它,并重定向到将apiStart作为参数传递的编辑方法。

redirect(view:'edit', params:[apiStart:apiStart])

或者类似的。没有看到你的控制器代码。。。

 类似资料:
  • 我想在Spring中创建一个符合REST的endpoint。endpoint应该允许分页。 请求非常简单,是否访问url/资源?页码=1 我发现了两种返回数据的大方法: 返回包含以下内容的自定义对象: 此方法的问题是它不再返回资源,而是返回资源的包装器。 这解决了资源问题,但它使endpoint更难使用,这是违反直觉的,因为它也需要额外的工作来实现。 我想知道,什么标准被更广泛地使用,为什么?对此

  • 问题内容: 我是ajax的新手。我试图将请求从我的gsp页面发送到控制器操作。但是我失败了。它没有调用控制器操作,并且页面正在重新加载。任何人都可以看看这个并提供帮助。这是我的以下页面>>> 这是我的控制器动作>>> 问题答案: 您可以尝试以下方法: 或这一个: 根据要求完成ajax调用:

  • 当我将grails(2.4.0)项目war部署到weblogic 12.1.2中时,我面临一个问题。当部署到tomcat中时,战争效果非常好。问题是,当战争部署在weblogic中时。一旦用户登录,使用LDAP的身份验证过程也可以正常工作。接下来,应该使用GSP页面呈现主页,但weblogic似乎无法呈现GSP页面。它正在浏览器上运行404。 一旦我登录到应用程序,如果我直接使用浏览器中的任何UR

  • 我正在尝试使用Spring Security性和AngularJS设置默认SuccessUrl,但是成功登录后,html页面将加载到网络中,但没有显示。这是我的安全配置 但是,我仍然显示登录页面,而不是hello.jsp页面。登录的Angular服务: 有人知道为什么吗?

  • 问题内容: 我正在尝试使用Electron(以前是Atom Shell)为Twitter写一个包装。 我的文件(它看起来与“ Hello World ”示例几乎相同,只是在一个地方进行了更改): 我尝试在此之后立即调用函数,但是它不执行。 我了解该文件就像应用程序的服务器端一样,但是问题是…如何在页面上调用JavaScript函数?我应该在哪里编写代码? 例如,我要执行以下操作: 问题答案: 我已

  • 我正在用空手道测试做一些测试。 首先是一个职位,期待一个201和一个位置。 第二,使用位置from response来执行get。 有人知道我怎么用空手道吗? 下面的代码是我的尝试,在许多其他代码之后。 但是我得到了: 我不明白为什么。 [编辑] 经过彼得的建议,我感谢! 打印返回: 08:59:33.610[主]信息网。凭直觉。空手道-[打印][”https://www.test.com/enp