2016-11-09 49 views
0

我对于春季启动非常新,目前我陷入困境。在春季启动时从另一个控制器调用控制器

我有2种控制器方法

IndexController.java

@RequestMapping(value="/openxml", params = "btnTransform", method = RequestMethod.POST) 
    public String transformXml(HttpServletRequest request, Model model) { 
     try { 
      String fileContent = request.getParameter("code1").replaceAll("&", "&"); 
      String fileName = request.getParameter("fileName"); 
      InputStream is1 = IOUtils.toInputStream(fileContent,StandardCharsets.UTF_8); 
      InputStream is2 = IOUtils.toInputStream(fileContent,StandardCharsets.UTF_8); 
      String htmlString=xmlOperation.simpleTransform(is1, fileName); 
      if (htmlString.equals("")){ 
       model.addAttribute("message", "Please validate your XML!!"); 
      }    
      model.addAttribute("htmlString",StringEscapeUtils.escapeHtml4(htmlString)); 
      model.addAttribute("fileContent", fileContent); 
      model.addAttribute("fileName",fileName); 
     } catch (Exception e) { 
      logger.error(e.getMessage()); 
      System.out.println(e.getMessage()); 
     } 
     return "greeting"; 
    } 

    @RequestMapping(value="/updatexpath", method=RequestMethod.POST, produces = "application/json") 
     @ResponseBody 
     public String updateXPath(@RequestParam("xml") String xml, @RequestParam("xPath") String xPath, @RequestParam("editedText") String editedText){ 
      xml=xml.replaceAll("&", "&"); 
      InputStream is = IOUtils.toInputStream(xml, StandardCharsets.UTF_8); 
      String editedXml=xmlOperation.updatePara(is, xPath, editedText); 
      editedXml=editedXml.replaceAll("&", "&"); 
      return editedXml; 
} 

我在做什么这里是调用从阿贾克斯updateXPath方法,并得到editedXml和更新文本区域。之后,我想调用transformXml方法(没有任何按钮单击)。可能吗?如果是的话,怎么样?如果没有,任何工作?

任何帮助将不胜感激...

+0

你需要把XML在textarea的?因为如果你在响应后立即转到另一个控制器,你也可以在你的控制器中使用重定向到'transformXml'并在里面给出'editedXml'。 – Patrick

+0

是@Patrick,我确实需要在textarea中使用xml –

回答

0

一种解决方案可能是在你的控制器使用重定向。所以你可以从一个@RequestMapping跳到另一个。

@Controller 
public class DemoController { 

    @RequestMapping("/") 
    public String index(){ 
     String xml = "simpleXML"; 

     return "redirect:/transformXML?xml=" + xml; 
    } 

    @RequestMapping("/transformXML") 
    public String transformXML(@RequestParam("xml") String xml){ 
     System.out.println(xml); 
     //add xml to your model for the textarea. 
     //transform your xml 
     return xml; 
    } 

} 

击中​​将创建一个字符串,然后重定向到http://localhost:8080/xml包括你所需要的参数中。

如果它足以让你在transform之后在文本区域显示editedXml,那么你可以妄下决断。

+0

我有一个很大的xml,我不想在url中传递它。此外,我试过这个,它不工作。 –

0

有很多方法给你。

第一种方法。在春季使用Async支持。异步支持可以将Runnable添加到执行程序,以便您可以在请求中返回响应并启动任务。这里是async guide。并把所有的transformXml代码放到一个service

第二种方法。只需使用JavaScript来发送另一个请求(我会用这种方式)

就像:

1. send request of updatexpath 
2. wait until server response xml 
3. update dom and put your xml to textarea 
4. send request of transformXml 
+0

我试过这个..这种方法的问题是,当发送请求转换时,我得到旧数据(不是更新的数据),因为只有DOM被更新,而不是源。 –

+0

通过阅读你的代码,我不知道你打算做什么。你能告诉我这个代码的原始要求是什么?我想建议你阅读一些关于SRP(单一责任原则)的文章https://en.wikipedia.org/wiki/Single_responsibility_principle – BeeNoisy