SpringMVC基础-8-JSON与Restful支持

来源:互联网 发布:大华网络摄像机默认ip 编辑:程序博客网 时间:2024/05/16 12:33

2017/12/13更新

通过自定义注解在过滤返回的json字段

https://diamondfsd.com/article/ae89cf4e-f679-4cc0-9882-f02e0240866e

记录一下心得:
HandlerMethodReturnValueHandler 主要是处理返回值用的处理类
我们关注一下handleReturnValue这个方法

 mavContainer.setRequestHandled(true);        for (int i=0;i<advices.size();i++){            ResponseBodyAdvice<Object> ad = advices.get(i);            if (ad.supports(returnType, null)) {                returnValue = ad.beforeBodyWrite(returnValue, returnType, MediaType.APPLICATION_JSON_UTF8, null,                        new ServletServerHttpRequest(webRequest.getNativeRequest(HttpServletRequest.class)),                        new ServletServerHttpResponse(webRequest.getNativeResponse(HttpServletResponse.class)));            }        }        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);        Annotation[] annos = returnType.getMethodAnnotations();        CustomerJsonSerializer jsonSerializer = new CustomerJsonSerializer();        Arrays.asList(annos).forEach(a -> {            if (a instanceof JSON) {                JSON json = (JSON) a;                jsonSerializer.filter(json);            } else if (a instanceof JSONS) {                JSONS jsons = (JSONS) a;                Arrays.asList(jsons.value()).forEach(json -> {                    jsonSerializer.filter(json);                });            }        });        response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);        String json = jsonSerializer.toJson(returnValue);        response.getWriter().write(json);

上面不说了,主要是拿到response 和注解开始。
也就是我们这个返回的数据需要用CustomerJsonSerializer这个类处理一下,而这个类构造的时候,用到了JackSonJsonFilter这个类,活的注解之后把字段通过addToMap方法进行了添加

  private void addToMap(Map<Class<?>, Set<String>> map, Class<?> type, String[] fields) {        Set<String> fieldSet = map.getOrDefault(type, new HashSet<>());        fieldSet.addAll(Arrays.asList(fields));        map.put(type, fieldSet);    }

2017/12/07更新

关于返回的json中null转为“”的方法

public class JsonObjectMapper extends ObjectMapper {    private static final long serialVersionUID = 1L;    public JsonObjectMapper() {        super();        // 空值处理为空串        this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {            @Override            public void serialize(Object value, JsonGenerator jg, SerializerProvider sp)                    throws IOException, JsonProcessingException {                jg.writeString("");            }        });    }}

在配置文件中进行转换

<mvc:message-converters>    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">        <property name="objectMapper">            <bean class="jp.co.remmo.common.util.JsonObjectMapper"></bean>        </property>    </bean></mvc:message-converters>

JSON

1,@RequestBody

@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
List.action?id=1&name=zhangsan&age=12。
@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象

2,@ResponseBody

该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
本例子应用:
@ResponseBody注解实现将controller方法返回对象转换为json响应给客户端

// 商品修改提交json信息,响应json信息    @RequestMapping("/editItemSubmit_RequestJson")    public @ResponseBody Items editItemSubmit_RequestJson(@RequestBody Items items) throws Exception {        System.out.println(items);        //itemService.saveItem(items);        return items;    }

RESTful支持

1,定义

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格,是对http协议的诠释。

  • 资源定位:互联网所有的事物都是资源,要求url中没有动词,只有名词。没有参数
  • Url格式
    http://blog.csdn.net/beat_the_world/article/details/45621673
  • 资源操作:使用put、delete、post、get,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。一般使用时还是post和get。Put和Delete几乎不使用。

2,添加DispatcherServlet的rest配置

<servlet>    <servlet-name>springmvc-servlet-rest</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath:spring/springmvc.xml</param-value>    </init-param></servlet><servlet-mapping>    <servlet-name>springmvc-servlet-rest</servlet-name>    <url-pattern>/</url-pattern></servlet-mapping>

3,URL 模板模式映射

  • @RequestMapping(value=”/ viewItems/{id}”):
    {×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用
  • @PathVariable获取{×××}中的×××变量:
    @PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
@RequestMapping("/viewItems/{id}") public @ResponseBody viewItems(@PathVariable("id") String id,Model model) throws Exception{    //方法中使用@PathVariable获取useried的值,使用model传回页面    //调用 service查询商品信息    ItemsCustom itemsCustom = itemsService.findItemsById(id);    return itemsCustom;}

如果RequestMapping中表示为”/viewItems/{id}”,id和形参名称一致,@PathVariable不用指定名称。

4,静态资源访问”mvc:resources”

如果在DispatcherServlet中设置url-pattern为 /则必须对静态资源进行访问处理。spring mvc 的

mvc:resources mapping="" location=""

实现对静态资源进行映射访问。如下是对js文件访问配置:

<mvc:resources location="/js/" mapping="/js/**"/>
原创粉丝点击