我使用此函数发出http get请求:
$scope.fetchResult = function() {
$http.get('search/result').success(function(getResult){
$scope.result = getResult;
});
};
这是后端功能:
@RequestMapping("/result")
public @ResponseBody String getResult() {
return searchService.getResult();
}
问题是它使用"将字符串打印到网页开头和结尾的字符也可以转义字符。我真的找不到这背后的任何逻辑。例如,如果string是:
String result = "Hello";
它不会向网页打印Hello,但它会打印" Hello"代替。另一个例子:
String result = "Found \"" + keyword + "\" '" + count + "' times at \"" + website + "\"";
它也打印转义字符。所以,让我们说关键字是关键字,计数是0,网站是http://stackoverflow.com结果以这种方式打印在网页上:
"Found \""keyword"\" '"0"' times at \""http://stackoverflow.com"\""
显然我希望:
Found "keyword" '0' times at "http://stackoverflow.com"
我该如何解决这个问题?这对我来说没有任何意义我是js和web开发的新手。
修改:如果我使用List<String>
代替String
并在html表单上执行此操作:
<p ng-repeat:"res in result">{{res}}<p>
有效。但我并不是真的想以这种方式使用它,因为我不需要列表但只需要一个字符串。
答案 0 :(得分:0)
Spring有一个名为Suffix Strategy的东西,它使框架能够直接从URL检查路径扩展,以确定输出内容类型。
您看到的编码结果是因为@RequestMapping
被/result.json
设置为.json
扩展名而导致结果作为Json对象返回。
要解决此问题,您有多种选择。
将返回的响应作为Javascript中的Json对象处理。
将@RequestMapping
值重命名为/result
。下面是一个代码示例:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@CrossOrigin(origins = "*")
@RequestMapping(value="/result")
public @ResponseBody String sayHello() {
String website = "http://stackoverflow.com";
int count = 4;
String keyword = "keyword";
return "Found \"" + keyword + "\" '" + count + "' times at \"" + website + "\"";
}
}
Javascript(此处添加接受标头是可选的)
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http) {
$http.get("/result",{headers: { 'Accept': 'text/plain' }})
.then(function(response) {
$scope.result = response.data;
});
});
</script>
将@RequestMapping
值保持为/result.json
,但使用WebMvcConfigurerAdapter
禁用后缀策略。下面是一个代码示例
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@CrossOrigin(origins = "*")
@RequestMapping(value="/result.json", method = RequestMethod.GET, produces="text/plain")
public @ResponseBody String sayHello() {
String website = "http://stackoverflow.com";
int count = 4;
String keyword = "keyword";
return "Found \"" + keyword + "\" '" + count + "' times at \"" + website + "\"";
}
}
WebMvcConfigurerAdapter类
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false)
.favorParameter(false)
.ignoreAcceptHeader(false)
.useJaf(false)
.defaultContentType(MediaType.TEXT_PLAIN);
}
}
的Javascript
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http) {
$http.get("/result.json",{headers: { 'Accept': 'text/plain' }})
.then(function(response) {
$scope.result = response.data;
});
});
</script>