SpringMVC课堂笔记

本篇文章所有源代码都在github:https://github.com/Jerry-max199/SpringMvc-Course.git

SpringMVC:是基于spring的一个框架,实际上就是spring的一个模块,专门做web开发的,可以理解为servlet的一个升级。

web开发的底层是servlet,框架是在servlet的基础上加入一些功能,让你做web开发更加方便

springMVC就是一个spring。spring是容器,ioc能够管理对象,使用<bean>,@Component,@Repository,@Service,@Controller,等注解spring可以创建对象,放入到容器中(SpringMVC容器),springMVC容器中放的是控制器对 像,我们要做的是使用@Contorller创建控制器对象,把对象放入到springMVC容器中,把创建的对象作为一个控制器使用,这个控制器对象可以接受用户的请求,显示处理结果,就当作是一个servle使用。

使用@Controller注解创建的是一个普通类的对象,不是servlet。spring赋予了控制器对象一些额外的功能。

web开发的底层是servlet,springMVC中对象有一个servlet:DispatherServlet(中央调度器)

DispatherServlet:负责接收用户所有请求,把用户请求给DispatherServlet,之后DispatherServlet把请求转发给我们的controller对象,最后是Controller对象处理请求。

index.jsp---->DispatherService(Servlet)------->转发,分配给----->controller对象(@Controller注解创建的对象)

 

主要注解:

@Controller:

创建处理器对象,对象就放在springmvc容器中。

位置:再类上面

能处理请求的控制器:MyController能处理请求,叫做后端控制器

@RequestMapping:

控制器方法:

@RequestMapping:请求映射,作用是把一个请求地址和一个方法绑定在一起。一个请求指定一个方法来处理

属性:1.value 是一个string,表示请求的url地址的(some.do).

value的值必须是唯一的,不能重复。在使用时,推荐地址以“/”开头

位置:1.在方法的上面

2.在类的上面

@RequestMapping:请求映射

属性method,表示请求的方式,他的值是RequestMethod类的枚举值

例如表示get请求方式method= RequestMethod.GET

post请求方式:method = RequestMethod.POST。

用错方式汇报405错误,

说明:使用@RequestMapping修饰的方法叫做控制器方法,使用@RequestMapping修饰的方法是可以处理请求的,

类似与servlet中doget,dopost

返回值:ModelAndView 表示本次请求的处理结果、

Model:数据,请求处理完成后,显示给用户的数据

View:视图,比如jsp

控制器类

@RequestMapping("/test")

value:所有请求地址的公共部分,叫做模块名称

位置:放在类上面。

@RequestParam:

@RequestParam:逐个接收参数中,解决请求中参数名形参名不一样问题

属性:1.value 请求中的参数名称不一样

2.required 是一个Boolean,默认是true

true:表示请求中必须包含此参数

位置:在处理器方法的形参定义前面

@ResonseBody注解

@ResponseBody:

作用:把处理器方法返回对象转为json后,通过HttpServletResonse输出给浏览器

位置:方法的定义上面。和其他注解没有顺序关系

放在处理器上面,通过HttpServeltResponse输出数据,相应ajax请求的

PrintWriter pw=response.getWriter();

pw.println(json);

pw.flush();

pw.close();

SpringMVC:第一个springMVC项目

需求:用户在页面发起一个请求,请求交给springMVC的控制器对象,并且显示请求的处理结果(在结果页面显示一个欢迎信息)

 

实现步骤:

1.新建一个web maven工程

2.加入依赖

SpringMVC依赖,间接的将spring依赖都加入到项目中

jsp,servlet依赖

3.重点:在web.xml中注册springMVC框架的核心对象DispatherServlet

1)DispatherServlet叫做中央调度器,是一个servlet,它的父类继承于HTTPServlet

2)DispatherServlet也叫做前端控制器(front controller)并把请求处理结果显示给用户

使用框架的时候,url-pattern可以使用两种值

1.使用扩展名方式,语法*.do,*.action,*.mvc等等

http://localhost:8080/myweb/some.do

http://localhost:8080/myweb/other.do,将以.do的请求交给myweb中央调度器

2.使用“/”

 

4.创建一个发起请求的页面index.jsp

5.创建控制器类

1)在类上面加入@Controller注解,创建对象,并放入springMVC容器中

2)在类中的方法上加入@RequestMapping注解

6.创建作为结果的jsp,显示请求处理结果

7.创建springMVC的配置文件(spring配置文件一样)

1)声明组件扫描器,指定@Contorller注解所在的包名

2)声明视图解析器,帮助处理视图的。

 

springmvc请求处理流程

1.发起some.do请求

2.tomcat()web.xml--url--pattern知道*.do的请求给DispatcherServlet)

3.DispatcherServlet(根据springmvc.xml配置文件知道some.do---dosome())

4.DispatcherServletba some.do转发给Mycontroller.doSome()方法

5.框架执行dosome()把得到的ModelAndView进行处理,转发到show.jsp

上述过程简化方式

some.do---DispatcherServlet---MyController

springmvc执行过程源代码分析

1.tomcat启动,创建容器的过程

通过load-on-startup标签指定的1,创建DisaptcherServlet对象,

DisaptcherServlet他的父类是集成HTTPServlet的他是一个Servlet,他在创建是,会执行init()方法。

在init()方法中

//创建容器,读取配置文件

webApplicationContext ctx=new ClassPatherXmlApplicationContext("springmvc.xml")

//把容器对象放入ServletContext中

getServletContext().setAttribute(text,ctx);

上面创建容器的作用:创建@Controller注解所在的类对象,创建MyController对象,

把这个对象放入到springmvc的容器中,容器是map,类似于map.put("myController",MyController对象)

 

2.请求过程

执行servlet的service()

protected void Service(HttpSercletResquest request,HttpServletResponse response)

protected void doService(HttpSercletResquest request,HttpServletResponse response)

DispatcherServlet.doDispatcher(request,response){

调用MyController的doSome()方法。

}

@RequestMapping:请求映射

@RequestMapping("/test")

value:所有请求地址的公共部分,叫做模块名称

位置放在类上面。

@RequestMapping:请求映射

属性method,表示请求的方式,他的值是RequestMethod类的枚举值

例如表示get请求方式method= RequestMethod.GET

post请求方式:method = RequestMethod.POST。

用错方式汇报405错误(get和post请求发生错误)

步骤:

SpringMVC:RequestMapping的使用

实现步骤:

1.新建一个web maven工程

2.加入依赖

SpringMVC依赖,间接的将spring依赖都加入到项目中

jsp,servlet依赖

3.重点:在web.xml中注册springMVC框架的核心对象DispatherServlet

1)DispatherServlet叫做中央调度器,是一个servlet,它的父类继承于HTTPServlet

2)DispatherServlet也叫做前端控制器(front controller)并把请求处理结果显示给用户

4.创建一个发起请求的页面indec.jsp

5.创建控制器类

1)在类上面加入@Controller注解,创建对象,并放入springMVC容器中

2)在类中的方法上加入@RequestMapping注解

6.创建作为结果的jsp,显示请求处理结果

7.创建springMVC的配置文件(spring配置文件一样)

1)声明组件扫描器,指定@Contorller注解所在的包名

2)声明视图解析器,帮助处理视图的。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

接收请求参数

1.逐个接收请求参数:

要求:处理器(控制器)方法的形参名和请求中参数名必须保持一致

同名的请求参数赋值给同名的形参

框架接收请求参数

1.使用request对象接收请求参数

request strName=request.getParameter("name");

request strAge=request.getParameter("age");

2.springmvc框架通过DispatcherServlet调用MyController的doSome()方法

调用方法时,按名称对应,把接收的参数赋值给形参

doSome(strName,Integer,valueOf(strAge))

框架会提供类型转换的功能,能把String转为int long float等类型

400状态码时客户端错误,表示提交请求参数过程中,发生问题

Intarge是可以接收null的

 

2.请求参数名和形参名不一样

@RequestParam:逐个接收参数中,解决请求中参数名形参名不一样问题

属性:

1.value 请求中的参数名称不一样

2.required 是一个Boolean,默认是true

true:表示请求中必须包含此参数

位置:在处理器方法的形参定义前面

 

3.处理器对象形参就是java对象,这个对象的属性名和请求中的形参名是一样的

框架会自动创建形参的java对象,给属性赋值,请求中的参数时nama,框架会自动调用setName()方法

 

接收参数请求,使用处理器方法的形参:

1)HttpServletRequest

2)HttpServletResponse

3)HttpSession

4)用户提交的数据

 

接收用户提交的参数

1.逐个接收

2.对象接收

 

注意:

在提交请求参数时,get请求方式中没有乱码

使用post方式提交参数,中文乱码,需要使用过滤器处理乱码问题

过滤器可以自定义,也可以使用框架中提供的过滤器CharacterEncodingFilter

实现步骤:

1.新建一个web maven工程

2.加入依赖

SpringMVC依赖,间接的将spring依赖都加入到项目中

jsp,servlet依赖

3.重点:在web.xml中注册springMVC框架的核心对象DispatherServlet

1)DispatherServlet叫做中央调度器,是一个servlet,它的父类继承于HTTPServlet

2)DispatherServlet也叫做前端控制器(front controller)并把请求处理结果显示给用户

4.创建一个发起请求的页面indec.jsp

5.创建控制器类

1)在类上面加入@Controller注解,创建对象,并放入springMVC容器中

2)在类中的方法上加入@RequestMapping注解

6.创建作为结果的jsp,显示请求处理结果

7.创建springMVC的配置文件(spring配置文件一样)

1)声明组件扫描器,指定@Contorller注解所在的包名

2)声明视图解析器,帮助处理视图的。

返回值类型

SpringMVC:ch03-return:处理器方法返回值表示请求处理结果

1.ModelAndView:返回结果有数据和视图,对视图执行forwad.

2.String:表示返回结果只有视图,可以是逻辑名称也可以有完整视图路径

3.void:不能表示数据,也不能表示视图。(了解)

在处理ajax时,可以使用void返回值。通过HttpServletResponse输出数据。相应ajax

在ajax请求服务器端返回的就是数据,和视图无关

4.Object:例如String,Integer,Map,List,Student等等都是对象

对象有属性,属性就是数据。所以返回object表示数据,和视图无关

可以使用对象表示数据,响应ajax请求

现在做ajax,主要使用json数据格式。实现步骤

1.加入json的工具库的依赖,springmvc默认使用的时jackson

2.在springmvc配置文件之间加入<mvc:annotation-driven>注解驱动

 

json=om.writeValueAsString(Student);

4.在处理器方法上加入@ResponseBody注解

response.setContentType("application/json;charset=utf-8")

printWriter pw=response.getWriter();

pw.println(json);

springmvc处理器方法返回Object,可以转换为json输出到浏览器,相应ajax的内部原理

1.<mvc:annotation-driven>注解驱动

注解驱动实现的功能是完成java对象到json.xml,text,二进制等数据格式的转换

<mvc:annotation-driven>在加入到springmvc配置文件后,会自动创建HttpMessageConverter接口

的7个实现类,包括MappingJacksonHttpMessageConverter.(使用jackson工具库中的ObjectMapper实现Java对象转换为json)

HttpMessageConveter接口:消息转换器

功能:定义了java转换为json.xml等数据格式的方法,这个接口有很多的实现类

这些实现类完成java对象到json,Java对象到xml,java对象到二进制数据的转换

boolean canWrite(Class<?> var1, @Nullable MediaType var2);

void write(T var1, @Nullable MediaType var2, HttpOutputMessage var3) ;

1)canWrite作用检查处理器方法的返回值,能不能转换为var2表示的数据格式

MediaType:表示数据格式:json,.xml

2)write:把处理器方法的返回值对象,调用jackson中的ObjectMapper转为json字符串

json= om.writeValueAsString(student);

2.@ResonseBody注解

放在处理器上面,通过HttpServeltResponse输出数据,相应ajax请求的

PrintWriter pw=response.getWriter();

pw.println(json);

pw.flush();

pw.close();

第一种返回类型MoudleAndView

返回的是数据和视图

返回值:ModelAndView 表示本次请求的处理结果、

Model:数据,请求处理完成后,显示给用户的数据

View:视图,比如jsp

第二种返回类型String

返回的是视图

处理器方法返回一个String---表示逻辑视图名称,需要配置视图解析器

第三种返回类型void

既不返回数据也不返回视图但是可以响应ajax

第四种返回对象类型

处理器方法返回一个student,通过框架转为json,输出给ajax

@ResponseBody:

作用:把处理器方法返回对象转为json后,通过HttpServletResonse输出给浏览器

位置:方法的定义上面。和其他注解没有顺序关系

返回对象框架的处理流程:

1.框架会把返回student类型,调用框架中的ArrayList<HttpMessageConverter>的canwrite()方法

检查数据那个HttpMessageConverter接口的实现类能处理的student类型的数据--MappingJackson2HttpMessageConverter

2.框架会调用实现类的write(),MappingJackson2HttpMessageConverter的write()方法

把student对象转换为json,调用Jackson的ObjectMapper实现json

3.框架会调用@ResponseBody把结果数据输出到浏览器,ajax请求处理完成

处理器返回一个String,string表示数据,不是视图

区分视图和数据的方法,看有没有@ResponseBody注解

如果有@Response注解时数据,反之是视图

默认使用的是text/plain;charset=Iso-8899-1"作为contentType,导致中文乱码

解决方案:给ResquestMapping增加一个属性produce,这个属性指定新的字符集

返回对象框架的处理流程:

1.框架会把返回student类型,调用框架中的ArrayList<HttpMessageConverter>的canwrite()方法

检查数据那个HttpMessageConverter接口的实现类能处理的S类型tring的数据--StringHttpMessageConverter

2.框架会调用实现类的write(),StringHttpMessageConverter的write()方法* 把字符按照指定的编码处理

3.框架会调用@ResponseBody把结果数据输出到浏览器,ajax请求处理完成

静态资源处理的两种方式:

发起请求是由哪些服务器程序处理的

http://localhost:8080/ch05_url_pattern/ tomcat(jsp会转为servlet)

http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js: tomcat

http://localhost:8080/ch05_url_pattern/images/1.png: tomcat

http://localhost:8080/ch05_url_pattern/some.do DispatcherServlet(Springmvc框架处理的)

tomcat本身是可以处理静态资源的,像heml,图片,js文件

tomcat的web.xml文件中有一个servelt名称是default,在服务器启动时创建的

<servlet>

<servlet-name>default</servlet-name>

<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

<init-param>

<param-name>debug</param-name>

<param-value>0</param-value>

</init-param>

<init-param>

<param-name>listings</param-name>

<param-value>false</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>default</servlet-name>

<url-pattern>/</url-pattern> 表示静态资源和为映射资源都给这个default处理

</servlet-mapping>

The default servlet for all web applications, that serves static resources. It processes all requests that are not mapped to other servlets with servlet mappings (defined either here or in your own web.xml file

1.处理静态资源

2.处理其他为映射到其他servletde资源

第一种处理静态资源的方式:

<mvc:default-servlet-handler/>和 @RequestMapping有冲突需要加入<mvc:annotation-driven/>解决冲突

需要在springmvc的配置文件中加入<mvc:default-servlet-handler/>

原理是:加入这个标签后,框架会创建一个控制器对象DefaultServletHttpRequestHandler(类似于我们自己创建的mycontroller)

DefaultServletHttpRequestHandler这个对象可以把接收的请求转发给tomcat处理这个请求

第二种处理静态资源的方式

<mvc:default-servlet-handler/>和 @RequestMapping有冲突需要加入<mvc:annotation-driven/>解决冲突

mvc:resources加入后框架会自动创建ResourceGttpRequestHandler这个处理器对象

让这个对象处理静态资源访问,不依赖于tomcat服务器

mapping:访问静态资源的uri地址,使用通配符**

location:静态资源在你项目中的位置

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值