项目结构:
最先前提:Config类先要继承WebMvcConfigurerAdapter类
1.配置视图解析器
/**以前我们在xml的配置方式
<!-- 3.配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
*/
//实现该方法,注册视图处理器
@Bean
public InternalResourceViewResolver internalResourceViewResolver(){
InternalResourceViewResolver view=new InternalResourceViewResolver();
view.setSuffix(".jsp");
view.setPrefix("/WEB-INF/views/");
return view;
}
//如果是配置FreeMarker视图的话
/* @Bean
public FreeMarkerConfigurer freemarkerConfigurer() {
FreeMarkerConfigurer fmCfg = new FreeMarkerConfigurer();
fmCfg.setDefaultEncoding("UTF-8");
fmCfg.setTemplateLoaderPath("/WEB-INF/views/");
return fmCfg;
}
@Bean
public FreeMarkerViewResolver viewResolver() {
FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
viewResolver.setExposeSessionAttributes(true);
viewResolver.setSuffix(".ftl");
viewResolver.setContentType("text/html;charset=UTF-8");
return viewResolver;
}
*/
2.配置自定义注解:
//1、先创建一个注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
//2.设置注解处理器并实现HandlerMethodArgumentResolver接口
public class MyAnnotationHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
//该注解对应的变量返回什么数据
public Object resolveArgument(MethodParameter arg0, ModelAndViewContainer arg1, NativeWebRequest arg2,
WebDataBinderFactory arg3) throws Exception {
return "www.baidu.com";
}
//什么时候该注解生效
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(MyAnnotation.class) && parameter.getParameterType().equals(String.class);
}
}
//3.在WebConfig类中添加方法
//配置自定义Annotation功能
@Bean
publicMyAnnotationHandlerMethodArgumentResolvermyAnnotationHandlerMethodArgumentResol
ver(){
return new MyAnnotationHandlerMethodArgumentResolver();
}
//向sprngmvc中注册该注解
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver>
argumentResolvers) {
argumentResolvers.add(myAnnotationHandlerMethodArgumentResolver());
super.addArgumentResolvers(argumentResolvers);
}
//4.在Controller中使用注解
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model,@MyAnnotation String keyword){
System.out.println(keyword);
model.addAttribute("msg","hello");
return "hello";
}
}
访问/hello后会输出
3.配置拦截器
/**以前在xml中配置方式
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<bean class="xxx.xxx.xx.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
*/
//创建拦截器,并实现HandlerInterceptorAdapter接口
public class MyInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler)
throws Exception {
System.out.println("请求前的拦截处理");
return super.preHandle(request, response, handler);
}
}
// 现添加该方法,即可以实现
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration ir=registry.addInterceptor(myInterceptor());
//不过滤/hello路径
ir.excludePathPatterns("/hello");
super.addInterceptors(registry);
}
4.配置自定义视图
//添加自定义视图控制器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//不需要写一个@RequertMapping 和方法,直接访问/view1时就会跳转到view12.jsp中
registry.addViewController("/view1").setViewName("view12");
//自定义一个重定向转发,当访问/home时,会重定向到/hello.jsp中
registry.addRedirectViewController("/home", "/hello");
//设置文件访问权限,如/primary/**即访问primary文件下的文件时返回403,不够权限访问
registry.addStatusController("/primary/**", HttpStatus.FORBIDDEN);
super.addViewControllers(registry);
}
5.配置静态资源映射处理
//静态资源映射处理,比如css,js,图片,html
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//当访问hell.html时自动寻找(映射)对应的文件路径,如这里是classpath:static/hello.html
//这里可以把代码跟前端代码关联起来!!
registry.addResourceHandler("/hell.html")
.addResourceLocations("classpath:static/hello.html");
super.addResourceHandlers(registry);
}
6.配置默认静态资源处理
//默认静态资源处理:即 <mvc:default-servlet-handler/>
//我们之前的web.xml的dispatcher拦截的是所有的资源文件,但是如果启用这里的默认拦截,
//可以把spring拦截的静态资源交给tomcat去加载,如在spring访问不到css,但tomcat可以访问到
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
{
configurer.enable();
super.configureDefaultServletHandling(configurer);
}