SpringMvc笔记
- http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html
- 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)-->
- 读取请求参数中的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)); }
- 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"/>
- spring DelegatingFilterProxy管理过滤器
- 自定义Spring MVC3的参数映射和返回值映射 + fastjson
SpringMVC 使用HandlerMethodArgumentResolver自定义解析器实现请求数据绑定方法入参 - 返回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 - 通过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 - 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>
<?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>
- RequestBodyAdvice & ResponseBodyAdvice使用
curl -H "Content-Type:application/json" -XPOST -d '{}' "http://localhost:8080/hello/test"
@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; } }
- `
如果你觉得这篇文章对你有帮助或者使你有所启发,请点击右下角的推荐按钮,谢谢,:)