码迷,mamicode.com
首页 > 编程语言 > 详细

Spring-MVC

时间:2020-06-19 12:10:19      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:sch   区别   而不是   数据   youdao   alt   boolean   ast   ack   

MVC模式

         目的:代码分层解耦

          M:  模型      负责数据相关操作(实体,dao,service)

          V:  视图       负责数据展示和用户交互(各种页面)

          C:控制器   负责调用模型,更新视图(servlet)

 

SpringMVC的实现

      1)引入依赖

     <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>

         2)添加Spring 配置文件

               

回顾:
    静态代理和动态代理的区别
    JDK动态代理和CGLib有什么区别
    JDK的动态代理如何实现
        实现InvocationHandler接口
        实现invoke方法,调用被代理者方法,进行扩展
        使用Proxy.newProxyInstance(被代理类加载器,被代理类的接口,实现IH对象)方法创建代理对象
    什么是AOP,可以做什么,原理是什么
        AOP 面向切面编程
        关注横向关系,封装多个无关的类所需要的通用的操作,让这些类只关注自己的核心业务,由AOP自动调用通过操作,实现解耦,提高维护性
        原理是通过动态代理创建代理对象完成通用操作,JDK——>CGLib
    AOP如何配置
        1)引入依赖
            spring-aop
            aspectjrt
            aspectjweaver
        2)添加配置文件
        3)定义通知类,定义前置、后置、环绕、异常、返回操作
        4)在需要AOP的类上加@Component
        5)在配置文件中
            <context:conpenent-scan>扫描包
            定义<bean>配置通知类
            <aop:config>
                连接点
                <aop:pointcut id="pc" 
                    expression="execution(返回类型 包名+类名.方法名(..))"/>
                切面
                <aop:aspect ref="通知对象id">
                    <aop:before method="通知方法名" pointcut-ref="pc"/>
                    。。。
                </aop:aspect>
            </aop:config>
 
MVC模式
Spring MVC的配置
Spring MVC执行流程
请求和响应
@ResponseBody和@RestController注解
拦截器
 
 
MVC模式
    目的:代码分层、解耦
    M 模型 负责数据相关操作(实体、DAO、serivce)
    V 视图 负责数据展示和用户交互(各种页面)
    C  控制器 负责调用模型,更新视图(Servlet)
    
SpringMVC的实现
    1)引入依赖
        spring-web
        spring-webmvc
    2)  添加Spring配置文件
        <?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"
               xmlns:mvc="http://www.springframework.org/schema/mvc"
               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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
            <!--扫描包-->
            <context:component-scan base-package="com.qianfeng.springmvc"/>
            <!--配置视图解析器-->
            <!--作用是将URL转换为实际的JSP的地址
            http://localhost:8080/Spring1904MVC/hello转换为http://localhost:8080/Spring1904MVC/WEB-INF/jsp/hello.jsp-->
            <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <!--配置视图的前缀-->
                <property name="prefix" value="/WEB-INF/jsp/"/>
                <!--配置视图的后缀-->
                <property name="suffix" value=".jsp"/>
            </bean>
            <!--配置对静态资源的处理器-->
            <mvc:default-servlet-handler/>
            <!--配置注解驱动支持SpringMVC的注解-->
            <mvc:annotation-driven/>
        </beans>
    3)配置web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    
      <!--配置前端控制器-->
      <servlet>
        <servlet-name>dipatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置参数:Spring配置文件的地址-->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--配置优先启动该Servlet-->
        <load-on-startup>1</load-on-startup>
      </servlet>
      <!--配置Servlet映射-->
      <servlet-mapping>
        <servlet-name>dipatcherServlet</servlet-name>
        <!--/代表管理所有的资源-->
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
    补充:添加编码过滤器
    <!--配置用于编码的过滤器-->
      <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    4)添加控制器类
        @Controller
        public class 类名{
        
            @RequestMapping("url地址")
            public String 方法名(参数){
                return "页面文件名";
            }
        }
        @Controller 控制器注解,写在任意的类上,Spring将该类作为控制器
        @RequestMapping 请求映射注解,写在类和方法上,用于定义url
        @RequestMapping("url") 简写,默认使用Get
        @RequestMapping(value="url",method=RequestMethod.方法类型)
        
        
SpringMVC的执行流程
技术图片
        1)用户发送请求,前端控制器接受用户的请求
        2)前端控制器发送用户请求的URL给处理器映射获得Handler处理器
            处理器映射 类似于Map结构,每个url对应一个Handler
            Handler用于执行Controller方法中的业务逻辑
        3)处理器映射找到Handler返回给前端控制器
        4)前端控制器把Handler发送给处理器适配器
            处理器适配器用于执行Handler
        5)处理器适配器调用Handler执行其中的逻辑代码
        6)将数据和视图信息包装到ModelAndView中返回
        7)处理器适配器把ModelAndView返回给前端控制器
        8)前端控制器把ModelAndView发送给视图解析器
        9)视图解析器解析出实际的物理视图View
            物理视图包含:jspView、freemarkView等
        10)把数据显示到视图上,返回给用户
        
SpringMVC的请求和响应
        如何接受请求中的数据
            1)通过参数名获得数据
                在控制器方法中定义和表单元素name相同的参数
            2)通过@RequestParam("表单元素名称") 注解配置参数
                @RequestParam("username")String user
            3)通过对象获得表单参数
                对象类的属性名和表单元素名相同,将类作为参数
        如何将数据返回给页面
            1)可以将数据存入request或session中
            在方法的参数中定义HttpServletRequest或HttpSession参数
            2)可以将数据存入Map集合
            在参数中定义Map集合
            3)可以将数据存入到Model对象中
            在参数中定义Model对象,使用addAttribute("名称",值)添加数据
            4)可以通过流返回数据
            在参数中定义PrintWriter输出流
            
@ResponseBody和@RestController注解
    默认情况下,控制器方法的返回值控制跳转的页面名称
    Ajax和服务器的交互,需要得到具体的数据而不是页面
    在方法上添加@ResponseBody后,返回字符串会直接返回给浏览器
    注意:一般可以返回基本类型和String
        如果要返回自定义对象,可能出现HttpMessageNotWritableException: No converter found
        解决方法:添加Json解析的依赖
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
              <version>2.9.8</version>
            </dependency>
@RestController 继承了@Controller
用该注解定义的控制器,所有的方法都会默认添加@ResponseBody
等价于: @Controller + @ResponseBody
 
请求转发和重定向
    请求转发
    请求对象.getRequestDispatcher("URL").forward(请求对象,响应对象)、
    重定向
    响应对象.sendRedirect("URL")
    SpringMVC
    在返回的字符串中添加
        请求转发:"forward:url"
        重定向:"redirect:url"
        
拦截器
    类似于过滤器Filter
    作用:
        1)实现某些通用的操作,如:设置编码、缓存等
        2)实现权限控制,如:拦截未登录的用户
    与过滤器区别是:
        Filter属于服务器的
        拦截器属于Spring的,支持IOC、AOP等特性
    
    实现:
        1)实现HandlerInterceptor接口
        2)实现方法:
            boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                前置处理
                返回值用于控制是否拦截请求
                true 不拦截
                false 拦截
            postHandle 后置处理
            afterCompletion     处理完成
        3)注册拦截器
        <!--配置拦截器-->
            <mvc:interceptors>
                <!--配置一个拦截器-->
                <mvc:interceptor>
                    <!--配置拦截器拦截的URL-->
                    <mvc:mapping path="/**"/>
                    <!--配置不拦截的URL,必须在拦截URL后配置-->
                    <mvc:exclude-mapping path="/user/toLogin"/>
                    <!--配置拦截器的Bean-->
                    <bean class="com.qianfeng.springmvc.controller.FirstInterceptor"/>
                </mvc:interceptor>
                <!--配置一个拦截器-->
                <mvc:interceptor>
                    <!--配置拦截器拦截的URL-->
                    <mvc:mapping path="/user/list"/>
                    <!--配置拦截器的Bean-->
                    <bean class="com.qianfeng.springmvc.controller.SecondInterceptor"/>
                </mvc:interceptor>
            </mvc:interceptors>
        
    补充:外部静态资源的链接
        1)在tomcat的deployment中添加静态资源的目录
        2)配置基本的URL路径,所有资源以该路径为准
            <%
                //读取项目的路径
                String path = request.getContextPath();
                //getScheme ---> http:// getServerName ---> localhost ---> getServerPort ----> 8080 /
                String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
            %>
            <%--配置页面的基准URL,所有外部资源以此为准--%>
            <base href="<%=basePath%>">

             


           

Spring-MVC

标签:sch   区别   而不是   数据   youdao   alt   boolean   ast   ack   

原文地址:https://www.cnblogs.com/wffzk/p/13162038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!