内容:理解、认识、简化
servlet
特点:请求响应式(Request/Response)、屏蔽网络通讯细节、有完整的生命周期
职责:处理请求(handler等)、资源管理(连接数据库、redis)、视图渲染(html等)
处理器管理
核心主键bean
组件 Bean 类型 | 说明 |
---|---|
HandlerMapping | 映射请求(Request)到处理器(Handler)加上其关联的拦截(HandlerInterceptor)列表。(就是url映射目录和拦截器) |
HandlerAdapter | 调用请求处理器(Handler)无需关注其中实际的调用细节。调用注解实现的 Controller 。(适配器) |
HandlerExceptionResolver | 解析异常,可能策略是将异常处理映射到其他处理(Handlers) 、或到某个 HTML错误页面 |
ViewResolver | 从处理器(Handler)返回字符类型的逻辑视图名称解析出实际的 View 对象 |
LocaleResolver,LocaleContextResolver | 实现国际化视图 |
MultipartResolver | 解析多部分请求(如 Web 浏览器文件上传)的抽象实现 |
web.xml(webapp.WEB-INF.web.xml) 配置DispatcherServlet,指定xml扫描路径
app
org.springframework.web.servlet.DispatcherServlet
1
contextConfigLocation
/WEB-INF/app-context.xml
app
/
配置 Web MVC 组件(指定扫描范围,设置:HandlerMapping,HandlerAdapter,ViewResolver )
添加controller
@Controller
public class HelloWorldController {
@RequestMapping("")
public String index(@RequestParam int value, Model model) {
return "index";
}
}
javax.servlet
javax.servlet-api
provided
javax.servlet
jstl
org.springframework
spring-webmvc
老式非 spring boot 没有内嵌tomcat 需要放入tomcat才能使用。
@EnableWebMvc 默认配置了HandlerMapping,HandlerAdapter的bean
实现WebMvcConfigurer 自定义url拦截器
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截中...");
return true;
}
});
}
}
常用注解
@ModelAttribute | 注册模型属性(可以在jsp页面读取这些属性) |
@RequestHeader | 读取请求头 |
@CookieValue | 读取 Cookie |
@Valid 、 @Validated | 校验参数 |
@ExceptionHandler | 注解处理,异常时处理 |
@ControllerAdvice | 切面通知(通过代理模式添加通知数据) |
//代理的HelloWorldController这个类里的通知
@ControllerAdvice(assignableTypes = HelloWorldController.class)
public class HelloWorldControllerAdvice {
@ModelAttribute("acceptLanguage")
public String acceptLanguage(@RequestHeader("Accept-Language") String acceptLanguage){
return acceptLanguage;
}
@ModelAttribute("jsessionId")
public String jsessionId(@CookieValue("JSESSIONID") String jsessionId){
return jsessionId;
}
@ModelAttribute("message")
public String message(){
return "Hello,World";
}
@ExceptionHandler(Throwable.class)
public ResponseEntity onException(Throwable throwable) {
return ResponseEntity.ok(throwable.getMessage());
}
}
@Controller
public class HelloWorldController {
@RequestMapping("")
public String index(@RequestParam int value, Model model) {
// model.addAttribute("acceptLanguage",acceptLanguage);
// model.addAttribute("jsessionId",jsessionId);
// model.addAttribute("message","Hello,World");
return "index";
}
}
${message}
${acceptLanguage}
${jsessionId}
Spring Boot JSP 依赖
org.apache.tomcat.embed
tomcat-embed-jasper
application.properties
spring.mvc.view.prefix = /WEB-INF/jsp/
spring.mvc.view.suffix = .jsp
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截中...");
return true;
}
});
}
}
启动类
@SpringBootApplication(scanBasePackages = "com.imooc.web")
public class SpringBootWebMvcBootstrap {
public static void main(String[] args) {
SpringApplication.run(SpringBootWebMvcBootstrap.class, args);
}
}
@Controller
public class HelloWorldController {
@RequestMapping("")
public String index(@RequestParam int value, Model model) {
return "index";
}
}