开发者社区> 问答> 正文

SpringMVC返回JSON内容问题

Controller如下:
screenshot
screenshot
screenshot

展开
收起
a123456678 2016-03-16 17:44:11 2348 0
1 条回答
写回答
取消 提交回答
  • 最简单的直接用 @ResponseBody返回。
    其二我经常使用的多视图,代码如下:
    JsonView.java
    package com.szfore.springmvc;
     
    import java.io.PrintWriter;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.util.CollectionUtils;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.servlet.view.AbstractView;
     
    import com.google.gson.Gson;
    /**
     * <b>function:</b>扩展AbstractView 实现JSON-lib视图
     * @author hoojo
     * @createDate 2011-4-28 下午05:26:43
     * @file MappingJsonlibVeiw.java
     * @package com.hoo.veiw.xml
     * @project SpringMVC4View
     * @blog http://blog.csdn.net/IBM_hoojo
     * @email hoojo_@126.com
     * @version 1.0
     */
    public class JsonView extends AbstractView {
        public static final String DEFAULT_CONTENT_TYPE = "application/json";
        public static final String HTML_CONTENT_TYPE = "text/html";
        public static final String DEFAULT_CHAR_ENCODING = "UTF-8";
        private String encodeing = DEFAULT_CHAR_ENCODING;
         
        private Object jsonData = null;
        private Map<String, Object> _jsonDataMap = new HashMap<String, Object>();
         
        public void setEncodeing(String encodeing) {
            this.encodeing = encodeing;
        }
        private Set<String> renderedAttributes;
        public JsonView() {
            setContentType(DEFAULT_CONTENT_TYPE);
        }
        public JsonView(Object data) {
            setContentType(DEFAULT_CONTENT_TYPE);
            this.jsonData  =data;
        }
        @Override
        protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            response.setCharacterEncoding(encodeing);
            response.setContentType(getContentType());
             
            PrintWriter out = response.getWriter();
            if(jsonData != null){
                out.print(new Gson().toJson(jsonData));
            }else if(!_jsonDataMap.isEmpty()){
                out.print(new Gson().toJson(_jsonDataMap));
            }else {
                model = filterModel(model);
                out.print(new Gson().toJson(model));
            }
        }
         
        /**
         * Filters out undesired attributes from the given model.
         * <p>Default implementation removes {@link BindingResult} instances and entries not included in the {@link
         * #setRenderedAttributes(Set) renderedAttributes} property.
         */
        protected Map<String, Object> filterModel(Map<String, Object> model) {
            Map<String, Object> result = new HashMap<String, Object>(model.size());
            Set<String> renderedAttributes =
                    !CollectionUtils.isEmpty(this.renderedAttributes) ? this.renderedAttributes : model.keySet();
            for (Map.Entry<String, Object> entry : model.entrySet()) {
                if (!(entry.getValue() instanceof BindingResult) && renderedAttributes.contains(entry.getKey())) {
                    result.put(entry.getKey(), entry.getValue());
                }
            }
     
            return result;
     
        }
         
        public void setJsonData(Object jsonData){
            this.jsonData = jsonData;
        }
         
        public static JsonView returnJson(Object jsonData){
            JsonView jsonView = new JsonView();
            jsonView.setJsonData(jsonData);
            return jsonView;
        }
         
        public JsonView put(String key, Object value)
        {
            _jsonDataMap.put(key, value);
            return this;
        }
    }
    MultiViewResover.java 
    package com.szfore.springmvc;
     
    import java.util.Locale;
    import java.util.Map;
    import org.springframework.web.servlet.View;
    import org.springframework.web.servlet.ViewResolver;
     
    /**
     * @author Jeson
     * @blog:http://www.gbsou.com
     * @date:Oct 20, 2009 8:39:27 AM
     * @version :1.0
     * 
     */
    public class MultiViewResover implements ViewResolver {
     
        private Map<String, ViewResolver> resolvers;
         
        private final static String DEFAULT_RESOLVER = "jsp";
        private final static String JSON_RESOLVER = "json";
        private final static String JSON_VIEW_NAME = "jsonView";
         
        /*
         * 自定义resolve类默认为jsp视图,其余视图用下划线分隔
         */
        @Override
        public View resolveViewName(String viewName, Locale locale) throws Exception {
            //判断是否为json
            String tmpViewName = viewName.trim().toLowerCase();
            if(JSON_RESOLVER.equals(tmpViewName)){
                ViewResolver resolver = resolvers.get(JSON_RESOLVER);
                return resolver.resolveViewName(JSON_VIEW_NAME, locale);
            }
            //若无下划线,默认转向jsp视图
            int n = viewName.lastIndexOf("_"); 
            if (n == (-1)){
                ViewResolver resolver = resolvers.get(DEFAULT_RESOLVER);
                return resolver.resolveViewName(viewName, locale);
            }
            //有的话截取下划线后面的字符串 这里一般是jsp,ftl,vm与配置文件中的<entry key="ftl">的key匹配
            String suffix = viewName.substring(n + 1);
            // 根据下划线后面的字符串去获取托管的视图解析类对象
            ViewResolver resolver = resolvers.get(suffix);
            // 取下划线前面的部分 那时真正的资源名.比如我们要使用hello.jsp 那viewName就应该是hello_jsp
            viewName = viewName.substring(0, n);
            if (resolver != null){
                return resolver.resolveViewName(viewName, locale);
            }
            return null;
        }
     
        public Map<String, ViewResolver> getResolvers() {
            return resolvers;
        }
     
        public void setResolvers(Map<String, ViewResolver> resolvers) {
            this.resolvers = resolvers;
        }
    }
    xml配置 
    <!-- 多视图 -->
        <bean name="jsonView" class="com.szfore.springmvc.JsonView">
        </bean>
        <bean id="viewResolver" class="com.szfore.springmvc.MultiViewResover">
            <property name="resolvers">
                <map>
                    <entry key="jsp">
                        <bean
                            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                            <property name="prefix" value="/" />
                            <property name="suffix" value=".jsp" />
                        </bean>
                    </entry>
                    <entry key="json">
                        <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
                        </bean>
                    </entry>
                </map>
            </property>
        </bean>
    使用方法: 
    4
    @RequestMapping("/test")
    public JsonView test(){
      return new JsonView(new User());
    }
    
    2019-07-17 19:04:13
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载