SpringMvc笔记

  1. http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html
  2. Spring MVC DispatcherServlet 读取 xml 配置文件:
    {servlet-name} ==> /WEB-INF/{servlet-name}-servlet.xml
    自定义配置路径:
    <servlet>
       <servlet-name>my-dispatcher-name</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <init-param>
           <!-- override default name {servlet-name}-servlet.xml -->
           <param-name>contextConfigLocation</param-name>
           <param-value>/WEB-INF/springmvc-myconfig.xml</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
    </servlet>
    <!--
    load-on-startup: 默认值为-1,如果设置大于0,表示程序启动后要先初始化Servlet,这里的数字大小表示启动顺序。如果设置相同大小,则由容器决定启动的顺序。
    (别误解为启动实例的个数,servlet是单例的!)
    注解方式:
    @WebServlet(name = "test", urlPatterns = "/testServlet", loadOnStartup = 1)
    -->
  3. 读取请求参数中的Date,在Controller里加上:
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            dateFormat.setLenient(false);
            binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        }
  4. depends-on指定bean前置依赖的bean,前置依赖的bean会在本bean实例化之前创建好
    http://yanln.iteye.com/blog/2210723
    <bean id="sysinit" class="SystemInit">  
    <bean id="manager" class="CacheManager"  depends-on="sysinit"/>
  5. spring DelegatingFilterProxy管理过滤器
  6. 自定义Spring MVC3的参数映射和返回值映射 + fastjson
    SpringMVC 使用HandlerMethodArgumentResolver自定义解析器实现请求数据绑定方法入参
  7. 返回http状态码
    @RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET)
    public ResponseEntity<?> fetchWellData(@PathVariable String apiValue){
        try{
            OngardWell ongardWell = new OngardWell();
            ongardWell = ongardWellService.fetchOneByApi(apiValue);
    
            return new ResponseEntity<>(ongardWell, HttpStatus.OK);
        }catch(Exception ex){
            String errorMessage;
            errorMessage = ex + " <== error";
            return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
        }
    }

    参考:
    https://stackoverflow.com/questions/26134331/how-to-respond-with-http-status-code-in-a-spring-mvc-restcontroller-responsebo

  8. 通过ResponseEntity返回InputStream
    InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
    httpHeaders.setContentLength(contentLengthOfStream);
    return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);

    参考:
    https://stackoverflow.com/questions/20333394/return-a-stream-with-spring-mvcs-responseentity

  9. JSON
    maven
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    springmvc.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    
        <context:property-placeholder location="classpath:app.properties" ignore-unresolvable="true"/>
    
        <mvc:annotation-driven/>
    
        <mvc:resources location="/html/" mapping="/html/**/*"/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    
        <context:component-scan base-package="com.liq"></context:component-scan>
    
        <!-- deprecated as of Spring 3.2, in favor of RequestMappingHandlerAdapter -->
        <!--<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
                </list>
            </property>
        </bean>-->
    
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
                </list>
            </property>
        </bean>
    
    </beans>
  10. RequestBodyAdvice & ResponseBodyAdvice使用
    curl -H "Content-Type:application/json" -XPOST -d '{}' "http://localhost:8080/hello/test"
    HelloController
    @RestController
    @RequestMapping("/hello")
    public class HelloController {
    
        @RequestMapping("/test")
        public Person get() {
            SpringUtil.getApplicationContext().publishEvent(new JackEvent(this, "Jack", "xxx"));
            System.out.println(SpringUtil.getApplicationContext().getBean(Person.class).getName());
            return new Person("tom", 10);
        }
    
        @RequestMapping(value = "/test", method = RequestMethod.POST)
        public Person post(@RequestBody(required = false) Person person) {
            return person;
        }
        
    }

    MyRequestBodyAdvice.java

    import com.liq.freestyle.common.Person;
    import org.springframework.core.MethodParameter;
    import org.springframework.http.HttpInputMessage;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter;
    
    import java.io.IOException;
    import java.lang.reflect.Type;
    
    @ControllerAdvice
    public class MyRequestBodyAdvice extends RequestBodyAdviceAdapter implements RequestBodyAdvice {
        @Override
        public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
            return true;
        }
    
        @Override
        public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
            if (Person.class.equals(targetType)) {
                Person person = new Person();
                person.setName("default");
                person.setAge(18);
                body = person;
            }
            return super.handleEmptyBody(body, inputMessage, parameter, targetType, converterType);
        }
    
        @Override
        public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
            return super.beforeBodyRead(inputMessage, parameter, targetType, converterType);
        }
    
        @Override
        public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
            if (Person.class.equals(targetType)) {
                Person person = (Person) body;
                if (person.getName() == null) {
                    person.setName("default");
                }
                person.setAge(person.getAge() + 10);
            }
    
            return super.afterBodyRead(body, inputMessage, parameter, targetType, converterType);
        }
    }

    MyResponseBodyAdvice.java

    import com.liq.freestyle.common.JsonResult;
    import org.springframework.core.MethodParameter;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    
    @ControllerAdvice
    public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object> {
    
        @Override
        public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
            return true;
        }
    
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
            JsonResult jsonResult = new JsonResult();
            jsonResult.setCode(0);
            jsonResult.setMsg("Success");
            jsonResult.setData(body);
            return jsonResult;
        }
    }
  11. `
posted @ 2016-11-22 22:21  liqipeng  阅读(340)  评论(0)    收藏  举报