第二阶段(九)——SpringMVC框架总结

一、SpringMVC设计模式

1、模式一(Model One):JSP(只使用JSP进行开发)
Servlet:本质是一段Java程序,适合处理业务逻辑,但是Servlet不适合输出一个html网页(因为在Servlet中输出网页,得通过response获取流,通过out.write一行一行将html标签等内容输出到浏览器中)

Html:是用于开发网页的语言,适合作为网页输出,但是html是一个静态Web资源,无法展示动态的数据

JSP:也是开发网页的语言,也可以输出一个网页(html),并且JSP中可以书写Java代码(或者JSP标签,其实底层也是Java代码)展示动态数据。
JSP的出现既解决了Servlet不适合输出网页的问题,同时也解决了HTML无法展示动态数据的问题!
在一些中小型项目中只用JSP进行开发(持续了一段时间),JSP负责的工作:
(1)获取请求中携带的数据,对请求进行处理
(2)如果在处理的过程中需要访问数据库,JSP中可以书写Java代码访问数据库
(3)请求处理的结果仍然是由JSP负责响应
JSP中要处理很多的内容,必然要写很多Java代码,这样会导致JSP内部的HTML代码和Java代码混杂在一起,造成JSP页面结构的混乱,可读性变差,后期难以维护,代码难以复用!

2、模式二(Model Two):Servlet+JavaBean+JSP:
(1)Servlet:接收请求中的数据(请求参数)、调用某一个JavaBean对请求进行处理、调用某一个JSP展示请求处理的结果
将请求数据封装到JavaBean内部
调用JavaBean方法处理请求

(2)JavaBean:处理请求(封装数据、处理业务逻辑、访问数据库)
	业务Bean: 负责处理业务逻辑
	实体Bean: 负责封装数据
	User类(username/password/nickname/email..)
(3)JSP:只负责展示/响应对请求处理的结果

MVC设计模式:

MVC设计模式是一种通用的软件编程思想,不仅仅适用于Java语言。
在MVC设计模式中认为, 任何软件都可以分为三部分组成:
(1)控制程序流转的控制器(Controller)
(2)封装数据处理数据的模型(Model)
(3)负责展示数据的视图(view)
并且在MVC设计思想中要求一个符合MVC设计思想的软件应该保证上面这三部分相互独立,互不干扰,每一个部分只负责自己擅长的部分。
如果某一个模块发生变化,应该尽量做到不影响其他两个模块。这样做的好处是,软件的结构会变得更加的清晰,可读性强。有利于后期的扩展和维护,并且代码可以实现复用。
在这里插入图片描述

二、SpringMVC的入门案例

1、创建工程、导入jar包、创建配置文件
(1)day16-springmvc(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核心配置文件的位置

3、创建/WEB-INF/pages/home.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/day16-springmvc/HelloController/hello
localhost/day16-springmvc/HiController/hello

@Controller
public class HelloController {
	@RequestMapping("/hello")
	public String testHello() {
		return "xxx";
	}
}

localhost/day16-springmvc/hello

三、SpringMVC参数绑定

1、简单类型参数绑定
1.1.需求:
浏览器请求:localhost/day16-springmvc/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/day16-springmvc/testParam3?name=刘备&age=22&addr=河北
获取请求中的name、age、addr参数的值
声明一个User类,在User类中声明name、age、addr属性,并提供对应的set和get方法

/* 3.包装类型参数绑定
	 * 浏览器请求:/testParam3?name=刘备&age=22&addr=河北
	 * 获取请求中的name、age、addr参数的值
	 * 声明一个User类,在User类中声明name、age、addr属性,并提供对应的set和get方法
	 */
	@RequestMapping("/testParam3")
	public String testParam3( 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/day16-springmvc/testParam4?date=2020-2-8 15:13:41
获取请求中的date参数的值

/* 4.日期类型的参数绑定
	 * 浏览器请求:/testParam4?date=2020-3-3 15:36:08
	 * 获取请求中的date参数的值
	 * HTTP Status 400 – Bad Request: 请求参数类型不匹配
	 * 	因为springmvc框架底层默认的时间格式是以斜杠(/)分隔,例如:
	 * 		/testParam4?date=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中取出数据进行显示!
2、返回JSON数据
JSON是JS对象格式转换过来的一种非常流行的数据传输/交换格式。
JSON中包含的数据结构是key-value格式(键-值对):
(1)JSON是用花括号括起来的一组内容,其中的数据是key-value结构
(2)JSON中的key只能是字符串(可以加上双引号,也可以省略)
(3)JSON中的value可以是任意类型(数值、字符串、布尔值、数组、函数。。。)

//声明一个JS对象1(JSON格式)
	var p1 = {
			"name" : "王海涛",
			"age" : 20,
			"sayHi" : function(){
				alert( this.name+" : "+this.age );
			}
	}
	//alert( p1.name );
	//alert( p1.age );
	//p1.sayHi();
	---------------------------------------------
	//声明一个JS对象2(JSON格式)
	var p2 = {
		name : "王海涛",
		friends : [ {
			name : "小刘",
			friends : ["小李", "小王"]
		}, {
			name : "小齐",
			friends : ["小张", "小赵"]
		}, {
			name : "小陈",
			friends : ["小刘", "小王"]
		}],
	}
	alert( p2.friends[1].friends[1] );

六、JavaEE经典架构

在这里插入图片描述

七、Validating验证卡死解决方法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值