关于spring:SpringMVC

17次阅读

共计 5392 个字符,预计需要花费 14 分钟才能阅读完成。

一、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 中取出数据进行显示!
正文完
 0