spring boot 学习3 web MVC核心与视图

spring boot 学习3 web MVC核心与视图

 核心主键bean

组件 Bean 类型 说明
HandlerMapping 映射请求(Request)到处理器(Handler)加上其关联的拦截(HandlerInterceptor)列表。(就是url映射目录和拦截器)
HandlerAdapter 调用请求处理器(Handler)无需关注其中实际的调用细节。调用注解实现的 Controller 。(适配器)
HandlerExceptionResolver 解析异常,可能策略是将异常处理映射到其他处理(Handlers) 、或到某个 HTML错误页面
ViewResolver  从处理器(Handler)返回字符类型的逻辑视图名称解析出实际的 View 对象
LocaleResolver,LocaleContextResolver 实现国际化视图
MultipartResolver  解析多部分请求(如 Web 浏览器文件上传)的抽象实现

 

 

 

 

 

 

 

 

 

xml方式实现mvc

web.xml(webapp.WEB-INF.web.xml) 配置DispatcherServlet,指定xml扫描路径

<web-app>
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/app-context.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

 配置 Web MVC 组件(指定扫描范围,设置:HandlerMapping,HandlerAdapter,ViewResolver 

<?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"
       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.xsd">

    <context:component-scan base-package="com.imooc.web"/>

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

添加controller

@Controller
public class HelloWorldController {

    @RequestMapping("")
    public String index(@RequestParam int value, Model model) {
        return "index";
    }

}

Web MVC 注解驱动

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <!-- Spring Web MVC 依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>

@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<String> 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";
    }
}
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
    <body>
        <message>${message}</message>
        <language>${acceptLanguage}</language>
        <jsessionId>${jsessionId}</jsessionId>
    </body>
</jsp:root>

spring boot 自动装配

Spring Boot JSP 依赖

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

 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";
    }

}

视图应用

资源(模板来源 ) 上下文(变量来源 ) 模板引擎(模板渲染)

通用资源抽象:File、ClassLoader、URL、ServletContext

Spring 资源抽象:Resource

Thyemeaf:Context

Spring Web MVC:Model

Servlet:Attribute

Thymeleaf:TemplateEngine

Spring:SpringTemplateEngine

Spring WebFlux:SpringWebFluxTemplateEngine

 

 

 

 

 

模板来源:Resource。变量来源:Context。模板渲染:SpringTemplateEngine

public class ThymeleafTemplateEngineBootstrap {

    public static void main(String[] args) throws IOException {
        // 构建引擎
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        // 创建渲染上下文
        Context context = new Context();
        context.setVariable("message", "Hello,World");

        // 读取内容从 classpath:/templates/thymeleaf/hello-world.html
        // ResourceLoader
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        // 通过 classpath:/templates/thymeleaf/hello-world.html Resource
        Resource resource = resourceLoader.getResource("classpath:/templates/thymeleaf/hello-world.html");
        File templateFile = resource.getFile();
        // 文件流
        FileInputStream inputStream = new FileInputStream(templateFile);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // Copy
        IOUtils.copy(inputStream, outputStream);

        inputStream.close();
        // 模板的内容
        String content = outputStream.toString("UTF-8");
        // 渲染(处理)结果
        String result = templateEngine.process(content, context);
        // 输出渲染(处理)结果
        System.out.println(result);
    }
}