关于spring:SpringMVC

一、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
---------------------------------------
@Controller
public 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框架底层默认以斜杠分隔工夫改为用横杠分隔 */
@InitBinder
public 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中取出数据进行显示!


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理