springmvc +thymeleaf

72 阅读2分钟

什么是mvc

M:model 模型层 javabean service或dao 实体类

V:view 视图层 html 或jsp 页面

C:controller 控制层 接受请求或者响应浏览器

工作流程:视图层发送请求到服务器,在服务器中请求被controller接收,调用model层处理请求,处理完毕返回给controller,在根据请求处理结果找到view试图,渲染结果给浏览器

什么是springmvc

spring的一个后续产品,是spring的一个子项目 前端控制器dispatcherservlet重点,对请求和响应进行统一处理

RequestMapping注解作用 value 属性必须设置

@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。

@RequestMapping

web.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置springmvc的前端控制器-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


<!--
  url-pattern 中 / 匹配所有的请求(不包括.jsp) /*匹配所有请求包括(.jsp)
  -->


    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


</web-app>

spring-mvc.xml 配置

<?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 https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.spring.controller"></context:component-scan>

    <!--    配置thymeleaf试图解析器-->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"></property>
        <property name="characterEncoding" value="utf-8"></property>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!--                        试图前缀-->
                        <property name="prefix" value="/WEB-INF/templates/"></property>
                        <!--                        试图后缀-->
                        <property name="suffix" value=".html"></property>
                        <property name="templateMode" value="HTML5"></property>
                        <property name="characterEncoding" value="utf-8"></property>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>

目录如下:

image.png

inteceptors 拦截器

public class FirstInterceptors implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("controller执行前拦截器");
        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("执行后,返回前执行....");
    }
}
   <mvc:interceptors>
<!--        <bean class="com.demo.interceptors.FirstInterceptors"></bean>-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/> 
            <mvc:exclude-mapping path="/"/>
            <bean class="com.demo.interceptors.FirstInterceptors"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

DispatcherServlet 工作流程 DispatcherServlet是一个servlet a>processRequest b>doService() c>doDispatch() d>processDispatcherResult()

初始化 onRefresh

protected void initStrategies(ApplicationContext context) {
    this.initMultipartResolver(context);
    this.initLocaleResolver(context);
    this.initThemeResolver(context);
    this.initHandlerMappings(context);
    this.initHandlerAdapters(context);
    this.initHandlerExceptionResolvers(context);
    this.initRequestToViewNameTranslator(context);
    this.initViewResolvers(context);
    this.initFlashMapManager(context);
}

前端控制器dispatcherServlet捕获

处理器映射器handleMapping (注意拦截器preHandle)

处理器 handle

处理器执行器 handleAdapter --> ModelAndView (注意拦截器postHandle)

试图解析器 ViewResolver (注意拦截器afterHandle) 试图 View

Post 方式 @RequestBody 转换实体类

image.png

<!--fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.54</version>
</dependency>

@ResponseBody

image.png