• SpringMVC—笔记总结


    关于俺自己学习网课的笔记记录~

    1.SpringMVC

    • MVC:Model模型(dao,service) View视图(jsp) Controller控制器(servlet)

    • SpringMVC是Spring Framework的一部分,是基于java实现MVC的轻量级Web框架

    优点:

    • 轻量级,简单易学
    • 高效,基于请求响应的MVC框架
    • 与Spring兼容性好,无缝结合
    • 约定优于配置
    • 功能强大:RESTful、数据验证、格式化、本地化、主题等

    Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。

    DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解形式进行开发,十分简洁;

    正因为SpringMVC好 , 简单 , 便捷 , 易学 , 天生和Spring无缝集成(使用SpringIoC和Aop) , 使用约定优于配置 . 能够进行简单的junit测试 . 支持Restful风格 .异常处理 , 本地化 , 国际化 , 数据验证 , 类型转换 , 拦截器 等等…

    1.1Spring第一个程序

    Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。

    Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)

    使用配置来实现一个SpringMVC

    1.新建一个Moudle ,添加web支持

    2.导入了SpringMVC 的依赖

    <dependency>
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>4.12version>
    dependency>
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-webmvcartifactId>
        <version>5.1.9.RELEASEversion>
    dependency>
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>servlet-apiartifactId>
        <version>2.5version>
    dependency>
    <dependency>
        <groupId>javax.servlet.jspgroupId>
        <artifactId>jsp-apiartifactId>
        <version>2.2version>
    dependency>
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>jstlartifactId>
        <version>1.2version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3.配置web.xml,注册DispatcherServlet

    
    <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">
    
       
       <servlet>
           <servlet-name>springmvcservlet-name>
           <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
           
           <init-param>
               <param-name>contextConfigLocationparam-name>
               <param-value>classpath:springmvc-servlet.xmlparam-value>
           init-param>
           
           <load-on-startup>1load-on-startup>
       servlet>
    
       
       
       <servlet-mapping>
           <servlet-name>springmvcservlet-name>
           <url-pattern>/url-pattern>
       servlet-mapping>
    
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    4.编写SpringMVC 的 配置文件springmvc-servlet.xml

    
    <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.添加相应配置

    
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
    
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
       
       <property name="prefix" value="/WEB-INF/jsp/"/>
       
       <property name="suffix" value=".jsp"/>
    bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    6.编写要操作业务的Controller ,要么实现Controller接口,要么增加注解;需要返回一个ModelAndView,装数据,封视图

    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //注意:这里我们先导入Controller接口
    public class HelloController implements Controller {
    
       public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
           //ModelAndView 模型和视图
           ModelAndView mv = new ModelAndView();
    
           //封装对象,放在ModelAndView中。Model
           mv.addObject("msg","HelloSpringMVC!");
           //封装要跳转的视图,放在ModelAndView中
           mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
           return mv;
      }
       
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    7.将自己的类交给SpringIOC容器,注册bean

    
    
    • 1
    • 2

    8.写要跳转的jsp页面,显示ModelandView存放的数据,以及我们的正常页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
       Kuangshen
    
    
    ${msg}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    9.配置Tomcat 启动测试

    如果applicationcontext中的配置是/,则直接通过local:8080/hello即可跳转。

    注:如果测试发现页面跳转404,则可以检查:

    • 打开项目结构,在对应模块上查看WEB-INF目录下是否有lib包,没有的话手动创建一个,再添加依赖即可。

    在这里插入图片描述

    1.2Spring执行原理(配置版)

    在这里插入图片描述

    执行流程分析:

    1.DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

    • 我们假设请求的url为 : http://localhost:8080/SpringMVC/hello,可以将url拆分成三部分
      • http://localhost:8080:服务器域名
      • SpringMVC:部署在服务器上的web站点
      • hello:表示控制器

    2.HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。

    3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。

    4.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

    5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

    6.Handler让具体的Controller执行。

    7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。

    8.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

    9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

    10.视图解析器将解析的逻辑视图名传给DispatcherServlet。

    11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

    12.最终视图呈现给用户

    流程对应的代码分析:

    web.xml:里面需要配置DispatchServlet

    
    <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">
    
    
    
        <servlet>
            <servlet-name>springmvcservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    
            <init-param>
                <param-name>contextConfigLocationparam-name>
    
                <param-value>classpath:springmvc-servlet.xmlparam-value>
            init-param>
    
            <load-on-startup>1load-on-startup>
        servlet>
    
    
        <servlet-mapping>
            <servlet-name>springmvcservlet-name>
            <url-pattern>/url-pattern>
        servlet-mapping>
    
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    springmvc-servlet.xml:包括了流程中的2、3、4、5、6步

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
        
    
    
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
        <bean id="/hello" class="controller.HelloController"/>
        
    
    
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
    
    
            <property name="prefix" value="/WEB-INF/jsp/"/>
    
            <property name="suffix" value=".jsp"/>
        bean>
    
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    controller:包括了流程中的7、8步

    public class HelloController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView mv = new ModelAndView();
    
            //业务代码
            String result = "HelloSpringMVC";
            mv.addObject("msg",result);
    
            //视图跳转
            //当返回mv的时候,这个"test字符串会在springmvc-servlet.xml文件里面进行拼接成url"
            mv.setViewName("test");
    
            //7、8:处理完之后返回ModelAndView给DispatcherServlet
            return mv;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1.3注解版

    1.新建一个模块,添加web支持

    2.由于可能存在Maven资源过滤问题,将pom.xml配置文件进行完善

    <build>
        <resources>
            <resource>
                <directory>src/main/javadirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>falsefiltering>
            resource>
            <resource>
                <directory>src/main/resourcesdirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>falsefiltering>
            resource>
        resources>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.在pom.xml文件引入相关的依赖:主要有Spring框架核心库、Spring MVC、servlet , JSTL等

    <dependencies>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.11version>
        dependency>
    
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>5.1.9.RELEASEversion>
        dependency>
    
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>servlet-apiartifactId>
            <version>2.5version>
        dependency>
    
        <dependency>
            <groupId>javax.servlet.jspgroupId>
            <artifactId>jsp-apiartifactId>
            <version>2.2version>
        dependency>
    
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>jstlartifactId>
            <version>1.2version>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    4.配置web.xml

    
    <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">
    
        
        
        <servlet>
            <servlet-name>springmvcservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
            
            <init-param>
                <param-name>contextConfigLocationparam-name>
                
                <param-value>classpath:springmvc-servlet.xmlparam-value>
            init-param>
            
            <load-on-startup>1load-on-startup>
        servlet>
    
        
        <servlet-mapping>
            <servlet-name>springmvcservlet-name>
            <url-pattern>/url-pattern>
        servlet-mapping>
    
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    5.添加Spring MVC配置文件

    在resource目录下添加springmvc-servlet.xml配置文件,配置的形式与Spring容器配置基本类似,为了支持基于注解的IOC,设置了自动扫描包的功能,所以需要配置四个地方:

    • 让IOC的注解生效

    • 静态资源过滤 :HTML . JS . CSS . 图片 , 视频 …

    • MVC的注解驱动:相当于合并下面两个配置

      • 
            <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        
        • 1
        • 2
      • 
            <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        
        • 1
        • 2
    • 配置视图解析器

    完整如下:

    
    <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.kuang.controller"/>
    
        
        <mvc:default-servlet-handler />
    
        
        <mvc:annotation-driven />
    
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            
            <property name="prefix" value="/WEB-INF/jsp/" />
            
            <property name="suffix" value=".jsp" />
        bean>
    
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    6.创建Controller

    • @Controller是为了让Spring IOC容器初始化时自动扫描到
    • @RequestMapping是为了映射请求路径
    • 方法中声明Model类型的参数是为了把Action中的数据带到视图中
    • 方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成WEB-INF/jsp/hello.jsp

    编写一个Java控制类:controller.HelloController

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    //相当于自动在spring配置文件中配了个bean
    @Controller
    //如果在这里也有个@RequestMapping("/h1")的注解,则要访问到下面的方法路径就得是http://localhost:8080/h1/hello
    public class HelloController {
    
    //    /hello到时候就会自动跳转到hello.jsp的页面
        @RequestMapping("/hello")
        public String hello(Model model){
            //封装数据
            model.addAttribute("msg","Hello,SpringMVC");
    
            return "hello";//会被解析器处理
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    7.创建视图层

    • 在WEB-INF/ jsp目录中创建hello.jsp , 视图可以直接取出并展示从Controller带回的信息
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    
    ${msg}
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    8.部署好Tomcat,运行测试即可。

    2.Controller及RestFul风格

    2.1Controller控制器

    • 控制器复杂提供访问应用程序的行为,也可以通过接口定义或注解定义两种方法实现
    • 控制器负责解析用户的请求并将其转换为一个模型
    • 在Spring MVC中一个控制器类可以包含多个方法
    • 在Spring MVC中,对于Controller的配置方式有很多种

    2.2实现Controller接口

    1.创建Maven模块,添加web框架支持

    2.配置web.xml文件

    
    <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">
    
    
        <servlet>
            <servlet-name>springmvcservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    
            <init-param>
    
                <param-name>contextConfigLocationparam-name>
                <param-value>classpath:springmvc-servlet.xmlparam-value>
            init-param>
    
    
            <load-on-startup>1load-on-startup>
        servlet>
    
        <servlet-mapping>
            <servlet-name>springmvcservlet-name>
            <url-pattern>/url-pattern>
        servlet-mapping>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3.编写Spring配置文件springmvc-servlet.xml(只需要配一个视图解析器就行)

    
    <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">
    
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            
            <property name="prefix" value="/WEB-INF/jsp/" />
            
            <property name="suffix" value=".jsp" />
        bean>
    
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    4.编写实现Controller的类

    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //只要实现controller接口的类,这个类就是个controller
    public class ControllerTest1 implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView mv = new ModelAndView();
    
            mv.addObject("msg","ControllerTest1");
    
            return mv;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5.在spring配置文件中注册controller

    
        <bean name="/t1" class="controller.ControllerTest1"/>
    
    • 1
    • 2

    6.部署Tomcat测试即可

    缺点:

    一个控制器只有一个方法,如果多个方法则要定义多个Controller

    2.3使用注解@Controller

    • @Controller注解类型用于声明Spring类的实例是一个控制器
      • 在讲IOC时还有另外3个注解
        • @Component 组件
        • @Service service
        • @Repository dao
    • Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的控制器,需要在配置文件中声明组件扫描

    1.要在Spring配置文件设置注解生效的配置

    <context:component-scan base-package="controller"/>
    
    • 1

    2.编写Controller接口实现类

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    //代表这个类会被spring接管,注解类所有如果返回值是Stirng,并且有具体的页面跳转,则会被视图解析器解析
    @Controller
    public class ControllerTest2 {
    
        @RequestMapping("/t2")
        public String test(Model model){
            model.addAttribute("msg" ,"ControllerTest2");//设置信息内容是ControllerTest2
            return "test";//返回什么就会拼接地址成什么:WEB-INF/jsp/test.jsp
        }
    
        //当在跳转地址上输入t3,则该方法会将msg这个数据传给test.jsp这个页面,并跳转到test.jsp的页面
        @RequestMapping("/t3")
        public String test3(Model model){
            model.addAttribute("msg" ,"test3");
            return "test";//返回什么就会拼接地址成什么:WEB-INF/jsp/test.jsp
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3.测试即可。

    2.4RestFul风格

    • 概念:

      • Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
    • 功能:

      • 资源:互联网所有的事物都可以被抽象为资源
      • 资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
      • 分别对应 添加、 删除、修改、查询
    • 传统方式操作资源:

      • http://127.0.0.1/item/queryItem.action?id=1 查询,GET
      • http://127.0.0.1/item/saveItem.action 新增,POST
      • http://127.0.0.1/item/updateItem.action 更新,POST
      • http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
    • 使用RESTful:可以通过不同的请求方式来实现不同的效果

      • http://127.0.0.1/item/1 查询,GET
      • http://127.0.0.1/item 新增,POST
      • http://127.0.0.1/item 更新,PUT
      • http://127.0.0.1/item/1 删除,DELETE
    • 测试实现:

    直接编写一个新的Controller即可

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class RestFulController {
        //则在跳转时候需要传递参数:http://localhost:8080/add1?a=1&b=2
        @RequestMapping("/add1")
        public String test1(int a, int b, Model model){
            int res = a + b;
            model.addAttribute("msg","结果为" + res);
            return "test";
        }
    
        //RESTful:http://localhost:8080/add1/a/b
        @RequestMapping("/add2/{a}/{b}")
        //在传入参数前设置@PathVariable,则使用@RequestMapping的时候可以直接将路径上a和b的值赋值到方法里面
        public String test2(@PathVariable int a,@PathVariable int b, Model model){
            int res = a + b;
            model.addAttribute("msg","结果为" + res);
            return "test";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 使用method属性指定请求类型

      用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE

      //value也可以用path替代
      //method后是请求类型,默认是GET,也可以是RequestMethod.POST
      @RequestMapping(value = "/add2/{a}/{b}",method = RequestMethod.GET)
      //用GET方式也可以简化为
      @GetMapping("/add2/{a}/{b}")
      //用POST方式简化为
      @PostMapping("/add2/{a}/{b}")
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 当有两个方法@GetMapping和@PostMapping,然后路径一样,项目会优先调用GET方法

    • 假如前端有个表单,提交之后路径和Controller的方法里面返回的地址一样,则会跳到同一个页面。

    3.SpringMVC:结果跳转

    3.1ModelAndView

    设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面

    页面跳转地址 : {视图解析器前缀} + viewName(ModelAndView返回的参数) +{视图解析器后缀}

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
    
        mv.addObject("msg","ControllerTest1");
        mv.setViewName("test");
    
        return mv;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    对应的视图解析器:

    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/jsp/" />
        
        <property name="suffix" value=".jsp" />
    bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.2ServletAPI

    • 通过设置ServletAPI , 无需视图解析器

    1、通过HttpServletResponse进行输出

    2、通过HttpServletResponse实现重定向

    3、通过HttpServletResponse实现转发

    @Controller
    public class ModelTest1 {
    
        @RequestMapping("/m1")
        public String test(HttpServletRequest request, HttpServletResponse response){
            response.getWriter().println("Hello,Spring BY servlet API");
        }
        
        @RequestMapping("/m2")
        public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
            //重定向
            rsp.sendRedirect("/test.jsp");
        }
        
        @RequestMapping("/m3")
        public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
            //转发
            req.setAttribute("msg","/m3");
            req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 通过SpringMVC来实现转发和重定向 - 无需视图解析器

    将视图解析器注释掉

    @Controller
    public class ResultSpringMVC {
        @RequestMapping("m1")
        public String test1(){
            //转发
            return "/WEB-INF/jsp/test.jsp";
        }
     
        //当有视图解析器的时候继续使用forward和redirect,不会经过视图解析器
        @RequestMapping("m2")
        public String test2(){
            //转发二
            return "forward:/index.jsp";
        }
     
        //注:重定向不能访问WEB-INF目录下的资源
        @RequestMapping("m3")
        public String test3(){
            //重定向
            return "redirect:/index.jsp";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    注:重定向不能访问WEB-INF目录下的资源

    4.数据处理

    4.1处理提交的数据

    //localhost:8080/user/m1?username=xxx;
    @GetMapping("/t1")
    public String test1(@RequestParam("username") String name, Model model){
        //1.接受前端参数(url上传的参数名要和方法中的变量名一样才可以接受到数据)
        //要想变量名和url传输数据名字不一样,就要用上@RequestParam,注解里面的参数名要和url上数据的名字一样
        System.out.println(name);
    
        //2.将返回的结果传递给前端,一般都用Model传输
        model.addAttribute("msg",name);
    
        //3.视图跳转
        return "test";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.2提交数据是对象

    //前端接受的是一个对象:http://localhost:8080/user/t2?name=mike&id=1&age=15
    /*
    * 1.接受前端用户传递的参数,判断参数的名字,假设名字直接在方法上,可以直接使用
    * 2.假设传递的是一个对象,匹配User对象中的字段名,一致则匹配成功,否则失败*/
    @GetMapping("/t2")
    public String test2(User user){
        return "test";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.3数据显示到前端

    • 通过ModelAndView
    public class ControllerTest1 implements Controller {
     
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            //返回一个模型视图对象
            ModelAndView mv = new ModelAndView();
            mv.addObject("msg","ControllerTest1");
            mv.setViewName("test");
            return mv;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 通过ModelMap
    @RequestMapping("/hello")
    public String hello(@RequestParam("username") String name, ModelMap model){
        //封装要显示到视图中的数据
        //相当于req.setAttribute("name",name);
        model.addAttribute("name",name);
        System.out.println(name);
        return "hello";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 通过Model
    @RequestMapping("/ct2/hello")
    public String hello(@RequestParam("username") String name, Model model){
        //封装要显示到视图中的数据
        //相当于req.setAttribute("name",name);
        model.addAttribute("msg",name);
        System.out.println(name);
        return "test";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三种方法对比

    1.Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

    2.ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

    3.ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

    4.4数据乱码问题

    从前端接收的中文数据会乱码

    解决方案:

    1.在web.xml中配置过滤器

    <filter>
        <filter-name>encodingfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>utf-8param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>encodingfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.使用自定义的过滤器

    package com.kuang.filter;
     
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Map;
     
    /**
     * 解决get和post请求 全部乱码的过滤器
     */
    public class GenericEncodingFilter implements Filter {
     
        @Override
        public void destroy() {
        }
     
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            //处理response的字符编码
            HttpServletResponse myResponse=(HttpServletResponse) response;
            myResponse.setContentType("text/html;charset=UTF-8");
     
            // 转型为与协议相关对象
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            // 对request包装增强
            HttpServletRequest myrequest = new MyRequest(httpServletRequest);
            chain.doFilter(myrequest, response);
        }
     
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
     
    }
     
    //自定义request对象,HttpServletRequest的包装类
    class MyRequest extends HttpServletRequestWrapper {
     
        private HttpServletRequest request;
        //是否编码的标记
        private boolean hasEncode;
        //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
        public MyRequest(HttpServletRequest request) {
            super(request);// super必须写
            this.request = request;
        }
     
        // 对需要增强方法 进行覆盖
        @Override
        public Map getParameterMap() {
            // 先获得请求方式
            String method = request.getMethod();
            if (method.equalsIgnoreCase("post")) {
                // post请求
                try {
                    // 处理post乱码
                    request.setCharacterEncoding("utf-8");
                    return request.getParameterMap();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            } else if (method.equalsIgnoreCase("get")) {
                // get请求
                Map<String, String[]> parameterMap = request.getParameterMap();
                if (!hasEncode) { // 确保get手动编码逻辑只运行一次
                    for (String parameterName : parameterMap.keySet()) {
                        String[] values = parameterMap.get(parameterName);
                        if (values != null) {
                            for (int i = 0; i < values.length; i++) {
                                try {
                                    // 处理get乱码
                                    values[i] = new String(values[i]
                                            .getBytes("ISO-8859-1"), "utf-8");
                                } catch (UnsupportedEncodingException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                    hasEncode = true;
                }
                return parameterMap;
            }
            return super.getParameterMap();
        }
     
        //取一个值
        @Override
        public String getParameter(String name) {
            Map<String, String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            if (values == null) {
                return null;
            }
            return values[0]; // 取回参数的第一个值
        }
     
        //取所有值
        @Override
        public String[] getParameterValues(String name) {
            Map<String, String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            return values;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108

    再去web.xml配置过滤器,让过滤器映射的路径为自定义过滤器类的路径即可。

    5.JSON

    • JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
    • 采用完全独立于编程语言的文本格式来存储和表示数据。
    • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
    • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

    在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:

    • 对象表示为键值对,数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组

    JSON 键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值

    编写html文件就行测试:

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    
      <script type="text/javascript">
    
    <!--    编写一个JavaScript对象-->
      var user={
      name:"小胖",
        age:3,
        sex:"男"
      }
    
      //将js对象转换成json对象
      var json = JSON.stringify(user);
      //控制台输出结果
      console.log(json)
    
    
      //将JSON对象转换成JavaScript对象
      var obj = JSON.parse(json);
      console.log(obj)
      script>
    
    head>
    <body>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    输出结果如下:

    在这里插入图片描述

    5.1使用Jackson解析工具处理数据

    1.导入Jackson所需要的jar包:

    
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-databindartifactId>
        <version>2.9.8version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.在spring配置文件启动注解生效以及视图解析器:

        
        <context:component-scan base-package="com.kuang.controller"/>
     
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            
            <property name="prefix" value="/WEB-INF/jsp/" />
            
            <property name="suffix" value=".jsp" />
        bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.使用ObjectMapper来处理数据(将数据转为字符串)

    //使用produces来解决中文乱码
    @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
    @ResponseBody//有这个注解就不会走视图解析器,会直接返回一个字符串
    public String json1() throws Exception{
    
        //jackson,objectMapper
        ObjectMapper mapper = new ObjectMapper();
    
        //创建一个对象
        User user = new User("小胖", 5, "男");
    
        //writeValueAsString可以将传入的数据变成字符串
        String str = mapper.writeValueAsString(user);
        return str;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 处理的数据为多个对象的时候:
    @RequestMapping("/j2")
    public String json2() throws Exception{
        ObjectMapper mapper = new ObjectMapper();
    
        List<User> userList = new ArrayList<User>();
    
        User user1 = new User("一号",3,"男");
        User user2 = new User("二号",3,"男");
        User user3 = new User("三号",3,"男");
    
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        String str = mapper.writeValueAsString(userList);
        return str;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 处理日期类型的数据:
      • 1.使用SimpleDateFormat自定义日期格式
      • 2.使用json配置自定义日期格式
    @RequestMapping("/j3")
    public String json3() throws Exception{
        ObjectMapper mapper = new ObjectMapper();
        Date date = new Date();
    
        //1.自定义日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //然后使用mapper.writeValueAsString(sdf.format(date))即可
    
    
        //2.使用json自定义时间格式
        //关闭默认的转换为时间戳的方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //再自定义json的时间格式即可
        mapper.setDateFormat(sdf);
        //objectmapper,时间解析后的默认格式为TimeStamp(时间戳)
        String str = mapper.writeValueAsString(date);
        return str;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.2解决json中的中文乱码问题

    1.通过@RequestMaping的produces属性来实现

    //使用produces来解决中文乱码
    @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
    
    • 1
    • 2

    2.修改springmvc的配置文件

    • 添加下面的配置到spring配置文件
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    bean>
                property>
            bean>
        mvc:message-converters>
    mvc:annotation-driven>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    5.3Fastjson

    1.导入包

    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>fastjsonartifactId>
        <version>1.2.60version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.Fastjson三大主要类

    • JSONObject 代表 json 对象

      • JSONObject实现了Map接口, 猜想 JSONObject底层操作是由Map实现的。
      • JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
    • JSONArray 代表 json 对象数组

      • 内部是有List接口中的方法来完成操作的。
    • JSON代表 JSONObject和JSONArray的转化

      • JSON类源码分析与使用
      • 仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
    package com.kuang.controller;
     
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.kuang.pojo.User;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class FastJsonDemo {
        public static void main(String[] args) {
            //创建一个对象
            User user1 = new User("一号", 3, "男");
            User user2 = new User("二号", 3, "男");
            User user3 = new User("三号", 3, "男");
            User user4 = new User("四号", 3, "男");
            List<User> list = new ArrayList<User>();
            list.add(user1);
            list.add(user2);
            list.add(user3);
            list.add(user4);
     
            //toJSONString方法
            System.out.println("*******Java对象 转 JSON字符串*******");
            String str1 = JSON.toJSONString(list);
            System.out.println("JSON.toJSONString(list)==>"+str1);
            String str2 = JSON.toJSONString(user1);
            System.out.println("JSON.toJSONString(user1)==>"+str2);
     
            //parseObject方法
            System.out.println("\n****** JSON字符串 转 Java对象*******");
            User jp_user1=JSON.parseObject(str2,User.class);
            System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
     
            //toJSON方法
            System.out.println("\n****** Java对象 转 JSON对象 ******");
            JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
            System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
     
            System.out.println("\n****** JSON对象 转 Java对象 ******");
            User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
            System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    6.Ajax

    • Ajax= 异步的 JavaScript 和 XML。
    • Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
    • Ajax不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术
    • 使用Ajax技术的网页,通过在后台服务器进行少量的数据交换,就可以实现异步局部更新。
    • 使用Ajax,用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面。

    6.1Ajax测试

    1.创建新模块,添加web框架支持

    2.编写好web.xml和spring的配置文件(DispatcherServlet,encodingFilter(编码过滤器),InternalResourceViewResolver(视图解析器),annotation-driven(注解驱动),component-scan(自动扫描包))

    3.编写一个控制器

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import pojo.User;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    @RestController
    public class AjaxController {
    
    //    相当于是一个请求类
        @RequestMapping("/a1")
    //    响应类的作用是把数据传回前端
        public void a1(String name, HttpServletResponse response) throws IOException {
            System.out.println("a1=>" + name);
            if("xiaopan".equals(name)){
                response.getWriter().print("true");
            }else{
                response.getWriter().print("false");
            }
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3.JQuery的用法:

    ​ 3.1导入jquery的包

    在这里插入图片描述

    在测试的网页上导入,下面两种方法都行

    <script src="https://code.jquery.com/jquery-3.1.1.min.js">script>
    
    <script src="${pageContext.request.contextPath}/statics/js/jquery-3.1.1.min.js">script>
    
    • 1
    • 2
    • 3

    ​ 3.2jquery的用法

    jQuery.ajax(...)
           部分参数:
                  url:请求地址
                 type:请求方式,GET、POST(1.9.0之后用method)
              headers:请求头
                 data:要发送的数据
          contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8")
                async:是否异步
              timeout:设置请求超时时间(毫秒)
           beforeSend:发送请求前执行的函数(全局)
             complete:完成之后执行的回调函数(全局)
              success:成功之后执行的回调函数(全局)
                error:失败之后执行的回调函数(全局)
              accepts:通过请求头发送给服务器,告诉服务器当前客户端可接受的数据类型
             dataType:将服务器端返回的数据转换成指定类型
                "xml": 将服务器端返回的内容转换成xml格式
               "text": 将服务器端返回的内容转换成普通文本格式
               "html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
             "script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
               "json": 将服务器端返回的内容转换成相应的JavaScript对象
              "jsonp": JSONP 格式使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4.编写index.jsp进行测试

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        $Title$
        
    <%--    我用这种方法回报错。。--%>
        
    
    
    
    <%--onblur:失去焦点触发事件--%>
    用户名:
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    7.拦截器

    SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

    过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

    过滤器

    • servlet规范中的一部分,任何java web工程都可以使用

    • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

    拦截器

    • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用

    • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

    测试:

    1.创建一个新模块添加web支持

    2.导入springmvc配置文件,编写好web.xml

    3.编写拦截器类

    该类实现HandlerInterceptor方法,可以重写三个方法:

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
    
        //在请求处理的方法之前执行
        //如果返回true执行下一个拦截器
        //如果返回false就不执行下一个拦截器
        public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
            System.out.println("------------处理前------------");
            return true;
        }
    
        //在请求处理方法执行之后执行
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            System.out.println("------------处理后------------");
        }
    
        //在dispatcherServlet处理后执行,做清理工作.
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
            System.out.println("------------清理------------");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    4.在springmvc配置文件上配置拦截器

    ceshixxxxxxxxxx     <mvc:interceptors>        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean class="config.MyInterceptor"/>        mvc:interceptor>    mvc:interceptors>xml
    
    • 1

    5.测试获得结果

    在这里插入图片描述

    8.文件上传和下载

    8.1文件上传

    1.导入web.xml依赖

    
    <dependency>
        <groupId>commons-fileuploadgroupId>
        <artifactId>commons-fileuploadartifactId>
        <version>1.3.3version>
    dependency>
    
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>javax.servlet-apiartifactId>
        <version>4.0.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.配置bean:multipartResolver

    
    <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        
        <property name="defaultEncoding" value="utf-8"/>
        
        <property name="maxUploadSize" value="10485760"/>
        <property name="maxInMemorySize" value="40960"/>
    bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • CommonsMultipartFile 的 常用方法:
      • String getOriginalFilename():获取上传文件的原名
      • InputStream getInputStream():获取文件流
      • void transferTo(File dest):将上传文件保存到一个目录文件中

    3.编写前端的页面

    <form action="/upload" enctype="multipart/form-data" method="post">
      <input type="file" name="file"/>
      <input type="submit" value="upload">
    form>
    
    • 1
    • 2
    • 3
    • 4

    4.编写controller类

    ​ 4.1使用普通的controller

    package controller;
     
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.commons.CommonsMultipartFile;
     
    import javax.servlet.http.HttpServletRequest;
    import java.io.*;
     
    @Controller
    public class FileController {
        //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
        //批量上传CommonsMultipartFile则为数组即可
        @RequestMapping("/upload")
        public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {
     
            //获取文件名 : file.getOriginalFilename();
            String uploadFileName = file.getOriginalFilename();
     
            //如果文件名为空,直接回到首页!
            if ("".equals(uploadFileName)){
                return "redirect:/index.jsp";
            }
            System.out.println("上传文件名 : "+uploadFileName);
     
            //上传路径保存设置
            String path = request.getServletContext().getRealPath("/upload");
            //如果路径不存在,创建一个
            File realPath = new File(path);
            if (!realPath.exists()){
                realPath.mkdir();
            }
            System.out.println("上传文件保存地址:"+realPath);
     
            InputStream is = file.getInputStream(); //文件输入流
            OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流
     
            //读取写出
            int len=0;
            byte[] buffer = new byte[1024];
            while ((len=is.read(buffer))!=-1){
                os.write(buffer,0,len);
                os.flush();
            }
            os.close();
            is.close();
            return "redirect:/index.jsp";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    ​ 4.2采用file.Transto 来保存上传的文件

    /*
     * 采用file.Transto 来保存上传的文件
     */
    @RequestMapping("/upload2")
    public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
     
        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if (!realPath.exists()){
            realPath.mkdir();
        }
        //上传文件地址
        System.out.println("上传文件保存地址:"+realPath);
     
        //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
        file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));
     
        return "redirect:/index.jsp";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    8.2文件下载

    步骤:

    1、设置 response 响应头

    2、读取文件 – InputStream

    3、写出文件 – OutputStream

    4、执行操作

    5、关闭流 (先开后关)

    测试:

    @RequestMapping(value="/download")
    public String downloads(HttpServletResponse response ,HttpServletRequest request) throws Exception{
        //要下载的图片地址
        String  path = request.getServletContext().getRealPath("/upload");
        String  fileName = "基础语法.jpg";
     
        //1、设置response 响应头
        response.reset(); //设置页面不缓存,清空buffer
        response.setCharacterEncoding("UTF-8"); //字符编码
        response.setContentType("multipart/form-data"); //二进制传输数据
        //设置响应头
        response.setHeader("Content-Disposition",
                "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));
     
        File file = new File(path,fileName);
        //2、 读取文件--输入流
        InputStream input=new FileInputStream(file);
        //3、 写出文件--输出流
        OutputStream out = response.getOutputStream();
     
        byte[] buff =new byte[1024];
        int index=0;
        //4、执行 写出操作
        while((index= input.read(buff))!= -1){
            out.write(buff, 0, index);
            out.flush();
        }
        out.close();
        input.close();
        return null;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    FRP进阶篇之安全认证
    windows下Python将程序打包成exe文件
    Windows cmd窗口常用命令
    [每周一更]-(第62期):SRE 是什么?
    大数据运维实战第十三课 Spark Standalone 模式的构建以及 Spark 与 Yarn 的整合
    [WesternCTF2018]shrine
    容器相关的概念
    前端静态页面基本开发思路(一)
    基于istio实现多集群流量治理
    【opencv】dnn示例-scene_text_detection.cpp 场景文本区域检测
  • 原文地址:https://blog.csdn.net/hanpiyo/article/details/127835177