#json #jsp #spring-mvc
#json #jsp #spring-mvc
Вопрос:
Можем ли мы вернуть объект JSON из spring controller и записать этот объект JSON на странице jsp. Ниже приведена моя страница jsp:
<script type="text/javascript">
dojo.require("dojox.grid.EnhancedGrid");
dojo.require("dojox.data.QueryReadStore");
dojo.ready(function(){
mystore=new dojo.data.ItemFileReadStore({url:"<%=request.getContextPath()%>/showData.htm"});
var layout= [
{field: 'ID', name: 'SID',formatter: hrefFormatter,datatype:"number" },
{field: 'SPREAD',name: 'SPREAD',autoComplete: true}
]
var grid = new dojox.grid.EnhancedGrid({
id: 'myGrid',
----
});
</script>
Контроллер:
@RequestMapping(value = "/showData", method = RequestMethod.GET)
public void getSTIDData(HttpServletRequest request,
HttpServletResponse response, @ModelAttribute VINDTO vinData,
BindingResult beException) throws IOException {
try {
......
......
XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
}
});
xstream.alias("items", com.loans.auto.DTO.VINRequestDTO.class);
String str = xstream.toXML(vinListCopy);
StringBuffer rowData = new StringBuffer();
rowData.append("{'numRows':").append(vinListCopy.size())
.append(",'items':").append(str).append("}");
PrintWriter out = response.getWriter();
out.print(rowData);
}
Вместо getSTIDData(..), возвращающего void , я хочу, чтобы этот метод возвращал объект ModelAndView, но когда я возвращаю объект ModelAndView, данные страницы jsp не загружаются, и в нем говорится «Данные не найдены». Пожалуйста, предложите. Спасибо.
Ниже приведено исключение, сгенерированное при использовании Gson
SyntaxError {stack: "SyntaxError: Unexpected identifier↵ at Object.d… at signalWaiting (/MYWebProject/dojo/Deferred.js:28:4)", message: "Unexpected identifier"}
message: "Unexpected identifier"
stack: "SyntaxError: Unexpected identifier↵ at Object.dojo.fromJson (/MYWebProject/dojo/_base/json.js:26:23)↵ at Object.dojo._contentHandlers.dojo.contentHandlers.json (/MYWebProject/dojo/_base/xhr.js:78:16)↵ at Object.dojo._contentHandlers.dojo.contentHandlers.json-comment-optional (/MYWebProject/dojo/_base/xhr.js:156:28)↵ at _deferredOk (/MYWebProject/dojo/_base/xhr.js:432:42)↵ at notify (/MYWebProject/dojo/_base/Deferred.js:187:23)↵ at complete (/MYWebProject/dojo/_base/Deferred.js:168:4)↵ at resolve.callback (/MYWebProject/dojo/_base/Deferred.js:248:4)↵ at eval (/MYWebProject/dojo/_base/xhr.js:627:8)↵ at signalListener (/MYWebProject/dojo/Deferred.js:37:21)↵ at signalWaiting (/MYWebProject/dojo/Deferred.js:28:4)"
__proto__: Error
Комментарии:
1. Если вы используете Jackson, вы можете просто добавить a
ObjectMapper
в модель и записать любой другой объект в виде строки JSON.2. Я думаю, вы ищете @ResponseBody .
Ответ №1:
да, вы можете вернуть как ответ JSON.отображение с помощью Gson API
@RequestMapping(value = "/showData", method = RequestMethod.GET)
public @ResponseBody String getUserHomePage(HttpServletRequest request,HttpServletResponse response, @ModelAttribute VINDTO vinData,BindingResult beException) throws IOException {
//you code stuff to create model object bean
Gson gson = new Gson();
return gson.toJson(objectBean);
}
Комментарии:
1. я получаю исключение в консоли broswer, пожалуйста, ознакомьтесь с первоначальным сообщением, отредактированным @Abhishek Mishra.
2. gson. toJSON(rowData); неправильный код, создайте один класс как xyz, задайте все значения, которые вы хотите, с помощью метода setter, а затем передайте объект xyz, скажем, xyzobj в gson, как return gson. toJSON(xyzobj);
3. хорошо, я попробую. еще один вопрос, могу ли я вернуть любую страницу исключения, если условие не выполняется, поскольку из моего исходного кода я не смог этого сделать, я считаю, что даже с этим кодом, о котором мы говорим, мы не можем вернуться на страницу исключения, если произойдет какое-либо исключение, поскольку этот класс загружает данные только внутри dojo gird, но в сеткууже загружен, вот почему, когда я получил какое-либо исключение, оно показывает только «ДАННЫЕ НЕ НАЙДЕНЫ» внутри сетки dojo вместо пересылки на страницу ошибок @Abhishek Mishra.
4. если вашему классу действий необходимо вернуть ответ в формате jSon, вы не можете перенаправить на страницу ошибки с контроллера, но вы можете отправить ответ об ошибке в формате json, а затем перенаправить на страницу ошибки после получения ответа об ошибке.
5. О, хорошо. тогда я думаю, что мне нужно внести много изменений в мою страницу jsp, пожалуйста, посмотрите страницу jsp, опубликованную в первоначальном сообщении. в настоящее время я ничего не обрабатываю на странице jsp. Это правильно? @Абхишек Мишра
Ответ №2:
Держите его чистым и простым…
Вот реальный фрагмент кода…
@RequestMapping(value = "/actions/getImplGroups", method = RequestMethod.POST)
public ResponseEntity<String> getImplGroups(HttpServletRequest request, HttpServletResponse response) {
List<String> groups = bpmClient.getAllGroups();
ObjectMapper mapper = new ObjectMapper();
String jsonString;
try {
jsonString = mapper.writeValueAsString(groups);
} catch (JsonGenerationException e) {
jsonString = "Error with json generation: " e.getMessage();
} catch (JsonMappingException e) {
jsonString = "Error with json mapping: " e.getMessage();
} catch (IOException e) {
jsonString = "Error with json: " e.getMessage();
}
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
return new ResponseEntity<String>(jsonString, responseHeaders, HttpStatus.CREATED);
}
Важным моментом, который следует учитывать, является отправка правильного веб-заголовка, чтобы ваша страница ожидала увидеть json.
В приведенном выше случае мы использовали библиотеку Jackson для создания json, но на самом деле вы можете форматировать json любым удобным вам способом. Вот пример простой строки, отформатированной вручную…
@RequestMapping(value = "/actions/getTicketsNotUpdatedWithinShift", method = RequestMethod.POST)
public ResponseEntity<String> getTicketsNotUpdatedWithinShift(String center, String sections, String minutesInShift, Model model) {
String[] sectionArray = sections.split(",");
String json = "";
String rowsString = "";
for (String section : sectionArray) {
List<Map<String, String>> rows = service.getMinutesSinceLastTicketUpdate(center, section);
for (Map<String, String> row : rows) {
int minutesSinceUpdate = Integer.parseInt(row.get("minutes"));
if (minutesSinceUpdate > Integer.parseInt(minutesInShift)) {
String description = row.get("description");
rowsString = rowsString """ description "",";
}
}
}
// Build the json structure
if (!rowsString.isEmpty()) {
// Trim the trailing comma.
rowsString = rowsString.replaceAll(",$", "");
json = "[" rowsString "]";
} else {
json = "[]";
}
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED);
}