1

在我的 Grails Web 应用程序中,我有一个弹出对话框,允许我输入某种类型的自然语言表达式,用于在应用程序中执行某些操作。

我目前正在用 groovy 实现解析器,并且想知道如何创建错误消息并将它们返回给客户端。

我正在考虑使用<g:formRemote>它将使用ajax将文本字符串发送到解析器,并且在成功解析字符串后,它将执行应用程序中的操作,例如将用户添加到项目中,通常后跟重定向到一个新页面,比如说向用户展示项目的一部分。如果解析器接收到它不期望/识别的令牌,或者如果字符串不遵循正确的语法,我将能够创建一条错误消息并将其发送回客户端,允许用户尝试另一个命令。

到目前为止,我的代码看起来像这样..

在我的控制器中接收 ajax 请求

def runTemp()
{
    def tokenizer = new Tokenizer()
    def posTagger = new PartOfSpeechTagger()

    def words = tokenizer.getTokens("add user");
    def taggedWords = posTagger.tagWords(words)

    taggedWords.each{
        println"${it.word} : ${it.partOfSpeech}"
    }       
}

我的 PartOfSpeechTagger.groovy 看起来像

package uk.co.litecollab.quickCommandParser

class PartOfSpeechTagger {

def lexicons = [
    //VERBS
    'add': PartOfSpeech.VERB,
    'new': PartOfSpeech.VERB,
    'create': PartOfSpeech.VERB,
    'view': PartOfSpeech.VERB,
    'delete': PartOfSpeech.VERB,
    'logout': PartOfSpeech.VERB,
    'remove': PartOfSpeech.VERB,
    'chat': PartOfSpeech.VERB,
    'accept': PartOfSpeech.VERB,
    'active': PartOfSpeech.VERB,
    'suspend': PartOfSpeech.VERB,
    'construct': PartOfSpeech.VERB,
    'close': PartOfSpeech.VERB,
    'add': PartOfSpeech.VERB,

    //NOUNS
    'project': PartOfSpeech.NOUN,
    'user': PartOfSpeech.NOUN,
    'task': PartOfSpeech.NOUN,
    'chat': PartOfSpeech.NOUN,
    'conversation': PartOfSpeech.NOUN,

    //DETERMINERS
    'a': PartOfSpeech.DETERMINER,
    'the': PartOfSpeech.DETERMINER,

    //PREPOSITIONS
    'to': PartOfSpeech.PREPOSITION,
    'from': PartOfSpeech.PREPOSITION,
    'for': PartOfSpeech.PREPOSITION,
    'with': PartOfSpeech.PREPOSITION    
    ]


//constructor
def PartOfSpeechTagger()
{

}

def tagWords(String[] words)
{
    def taggedWords = [] as ArrayList
    words.each{
        //removing the use of 'it' due to nested closures
        println"word to search for : ${it}"
        def word = it
        if(inLexicons(word))
        {
            println"word :: ${it}"
            taggedWords.add(
                new TaggedWord(
                    lexicons.find{it.key == word}.key, 
                    lexicons.find{it.key == word}.value)
                )           
        }
        else
        {
            /* 
             * handle errors for not finding a word?
             */
        }
    }   

    return taggedWords
}

def inLexicons(key)
{
    return lexicons.containsKey(key)
}   
}

您可以tagWords在我希望能够向客户报告不期望提供的单词的方法中看到。

4

1 回答 1

0

搞定了,

在控制器中

render(status: 400, text: "the message")

然后以我的远程形式

onFailure="doSomething(XMLHttpRequest)"

然后在javascript中通过

XMLHttpRequest.responseText
于 2013-03-14T08:39:50.057 回答