一、SpringMVC简介
1、Servlet的毛病

1)应用Servlet进行开发,通常状况下,一个Servlet类解决一个申请,如果一个我的项目有成千盈百个申请须要解决,就须要创立成千盈百个Servlet来解决这些申请,Servlet类的个数暴增。2)在Servlet2.5及2.5之前的版本中,每一个Servlet须要在web.xml文件中至多8行以上的配置,在团队开发时,配置信息太多,也容易呈现问题3)Servlet中通过request获取申请参数,无论传过来的是什么值,接管时一律依照字符串进行接管,如果这个值是数值或者日期类型的值,前期还须要强制转换。    request.getParameter(String paramName)            String    request.getParameterValues(String paramName)    String[]4)Servlet须要依赖于服务器运行,不能进行单元测试。。。。

2、SpringMVC介绍

SpringMVC是Spring框架中的一个模块,是针对体现层提出来相应的解决方案SpringMVC是基于MVC设计模式的体现层框架。它没有齐全替换Servlet,底层也是通过Servlet来实现。    DispatcherServlet:前端控制器,用于接管散发申请给各个组件,由各个组件对申请进行解决,最初将解决的后果响应给浏览器。    DispatcherServlet须要在web.xml文件中进行配置。

3、SpringMVC执行过程

参考讲义

===============================================
二、SpringMVC的入门案例
√ 1、创立工程、导入jar包、创立配置文件

1)CGB-SPRINGMVC-01(Maven的Web工程)2)导入springmvc的jar包(包含spring的jar包)    以及Servlet、jsp的jar包3)提供src/main/resources/springmvc-config.xml

2、到web.xml文件中配置前端控制器(DispatcherServlet)

1)配置前端控制器servlet-class、url-pattern    配置前端控制器拦挡除JSP以外的所有申请。2)配置springmvc外围配置文件的地位    <init-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath:springmvc-config.xml</param-value>    </init-param>

3、创立 /WEB-INF/pages/home.jsp文件

  /WEB-INF/pages/test.jsp文件

4、创立一个Controller(HelloController)

com.tedu.controller.HelloController

5、配置springmvc的外围配置文件
6、编写HelloController类,实现需要,并运行测试!

---------------------------------------@Controller@RequestMapping("/HelloController")public class HelloController {    @RequestMapping("/hello")    public String testHello() {        return "xxx";    }}localhost:8080/CGB-SPRINGMVC-01/hw/hello---------------------------------------@Controllerpublic class HelloController {    @RequestMapping("/hello")    public String testHello() {        return "xxx";    }}localhost:8080/CGB-SPRINGMVC-01/hello---------------------------------------

三、SpringMVC参数绑定

1、简略类型参数绑定---------------------------------
1.1.需要:

浏览器申请:localhost:8080/CGB-SPRINGMVC-01/testParam1?name=张飞&age=20&addr=北京获取申请中的name、age、addr参数的值/* 1.简略类型参数绑定 * 浏览器申请: /testParam1?name=张飞&age=20&addr=北京 * 获取申请中携带的name、age、addr参数的值 */@RequestMapping("/testParam1")public String testParam1( String name,Integer age,String addr ) {    System.out.println( "name="+name );    System.out.println( "age="+age );    System.out.println( "addr="+addr );    return "home";}总结:这种接管申请参数的形式要求:(1)办法上形参的类型要和申请参数值的类型保持一致;(2)办法上形参的名字要和申请参数名保持一致;

2、包装类型参数绑定---------------------------------

浏览器申请:localhost:8080/CGB-SPRINGMVC-01/testParam2?name=刘备&age=22&addr=河北获取申请中的name、age、addr参数的值申明一个User类,在User类中申明name、age、addr属性,并提供对应的set和get办法/* 3.包装类型参数绑定 * 浏览器申请:/testParam2?name=刘备&age=22&addr=河北 * 获取申请中的name、age、addr参数的值 * 申明一个User类,在User类中申明name、age、addr属性,并提供对应的set和get办法 */@RequestMapping("/testParam2")public String testParam2( User user ) {    System.out.println( "name="+user.getName() );    System.out.println( "age="+user.getAge() );    System.out.println( "addr="+user.getAddr() );    return "home";}总结:这种接管申请参数的形式要求:在包装类型中的属性名和申请参数的名字保持一致(底层是调用包装类型的setXxx办法为xxx属性赋值,而赋的值来自于申请参数中名称为xxx参数的值)

3、日期类型参数绑定---------------------------------

浏览器申请:localhost:8080/CGB-SPRINGMVC-01/testParam3?birthday=2020-2-8 15:13:41获取申请中的date参数的值/* 4.日期类型的参数绑定 * 浏览器申请:/testParam4?date=2020-3-3 15:36:08 * 获取申请中的date参数的值 * HTTP Status 400 – Bad Request: 申请参数类型不匹配 *     因为springmvc框架底层默认的工夫格局是以斜杠(/)分隔,例如: *         /testParam3?birthday=2020/3/3 15:36:08 * 因而,解决形式一:将浏览器发送的日期格局改为斜杠分隔 * 解决形式二:将springmvc框架底层默认以斜杠分隔工夫改为用横杠分隔 *         留神:改为横杠分隔后,斜杠分隔的工夫在服务器端将无奈接管 */@RequestMapping("/testParam4")public String testParam4( Date date ) {    System.out.println( "date="+date );    return "home";}/* 自定义日期转换格局:将springmvc框架底层默认以斜杠分隔工夫改为用横杠分隔 */@InitBinderpublic void InitBinder (ServletRequestDataBinder binder){    binder.registerCustomEditor(java.util.Date.class,         new CustomDateEditor(                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true)    );}

三、SpringMVC的跳转和乱码解决

1、申请转发

/* 5.测试spring的申请转发 *         需要:从 /testForward 转发到 /hello  *         浏览器申请 /testForward --转发(地址不变)--> /hello *         /hello对应的办法 --转发(地址不变)--> home.jsp */@RequestMapping("/testForward")public String testForward() {    System.out.println( "testForward办法执行了...." );    return "forward:/hello";}申请转发总结:转发只能是同一个利用外部的资源之间进行跳转:(1)从Controller中的一个办法转发到另外一个办法:    return "forward:/办法上的映射门路";(2)从Controller中的办法转发JSP:    return "JSP的名字";

2、重定向

/* 5.测试spring的重定向 *         需要:从 /testRedirect 重定向到 /hello  *         浏览器申请 /testRedirect --重定向(地址会变)--> /hello *         /hello对应的办法 --转发(地址不变)--> home.jsp */@RequestMapping("/testRedirect")public String testRedirect() {    System.out.println( "testRedirect办法执行了...." );    //return "redirect:/hello";    return "redirect:http://www.baidu.com";}重定向总结:重定向在跳转时,没有限度(1)同一个利用中的controller办法跳转到另外一个办法:    return "redirect:/办法上的映射门路";(2)不同的两个Web利用之间的资源跳转: 从controller办法跳转到/day11/test.jsp    return "redirect:http://localhost/day11/test.jsp";(3)不同的服务器之间的资源跳转:从controller办法跳转到百度    return "redirect:http://www.baidu.com";

3、乱码解决

Servlet中:(1)如果是GET提交、并且tomcat为8.0当前的版本,tomcat底层曾经解决了GET提交的中文乱码问题,所以GET提交在tomcat8.0当前的版本中没有乱码!(2)如果是POST提交,无论是哪个版本的tomcat服务器,获取中文参数时都会有乱码问题,如何解决?    request.setCharacterEncoding("utf-8");springmvc中提供了解决POST提交中文参数乱码办法:在web.xml文件中配置一个乱码解决过滤器。过滤器的配置如下:<filter>    <filter-name>encodingFilter</filter-name>    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    <init-param>        <param-name>encoding</param-name>        <param-value>UTF8</param-value>    </init-param></filter><filter-mapping>    <filter-name>encodingFilter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>

四、SpringMVC响应数据

1、Model的应用

从Servlet带数据到JSP:(通过request域带数据)    request.setAttribute("xx", xxx);    request.getRequestDispatcher("xxx").forward(req,res);从Controller带数据到JSP:(通过Model带数据)    model.addAttribute("xx", xxx);    return "xxx";如果须要从Controller带数据到JSP,能够在Controller的办法上申明一个Model对象Model其实底层就是request域,能够将数据存入到Model域中,再通过转发将数据带到JSP,在JSP中取出数据进行显示!