SpringMVC

简介: MVC

一、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文件中进行配置。

===============================================
二、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-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-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>

四、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中取出数据进行显示!

目录
相关文章
|
JSON JavaScript 前端开发
|
XML 运维 前端开发
|
前端开发 Java 程序员
|
缓存 前端开发 Java
|
XML JSON fastjson
|
3月前
|
XML 前端开发 JavaScript
SpringMVC(一)(4)
SpringMVC(一)(4)
23 0
SpringMVC(一)(4)
|
3月前
|
前端开发 Java Maven
SpringMVC(一)(1)
SpringMVC(一)(1)
19 0
|
4月前
|
JSON 前端开发 JavaScript
|
5月前
|
存储 JSON 安全
SpringMVC 02
SpringMVC 02
28 0
|
5月前
|
前端开发 Java API