Tôi muốn trả lại chế độ xem từ Bộ điều khiển MVC của Spring tùy thuộc vào logic. Nếu xảy ra lỗi, tôi muốn trả lại JSON, nếu không, một chế độ xem HTML. Điều này giống như ASP.NET MVC ActionResult, nơi bạn có thể trả về bất kỳ dạng xem nào và nó sẽ hiển thị kết quả, và nó sẽ không phụ thuộc vào kiểu nội dung đang được gửi trong yêu cầu. Tôi không thể tìm thấy bất kỳ ví dụ nào về điều này.Trả lại JSON hoặc Chế độ xem từ Bộ điều khiển MVC Xuân
Trả lời
Tôi đã đạt được điều này với những điều sau đây.
@RequestMapping(value="/users", method=RequestMethod.POST)
public Object index(@RequestBody SearchUsersViewModel model, HttpServletResponse response) {
model.setList(userService.getUsers(model));
if(true)
{
return new ModelAndView("controls/tables/users", "model", model);
}
else
{
return JsonView.Render(model, response);
}
}
JsonView.java
public class JsonView {
public static ModelAndView Render(Object model, HttpServletResponse response)
{
MappingJacksonHttpMessageConverter jsonConverter = new MappingJacksonHttpMessageConverter();
MediaType jsonMimeType = MediaType.APPLICATION_JSON;
try {
jsonConverter.write(model, jsonMimeType, new ServletServerHttpResponse(response));
} catch (HttpMessageNotWritableException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
JS Chức năng này sẽ làm cho các cuộc gọi
config.request = $
.ajax({
url : url,
data : $.toJSON(def.data),
type : def.type,
dataType : def.dataType,
processData : true,
contentType : def.contentType,
success : function(data) {
try {
var json = data;
if (typeof data === "String" || typeof data == "string") {
json = (eval('(' + data + ')'));
}
if ('object' === typeof json) {
if (json.Validation && json.Validation.Errors.length > 0) {
$.each(json.Validation.Errors, function() {
// Error Code Check
});
// Error Callback
if (typeof (def.errorCallback) == 'function') {
def.errorCallback(json);
}
} else {
def.callback(data);
}
} else {
def.callback(data);
}
} catch (e) {
def.callback(data);
// Hide Loading
}
},
error : function(data) {
}
});
Trong mã của bạn, bạn có 'if (true)' - vậy khi nào JSON được trả về? – Paul
Tôi chỉ đang thử nghiệm ở đó. Tôi sẽ kiểm tra lỗi trong đối tượng trả về sau đó trả về json, ngược lại trả về HTML. –
Có lẽ bạn có thể xem ResolveBundleViewResolver, cho phép bạn kết hợp chế độ xem. docs cung cấp một số thông tin về cách sử dụng.
Từ các tài liệu (ví dụ là để trộn gạch và JSTL, nhưng nên áp dụng cho những người khác cũng) ...
tập tin bối cảnh
<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="views"/>
</bean>
views.properties
...
welcomeView.(class)=org.springframework.web.servlet.view.tiles2.TilesView
welcomeView.url=welcome (this is the name of a Tiles definition)
vetsView.(class)=org.springframework.web.servlet.view.tiles2.TilesView
vetsView.url=vetsView (again, this is the name of a Tiles definition)
findOwnersForm.(class)=org.springframework.web.servlet.view.JstlView
findOwnersForm.url=/WEB-INF/jsp/findOwners.jsp
...
Lập trình bộ điều khiển của bạn để trả về một tên chế độ xem logic khác nhau tùy thuộc vào điều kiện. Ví dụ:
@RequestMapping(value="/hello/{name}", method=RequestMethod.GET)
public ModelAndView hello(@PathVariable String name) {
String viewName = (name.length() > 1) ? "hello" : "error";
ModelAndView mav = new ModelAndView(viewName);
mav.addObject("name", name);
return mav;
}
Định cấu hình chế độ xem phân giải để giải quyết tên chế độ xem "error"
thành chế độ xem JSON. Spring cung cấp nhiều cách để cấu hình tên view để xem bản đồ, bao gồm:
- XmlViewResolver mà đọc file XML định nghĩa bean,
- ResourceBundleViewResolver mà đọc file thuộc tính, và
- BeanNameViewResolver trông trong bối cảnh áp dụng DispatcherServlet thực hiện cho một bean có cùng tên với tên khung nhìn.
Ví dụ, để sử dụng BeanNameViewResolver:
<bean name="error" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"/>
</bean>
Chỉ trong trường hợp và bạn muốn quay trở lại Json trên ngoại trừ bạn có thể làm như sau:
@ExceptionHandler(Exception.class)
@ResponseBody
public void handleIOException(Exception exception,HttpServletRequest request, HttpServletResponse response) {
response.setContentType("application/json");
String json = "{\"Name\": 50}";
PrintWriter out= response.getWriter();
out.write(json);
}
Tôi không chắc chắn rằng đây là những gì bạn muốn làm, nhưng chỉ trong trường hợp .... :)
Nếu một lỗi xảy ra trong một bộ điều khiển, điều này sẽ bắt nó và trả về JSON? –
A xa như tôi nhớ có nó sẽ bắt. –
Không có gì để ngăn bạn quay trở lại thực tế View
đối tượng trực tiếp từ phương thức điều khiển của bạn - nó không phải là tên khung nhìn. Vì vậy, bộ điều khiển của bạn có thể xây dựng một đối tượng View
bằng cách sử dụng logic riêng của nó và trả về điều đó, có hoặc không được bao bọc trong đối tượng ModelAndView
.
Điều này có lẽ đơn giản hơn là cố gắng thuyết phục khung làm việc ViewResolver
làm việc này cho bạn, mặc dù điều đó cũng có tác dụng.
Để mở rộng câu trả lời Chin Huang, đây là những gì làm việc cho tôi. Không cần cấu hình.
response.setStatus(500);
return new ModelAndView(new MappingJacksonJsonView(), model);
Điều này sẽ tự động chuyển đổi mô hình thành JSON và ghi để phản hồi. Dưới đây mô hình là loại Map<String,Object>
và phản ứng là loại HttpServletResponse
Ý tưởng tồi để khởi tạo chế độ xem JSON mới mỗi khi bạn cần trả lại. –
Ý tưởng hay là gì @JukkaDahlbom? –
- 1. Trả lại các chế độ xem khác nhau từ Bộ điều khiển MVC
- 2. Trả lại tệp từ Bộ điều khiển trong Mùa xuân
- 3. Trả lại phản hồi JSON từ chế độ xem Flask
- 4. Làm cách nào để trả lại HTML từ bộ điều khiển MVC sang div trong chế độ xem của tôi
- 5. Đi từ Bộ điều khiển đến Chế độ xem
- 6. Cách bật từ một bộ điều khiển chế độ xem sang một bộ điều khiển chế độ xem khác
- 7. Cách trả về đối tượng Json từ bộ điều khiển MVC để xem
- 8. Trả lại chế độ xem từ một khu vực khác
- 9. cách trả về JSON với Bộ điều khiển MVC
- 10. MVC nơi logic nên đi Bộ điều khiển hoặc Chế độ xem
- 11. Cách trả lại 404 với chế độ xem asp.net mvc
- 12. Truyền dữ liệu từ Bộ điều khiển MVC sang Chế độ xem trong PHP
- 13. Thêm chế độ xem của trình điều khiển chế độ xem con vào chế độ xem phụ của bộ điều khiển chế độ xem cha mẹ
- 14. Cách chuyển Danh sách từ Bộ điều khiển sang Chế độ xem trong MVC 3.
- 15. Bộ điều khiển xem đẩy vào chế độ xem giao diện chế độ xem
- 16. Loại bỏ hai bộ điều khiển chế độ xem
- 17. cách tải lại chế độ xem bảng của bộ điều khiển uiviewcontroller khác trong chế độ xem hiện tại
- 18. ExtJS 4 cách tạo và hiển thị bộ điều khiển/chế độ xem mới từ bộ điều khiển/chế độ xem khác?
- 19. LÀM THẾ NÀO? Bộ điều khiển trả về không có gì/chế độ xem hiện tại
- 20. Hành động của bộ điều khiển ASP.NET MVC trả về JSON hoặc một phần html
- 21. Chế độ xem trang phân trang với bộ điều khiển chế độ xem trẻ em
- 22. Nhiều chế độ xem giải quyết vào mùa xuân mvc
- 23. Trình điều khiển chế độ xem hiện tại từ AppDelegate?
- 24. "Thêm bộ điều khiển"/"Thêm chế độ xem" trong ứng dụng ASP.NET MVC/WebForms ASP.NET
- 25. Hiển thị chế độ xem của bộ điều khiển khác
- 26. (UIView *) hitTest trong bộ điều khiển chế độ xem?
- 27. Trả về Json từ bộ điều khiển MVC mở rộng Apicontroller
- 28. Truyền dữ liệu từ bộ điều khiển chế độ xem này sang bộ điều khiển chế độ xem khác; iOS <= 4 so với iOS 5
- 29. MVC - tôi có cần sử dụng Bộ điều khiển trong Chế độ xem không?
- 30. Tìm bộ điều khiển ASP.NET MVC trong chế độ xem chính
http://stackoverflow.com/questions/6173093/spring-return-json-from-controller-as-modelandview – Bozho