SpringMVC

Springmvc学习

一. 框架的搭建

1. 加入依赖坐标
 <dependencies>
    <!-- junit的jar包坐标 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <!-- mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.9</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.3.7.RELEASE</version>
      <scope>test</scope>
    </dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <!--MyBatis整合spring-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
    <dependency>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-core</artifactId>
      <version>1.3.5</version>
    </dependency>
<!--pojo转换成 json -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.7.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.7.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.7.3</version>
    </dependency>
  
</dependencies>




  <build>
    <finalName>SpringMvc_01</finalName>
    <!--<pluginManagement>--><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- 配置tomcat插件 -->
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <configuration>
            <path>/</path>
            <port>8080</port>
            <uriEncoding>UTF-8</uriEncoding>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    <!--</pluginManagement>-->
  </build>
</project>

2.配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

<!-- 加载spring配置文件 -->
<!-- 关联到spring主配置文件的路径地址  classpath根目录-->
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>

        <!-- 配置监听器加载spring的配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
        <!-- 配置过滤器,过滤编码格式 为utf-8,只支持post提交-->
<filter>
  <filter-name>CharacterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <!--异步支持  -->
  <async-supported>true</async-supported>
  <!-- 初始化 编码格式为UTF-8,只适用于post提交-->
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
        <!-- 加载springmvc配置文件 -->
        <!-- 配置DispatcherServlet,来加载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:mvc/SpringMvc.xml</param-value>
  </init-param>
  <!-- 启动优先加载 -->
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>DispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>

3.Springmvc核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启注解驱动 -->
    <context:component-scan base-package="com.kgc.controller"></context:component-scan>

    <!-- 开启mvc注解驱动 -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
               <constructor-arg value="UTF-8" /><!--解决@responsebody响应中文乱码-->
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <mvc:default-servlet-handler/>
    <!-- 视图解析器  location表示路径地址 -->

   <!-- <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/js/**" location="/js/"/>
    <mvc:resources mapping="/jsp/**" location="/jsp/"/>
    <mvc:resources mapping="/html/**" location="/html/"/>-->


    <!-- 处理jsp页面所在的前缀和后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀,确定当前访问的页面路径地址 -->
        <property name="prefix">
            <value>/WEB-INF/jsp/</value><!-- 放在WEB-INF文件夹之下的page文件夹 -->
        </property>
        <!-- 后缀,确定要访问的文件类型 -->
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
</beans>
 
4. 添加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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 1.开启spring注解驱动 -->
    <context:component-scan base-package="com.kgc.service"></context:component-scan>
    <!-- 2.读取properties -->
    <context:property-placeholder location="classpath:properties/db.properties"/>

    <!--3. 配置数据库连接池 c3p0 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
        <property name="driverClass" value="${jdbc.driver}"/>
        <!-- 配置Jdbc的Url -->
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <!-- 配置用户名 -->
        <property name="user" value="${jdbc.username}"/>
        <!-- 密码 -->
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!-- 4.配置事务管理器 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 事务管理数据库连接池 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--5. 开启事务的注解驱动 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- 6.spring管理mybatis配置文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--dataSource属性指定要用到的连接池 ref映射的是id=dataSource的bean标签,读取连接数据库信息-->
        <property name="dataSource" ref="dataSource"/>
        <!--configLocation属性指定mybatis的核心配置文件,管理mybatis配置文件-->
        <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml" />
        <!-- 所有配置的mapper文件,mybatis的实体类配置文件所有的sql映射文件 -->
        <!--<property name="mapperLocations" value="classpath:mapper/*.xml"></property>-->
    </bean>

    <!-- 7.spring管理mybatis映射接口和sql映射文件之间关联关系 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.kgc.mapper" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>
</beans>

5. 添加mybatis核心配置文件
<?xml version="1.0"   encoding="UTF-8"?>
<!DOCTYPE configuration   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <!--    可以在控制台输出日志信息:sql语句和参数 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!-- 表示类型别名   库-->
    <typeAliases>
        <!-- 每一个类型的别名  type属性表示别名对应的类型地址 alias表示起的别名-->
        <typeAlias type="java.util.List" alias="list"/>
        <!-- package表示包,利用包的形式进行扫描包之下的所有的类,别名就是当前类名 -->
        <package name="com.kgc.pojo"/>
    </typeAliases>

    <!-- 分页插件 -->
    <!-- <plugins>            
         <plugin interceptor="com.github.pagehelper.PageInterceptor">                           	3.3.0版本可用 - 分页参数合理化,默认false禁用         
           pageNum表示当前页  pages表示尾页         
          true启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页                     false禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据            
         <property name="reasonable"   value="true"/>    
       </plugin>        
     </plugins> -->
    
</configuration>
6.分析配置文件关联关系

二. Springmvc知识

1. Spring和springmvc关系
  1. Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。
  • 简单点的话可以将SpringMVC类比于servlet
  1. Spring可以说是一个管理bean的容器,也可以说是包括很多开源项目的总称,spring mvc是其中一个开源项目,所以简单走个流程的话,http请求一到,由容器(如:tomact)解析http搞成一个request,通过映射关系(路径,方法,参数)被spring mvc一个分发器去找到可以处理这个请求的bean,那tomcat里面就有spring管理bean的一个池子(bean容器)里面找到,处理完了就把响应返回回去。

  2. SpringMVC是一个MVC模式的WEB开发框架;

  3. Spring是一个通用解决方案, 最大的用处就是通过Ioc/AOP解耦, 降低软件复杂性, 所以Spring可以结合SpringMVC等很多其他解决方案一起使用, 不仅仅只适用于WEB开发

2.DispatcherServlet 处理流程
  • 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作。在看 DispatcherServlet 类之前,我们先来看一下请求处理的大致流程:
  1. Tomcat 启动,对 DispatcherServlet 进行实例化,然后调用它的 init() 方法进行初始化,在这个初始化过程中完成了:
  • 对 web.xml 中初始化参数的加载;
  • 建立 WebApplicationContext (SpringMVC的IOC容器);
  • 进行组件的初始化;
  1. 客户端发出请求,由 Tomcat 接收到这个请求,如果匹配 DispatcherServlet 在 web.xml 中配置的映射路径,Tomcat 就将请求转交给 DispatcherServlet 处理;

  2. DispatcherServlet 从容器中取出所有 HandlerMapping 实例(每个实例对应一个 HandlerMapping 接口的实现类)并遍历,每个 HandlerMapping 会根据请求信息,通过自己实现类中的方式去找到处理该请求的 Handler (执行程序,如Controller中的方法),并且将这个 Handler 与一堆 HandlerInterceptor (拦截器) 封装成一个 HandlerExecutionChain 对象,一旦有一个 HandlerMapping 可以找到 Handler 则退出循环;(详情可以看[ Java]SpringMVC工作原理之二:HandlerMapping和HandlerAdpater 这篇文章)

  3. DispatcherServlet 取出 HandlerAdapter 组件,根据已经找到的 Handler,再从所有 HandlerAdapter 中找到可以处理该 Handler 的 HandlerAdapter 对象;

  4. 执行 HandlerExecutionChain 中所有拦截器的 preHandler() 方法,然后再利用 HandlerAdapter 执行 Handler ,执行完成得到 ModelAndView,再依次调用拦截器的 postHandler() 方法;

  5. 利用 ViewResolver 将 ModelAndView 或是 Exception(可解析成 ModelAndView)解析成 View,然后 View 会调用 render() 方法再根据 ModelAndView 中的数据渲染出页面;

  6. 最后再依次调用拦截器的 afterCompletion() 方法,这一次请求就结束了。

3. Springmvc工作机制:
  1. 用户发送请求至前端控制器DispatcherServlet。

  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。

  3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

  4. DispatcherServlet调用HandlerAdapter处理器适配器。

  5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

  6. Controller执行完成返回ModelAndView。

  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

  9. ViewReslover解析后返回具体View。

  10. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

  11. DispatcherServlet响应用户。

4.Springmvc工作原理图

三. Springmvc操作

1. 类的注解
  1. @controller:用于标注控制层类的注解

  2. @service:用于标注业务层组件

  3. @repository:注解数据访问层

  4. @Component 应用于任何层

2. 属性的注解
  1. @Autowired 自动装配,修饰属性

  2. @resource 根据名称注解属性

3. springmvc特有注解
  1. @requestMapping()注解 (其实就是起别名),可以修饰类或者方法;@RequestMapping”请求路径映射,如果标注在某个controller的类级别上,则表明访问此类路径下的方法都要加上其配置的路径;最常用是标注在方法上,表明哪个具体的方法来接受处理某次请求。如果类上没有该注解,只是在方法之上有该注解,那么在浏览器请求的时候url=localhost:8080/方法请求映射名称

  2. @RequestParam()请求参数注解,应用在方法的参数中

  • @requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(“name”),它有三个常用参数:
    • defaultValue = “0”, required = false, value = “isApp”;

    • defaultValue 表示设置默认值,

    • required 通过boolean设置是否是必须要传入的参数,true表示必须传入,如果不传则为null,

      如果为null,则报异常。

    • value 值表示接收的传入的参数名称

  1. @DateTimeFormat(pattern=“yyyy-MM-dd”)注解date时间格式把国际格式改为中文格式,应用于pojo类的date类型属性之上
  2. 参数注解
  • @PathVariable只能修饰从路径中获取的参数,用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数
案例–获取参数

1.测试post和get方式提交参数

  • controller
//测试post
    @RequestMapping(value = "test4",method = RequestMethod.POST)
    public void test4(@RequestParam(name = "name")String name1,
                      @RequestParam(name = "age") int age1,
                      @DateTimeFormat(pattern = "yyyy-MM-dd") Date birth){
        System.out.println(name1);
        System.out.println(age1);
        System.out.println(birth);
    }
  • jsp
<form method="post" action="/test4">
    <input type="text" name="name"><br>
    <input type="text" name="age"><br>
    <input type="date" name="birth"><br>
    <input type="submit" value="提交">
</form>

2.一次性获取所有的请求参数

 //测试--一次性获取所有的请求参数
    @RequestMapping(value = "test6",method = RequestMethod.POST)
    public void test6(@RequestParam Map map){
        Set<Map.Entry> set = map.entrySet();
        for(Map.Entry entry:set){
            System.out.println(entry.getKey()+"--"+entry.getValue());
        }
    }

3.获取rest风格请求参数

@RequestMapping(value = "/test7/{name}")
    public void test3(@PathVariable String name){
        System.out.println(name);    
    }
  1. @ResponseBody(意思就是把传入的参数类型转化为json或者xml格式),应用于方法之上,适用于ajax后台

    该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

  • 使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

  • 其实就是为了把传出或者传入的参数类型转变成json,xml类型

案例–响应正文
  1. 响应字符串
 //测试响应正文
    @RequestMapping(value = "test8",produces = "text/html;charset=utf-8")
    @ResponseBody
    public String test8(){
        return "你好";
    }
  1. 以json格式响应pojo对象
  • 导入jackson包
<!--pojo转换成 json -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.7.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.7.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.7.3</version>
    </dependency>
  • 在springmvc配置类型转化配置
<!-- 开启mvc注解驱动 -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
               <constructor-arg value="UTF-8" /><!--解决response响应中文乱码-->
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </mvc:message-converters>
    </mvc:annotation-driven>
  • 代码演示
@RequestMapping("/test2")
    @ResponseBody
    public User test2(){
        User user = new User();
        user.setName("李白");
        return user;
    }
  • 展示效果

[外链图片转存失败(img-wuKibtXk-1564973616040)(C:\Users\CX\AppData\Roaming\Typora\typora-user-images\1556548396761.png)]

案例–页面跳转
1. String类型
  • Model接口类型:模型,用来承载数据,

  • Servlet形式承载数据

//方法的请求映射,利用model传值
	@RequestMapping("/test1.do")
	public String test1(Model model){
		//把数据k-v保存在model类中,其实保存在request作用域中
		model.addAttribute("message", "错误信息");
		return "test";//渲染视图,跳页面
	}
	//利用servlet传值
	@RequestMapping("/test2.do")
	public String test2(HttpServletRequest request){
		request.setAttribute("message", "serlvet请求信息");
		request.getSession().setAttribute("aa", "session信息");
		request.getSession().getServletContext().setAttribute("bb", "application");
		return "test";
	}

2. ModelAndView类型
  • 表示模型与视图,既可以进行传值,又可以进行渲染视图
//方法的请求映射,ModelAndView
	@RequestMapping("/test3.do")
	public ModelAndView test3(ModelAndView mav){
		mav.addObject("message", "成功信息");
		mav.setViewName("test");//渲染视图,跳页面
		return mav;
	}
	//方法的请求映射,ModelAndView
	@RequestMapping("/test4.do")
	public ModelAndView test4(){
		ModelAndView mav=new ModelAndView("test");
		mav.addObject("message", "成功信息");
		mav.setViewName("test");//渲染视图,跳页面
			return mav;
	}

  • 所有的存储数据model,modelMap,modelAndView默认保存在request作用域中
  • model和modelMap,modelAndView的区别
课堂案例:
1.获取请求参数
@Controller
public class TestController {

    @RequestMapping("/test1")//如果不使用@RequestParam,方法的形参和url中的参数 名一致
    public void test1(String name){
        System.out.println(name);
        System.out.println("ssm整合1");
    }

    @RequestMapping("/test2")//@RequestParam(name = "name") a=request.getParameter("name")
    public void test2(@RequestParam(name = "name")String a){
        System.out.println(a);
        System.out.println("ssm整合2");
    }

    @RequestMapping(value = "/testPost",method = RequestMethod.POST)//测试post提交
    public void testPost(String name, int age, @DateTimeFormat(pattern = "yyyy-MM-dd") Date birth){
        System.out.println(name);
        System.out.println(age);
        System.out.println(birth);
    }

    @RequestMapping(value ="/testGET",method = RequestMethod.GET)//测试get提交
    public void testMap(@RequestParam Map map){
        Set<Map.Entry> set = map.entrySet();
        for(Map.Entry entry:set){
            System.out.println(entry.getKey()+"--"+entry.getValue());
        }
    }
    @RequestMapping(value ="/testUser")//测试get提交 自动检测
    public void testUser(User user){
        System.out.println(user);
    }
    //rest风格 请求参数 
   @RequestMapping("/testRest/{name1}/{age}/{birth}")//参数名不在url中,在注解的路径里
    public void testRest(@PathVariable String name1,
                         @PathVariable int age,
                         @PathVariable String birth){
        System.out.println(name1);
        System.out.println(age);
        System.out.println(birth);
    }
}

2.响应正文和页面跳转
@Controller
@RequestMapping("/con1")
public class TestController1 {

    @RequestMapping("/test1")
    @ResponseBody //response.getWriter.write("hello ssm")
    public String test1(){
        return "hello ssm";
    }
    @RequestMapping("/test2")
    @ResponseBody //response.getWriter.write(u)
    public User test2(){
        User u = new User();
        u.setName("黑冰");
        u.setAge(19);
        return u;
    }
//上面是响应正文 下面是页面的跳转

    @RequestMapping("/test3")//测试页面跳转 :model  modelMap  dodelAndView
    public String test3(Model model, ModelMap map){
        model.addAttribute("name","红冰");
        map.addAttribute("name1","黄冰");
        //request  域中
        return "test";//自动拼接前后缀 转发 到 对应的jsp
    }

    @RequestMapping("/test4")//测试页面跳转 :model  modelMap  dodelAndView
    public ModelAndView test4(ModelAndView mav){//ModelAndView:1.Model 向request域中添加参数 2.View:jsp名字
        //1.Model 向request域中添加参数
        mav.addObject("name2","冰冰");
        //2.封装jsp逻辑视图名
        mav.setViewName("test");
        return mav;  //自动拼接前后缀 转发 到 对应的jsp
    }
    //重定向
    @RequestMapping("/test5")
    public String test5(Model m){
        //1.向request域中添加参数
        m.addAttribute("name3","3冰冰");
        //return "redirect:/";  //重定向 时 request域失效 ,model中的参数作为url的请求参数
        return "redirect:test4";//重定向的路径:1.非web-inf下的jsp 2.其它的RequestMapping路径
    }


}
  • jsp请求页面
<form action="/testPost" method="post">
    <input type="text" name="name"><br>
    <input type="text" name="age"><br>
    <input type="date" name="birth"><br>
    <input type="submit" value="提交">
</form>

<h1><a href="/testGET?name=白冰&age=6&birth=2001-10-12">测试get请求</a></h1>

<h1><a href="/testUser?name=白冰&age=6&birth=2001-10-12">测试get请求--用pojo对象接收参数</a></h1>
<%--1. ?变成/ 2.不写参数名 --%>
<h1><a href="/testRest/白冰/16/2014-15-16">测试rest风格提交参数</a></h1>


<h1>name:${name}</h1>
<h1>name1:${name1}</h1>
5.编码格式–乱码处理
  • get请求乱码 --pom.xml

    <!-- 配置tomcat插件 -->
            <plugin>
              <groupId>org.apache.tomcat.maven</groupId>
              <artifactId>tomcat7-maven-plugin</artifactId>
              <configuration>
                <path>/</path>
                <port>8080</port>
                <uriEncoding>UTF-8</uriEncoding>
              </configuration>
            </plugin>
    
  • post请求乱码–web.xml

    <!-- 配置过滤器,过滤编码格式 为utf-8,只支持post提交-->
    <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <!--异步支持  -->
      <async-supported>true</async-supported>
      <!-- 初始化 编码格式为UTF-8,只适用于post提交-->
      <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
    </filter>
    <filter-mapping>
        
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  • @responsebody响应乱码–springmvc.xml

<!-- 开启mvc注解驱动 -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
               <constructor-arg value="UTF-8" /><!--解决response响应中文乱码-->
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </mvc:message-converters>
    </mvc:annotation-driven>

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值