​深入理解B/S与C/S架构​​.

一、什么是SpringMVC?

(一)是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。

(二)Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。

(三)采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。

二、那什么是MVC呢?

MVC(Model-View-Controller,模型-视图-控制器)指把页面、后台的交付分成3层来组成,是一种解决页面代码(视图代码)和后台代码分离的设计思想!!

➢ 模型:指封装数据的数据模型
➢ 视图:指的是页面
➢ 控制器:指接收页面发送数据过来的类

三、为什么要学习SpringMVC ?

首先,可能有人会问我们已经学习了Servlet/JSP了。为什么还要学习SpringMVC呢 ?接下来我们分析一下:

(一)servlet的缺点

①数据类型转化,因为http协议传输的和web容器解析后的都是文本类型,那如果遇到货币、日期之类的,我们就需要大量的转化,繁琐易错。

② servlet只有doGet和doPost,一个servlet类只能处理一个url-pattern。

(二)springMVC的好处

➢ 一个请求对一个方法

➢ 自动支持上传组件,支持各种视图解析器

➢ 自动支持JSON的转成

➢ 支持数据的自动封装

四、SpringMVC能干什么?


  1. 天生与Spring框架集成,如:(IOC,AOP)
  2. 支持Restful风格
  3. 进行更简洁的Web层开发
  4. 支持灵活的URL到页面控制器的映射
  5. 非常容易与其他视图技术集成,如:Velocity、FreeMarker等等
  6. 因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
  7. 非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API
  8. 更加简单、强大的异常处理
  9. 对静态资源的支持
  10. 支持灵活的本地化、主题等解析

五、SpringMVC怎么玩?

(1)入门案例

①创建maven的web项目,导入开发的坐标(spring-context,spring-web,spring-webmvc,servlet-api,jsp-api)

②编写index.jsp主页面和suc.jsp成功页面

③编写controller类(控制器类),方法就可执行

@Controller
public class HolleController {
@RequestMapping("hello.do")
public String say(){
System.out.println("方法执行成功....");
return "suc";
}
}

④在web.xml中配置前端控制器

<web-app>
<display-name>Archetype Created Web Application</display-name>

<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!--加载springMVC.xml配置文件,配置的是spring的配置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--配置启动加载-->
<load-on-startup>1</load-on-startup>

</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

</web-app>

⑤编写springMVC.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描包-->
<context:component-scan base-package="cn.tx.demo"/>
<!--视图解析器-->
<bean id="resourceView" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--跳转页面的路径-->
<property name="prefix" value="/WEB-INF/"/>
<!--跳转页面的后缀名称-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>

⑥启动Tomcat测试

(2)RequestMapping注解

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

RequestMapping注解可以作用在方法和类上

作用在类上:第一级的访问目录

作用在方法上:第二级的访问目录

细节:路径可以不编写 / 表示应用的根目录开始

RequestMapping的属性

①path :指定请求路径的url; ② value: value属性和path属性是一样的;

③mthod: 指定该方法的请求方式; ④ params: 指定限制请求参数的条件;

六、请求参数的绑定

①绑定机制

1、表单提交的数据都是k=v格式的 username=haha&password=123;

2、SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的;

3、要求:​​提交表单的name和参数的名称是相同的​​;

②支持的数据类型

1、基本数据类型和字符串类型;2、实体类型(JavaBean);3、集合数据类型(List、map集合等);4、基本数据类型和字符串类型;5、如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name;

③给集合属性数据封装​:JSP页面编写方式:list[0].属性

(一)请求参数中文乱码的解决

在web.xml中配置过滤器

<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 指定字符集 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

(二)自定义类型转换器(解决日期问题)

①第一种方式使用DateTimeFormat注解的方式

直接在要转换格式的日期属性上加注解

例如:@DateTimeFormat(pattern = “yyyy-MM-dd”)

②第二种方式,自定义类型转换器。如果想自定义数据类型转换,可以实现Converter的接口

//自定义类型转换器 把String转换成Date
public class StringToDate implements Converter<String,Date> {
public Date convert(String s) {
/*进行数据类型转换的方法*/
if(s == null){
throw new RuntimeException("请输入内容");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ss");
try {
//进行转换
return sdf.parse(s);
} catch (ParseException e) {
//抛出运行异常
throw new RuntimeException(e);
}
}
}

springMVC.xml中注解

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="自定义类型转换器路径"/>
</set>
</property>
</bean>

<!--让映射器、适配器和处理器生效(默认不配置也是可以的)-->
<mvc:annotation-driven conversion-service="conversionService" />

七、常用注解

(一)RequestParam注解

作用:把请求中的指定名称的参数传递给控制器中的形参赋值

属性:value:请求参数中的名称;

required:请求参数中是否必须提供此参数,默认值是true,必须提供;

defaultValue:如果没有传请求参数,使用默认值;

(二)RequestBody注解

作用:用于获取请求体的内容(注意:get方法不可以)

属性:required:是否必须有请求体,默认值是true;

(三)PathVaribale注解

作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符;

属性:value:指定url中的占位符名称;

​Restful风格​的URL:请求路径一样,可以根据不同的请求方式去执行后台的不同方法;

restful风格的URL优点:结构清晰、符合标准、易于理解、扩展方便;

①编写新的controller

@Controller
public class EmpController {
@RequestMapping(path = "/emp",method = RequestMethod.POST)
public String save(){
System.out.println("保存数据....");
return "suc";
}
@RequestMapping(path = "/emp",method = RequestMethod.GET)
public String findAll(){
System.out.println("查询数据....");
return "suc";
}
@RequestMapping(path = "/emp/{id}",method = RequestMethod.GET)
public String findById(@PathVariable(value = "id")Integer id){
System.out.println("通过id查询员工...."+id);
return "suc";
}
}

②修改前端控制器的配置文件

<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

(四)RequestHeader注解

作用:获取指定请求头的值;

属性:value:请求头的名称;

@RequestMapping("/save3.do")
public String save3(@RequestHeader(value = "Accept") String header){
System.out.println("Accept请求头的值:"+header);
return "suc";
}

(五)CookieValue注解

作用:用于获取指定cookie的名称的值;

属性:value:cookie的名称

@RequestMapping("/save4.do")
public String save4(@CookieValue(value = "JSESSIONID") String cookie){
System.out.println("值:"+cookie);
return "suc";
}