Springboot整合springmvc
Springmvc的自动解管理
中央转发器(DispatcherServlet)
控制器
视图解析器
静态资源访问
消息转换器
格式化
静态资源管理
中央转发器
Xml无需配置
<servlet>
<servlet-name>chapter2</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>chapter2</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
控制器
控制器Controller在springboot的注解扫描范围内自动管理。
视图解析器自动管理
Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
ContentNegotiatingViewResolver:组合所有的视图解析器的;
曾经的配置文件无需再配
<bean id=\"de\" class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\">
<property name=\"prefix\" value=\"/WEB-INF/jsp/\"></property>
<property name=\"suffix\" value=\"*.jsp\"></property>
</bean>
源码:
public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
resolver.setContentNegotiationManager((ContentNegotiationManager)beanFactory.getBean(ContentNegotiationManager.class));
resolver.setOrder(-2147483648);
return resolver;
}
当我们做文件上传的时候我们也会发现multipartResolver是自动被配置好的
页面
<form action=\"/upload\" method=\"post\" enctype=\"multipart/form-data\">
<input name=\"pic\" type=\"file\">
<input type=\"submit\">
</form>
Controller
@ResponseBody
@RequestMapping(\"/upload\")
public String upload(@RequestParam(\"pic\")MultipartFile file, HttpServletRequest request){
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();
/*System.out.println(\"fileName-->\" + fileName);
System.out.println(\"getContentType-->\" + contentType);*/
//String filePath = request.getSession().getServletContext().getRealPath(\"imgupload/\");
String filePath = \"D:/imgup/\";
try {
this.uploadFile(file.getBytes(), filePath, fileName);
} catch (Exception e) {
// TODO: handle exception
}return \"success\";
}public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
File targetFile = new File(filePath);
if(!targetFile.exists()){
targetFile.mkdirs();
}
FileOutputStream out = new FileOutputStream(filePath+fileName);
out.write(file);
out.flush();
out.close();
}
消息转换和格式化
格式化转换器的自动注册
Springboot扩展springmvc
我们可以来通过实现WebMvcConfigurer接口来扩展
在容器中注册视图控制器(请求转发)
@Configuration
public class MyMVCCofnig implements WebMvcConfigurer{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController(\"/tx\").setViewName(\"success\");
}
}
注册格式化器
用来可以对请求过来的日期格式化的字符串来做定制化。当然通过application.properties配置也可以办到。
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new Formatter() {
@Override
public String print(Date date, Locale locale) {
return null;
}
@Override
public Date parse(String s, Locale locale) throws ParseException {
return new SimpleDateFormat(\"yyyy-MM-dd\").parse(s);
}
});
}
消息转换器扩展fastjson
在pom.xml中引入fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
配置消息转换器,添加fastjson
@Override
public void configureMessageConverters(List<HttpMessageConverter> converters) {
FastJsonHttpMessageConverter fc = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fc.setFastJsonConfig(fastJsonConfig);
converters.add(fc);
}
在实体类上可以继续控制
public class User
{
private String username;
private String password;
private int age;
private int score;
private int gender;
@JSONField(format = \"yyyy-MM-dd\")
private Date date;
拦截器注册
创建拦截器
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(\"前置拦截\");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(\"后置拦截\");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(\"最终拦截\");
}
}
拦截器注册
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns(\"/**\")
.excludePathPatterns(\"/hello2\");
}