SpringMVC配置
springMVC基本配置
Spring mvc 的定制配置需要我们的配置类继承一个WebMvcConfigurerAdapter类,并在此类使用@EnableWebMvc注解,来开启对spring mvc 的配置支持,这样我们就可以重写这类的方法,完成我们的配置。
1.静态资源映射
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("hello");
return "hello";
}
}(1).文件基本部署位置图

(2).web配置类
public class WebInitializer implements WebApplicationInitializer{
// WebApplicationInitializer 是spring 提供用来配置servlet3.0+配置的接口,从而实现了替代web.xml的位置。
// 实现此接口将会自动被springServletContainerInitializer(用来启动servlet3.0容器)获取到
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// TODO Auto-generated method stub
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(MymvcConfig.class);
context.setServletContext(servletContext);
Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
}
}(3).View配置类
@Configuration
@EnableWebMvc //开启spring mvc支持,若无此句,重写WebMvcConfigurerAdapter方法无效
@ComponentScan("cn.cw.study")
public class MymvcConfig extends WebMvcConfigurerAdapter{
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
// E:\javaworkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\MySpringMvc\WEB-INF\classes\assets
resolver.setPrefix("/WEB-INF/classes/assets/");//此路径需要找页面编译后的路径
//运行时代码会将页面自动编译到 "/WEB-INF/classes/views/"
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
//重写此方法可对spring mvc进行配置
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// TODO Auto-generated method stub
//addResourceHandler对外暴露的访问路径 //addResourceLocations配置文件放置的目录
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
}
}(4).页面hello.jsp
<%@ page pageEncoding="utf-8"%>
<html>
<head></head>
<body>
<%--使用out.print("hello jsp");方式输出 --%>
<%
for(int i=0;i<10;i++){
out.println("hello jsp<br>");
}
%>
<!--使用<%="hello jsp"%>方式输出--%>
<%
for(int i=0;i<10;i++){
%>
<%="no."+(i+1)+"hello jssssp" %><br>
<% } %>
</body>
</html>2.拦截器配置
拦截器(interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于servlet的filter,可让普通的Bean实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类来实现自定义拦截器。
通过重写WebMVCConfigurerAdapter的addInterceptors方法来注册自定义的拦截器。
代码示例:
//继承HandlerInterceptorAdapter来实现自定义拦截器
public class DemoInterceptor extends HandlerInterceptorAdapter{
//请求发生前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println(request.getRequestURL());
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
//请求完成后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
long attribute =(Long) request.getAttribute("startTime");
request.removeAttribute("startTime");
long endTime = System.currentTimeMillis();
System.out.println("本次请求处理时间为:"+new Long(endTime-attribute)+"ms");
}
}
@Repository //使spring进行管理
public class DemoConfigurerIntercepter extends WebMvcConfigurerAdapter{
@Bean //使spring进行管理自定义拦截器
public DemoInterceptor demoInterceptor(){
return new DemoInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
registry.addInterceptor(demoInterceptor());
}
}3.@ControllerAdvice 全局配置
(1).@ControllerAdvice
我们可以将对于控制器的全局配置放置在同一个位置,注解了@Controller的类的方法可使用
@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上,这对所有注解了
@RequestMapping的控制器内的方法有效。
(2).@ExceptionHandler:
用于全局处理控制器里的异常。(3).@InitBinder:
用来设置webDataBinder, webDataBinder用来自动绑定前台请求参数到model中。(4).@ModelAttribute:
作用是绑定键值对到model里,此处是让全局的@RequestMapping都能获得在此处设置的键值对。代码示例:
A.配置@ControllerAdvice
@ControllerAdvice
//声明一个 控制器建言,@ControllerAdvice组合了@Component注解,所以自动注册为spring的bean
public class ExceptionHandlerAdvice {
@ExceptionHandler(value = Exception.class) //定义全局处理,拦截所有的Exception
public ModelAndView exception(Exception exception,WebRequest request){
ModelAndView view = new ModelAndView("error");
view.addObject("errorMessage", exception.getMessage());
return view;
}
@ModelAttribute
//使用@ModelAttribute注解将键值对添加到全局,所有注解了@RequestMapping的方法可获得此键值对
public void addAttributes(Model model){
model.addAttribute("msg", "额外信息");
}
@InitBinder //注解定制webDataBinder 更多的关于webDataBinder的配置,可参考webDataBinder的API文档
public void initBinder(WebDataBinder webDataBinder){
//演示忽略request参数的Id
webDataBinder.setDisallowedFields("id");
}
}
B.测试controller
@Controller
public class AdviceController {
@RequestMapping("/advice")
public String getSomething(@ModelAttribute("msg") String msg,RequestBean bean) throws IllegalAccessException{
System.out.println("id="+bean.getId());//0 ,说明id已经被过滤了
System.out.println("name="+bean.getName());//cc
throw new IllegalAccessException("参数有误,来自@ModelAttribute:"+msg);
}
}
C.Error.jsp
<%@ page pageEncoding="utf-8"%>
<html>
<head></head>
<body>
${errorMessage}
</body>
</html>其他配置(快捷的viewController)
@Controller
public class WebMvcController {
@RequestMapping("/index")
public String hello(){
return "hello";
}
}另一种写法:
@Component
public class WebMvC extends WebMvcConfigurerAdapter{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("/hello");
}
}5.更多配置
请查看WebMvcConfigurerAdapter类的API,WebMvcConfigurer的Api也可以来配置MVC.
文章标题:SpringMVC配置
发布时间:2019-11-15, 14:38:17
最后更新:2019-11-15, 14:38:18