1.SpringMVC环境搭建及第一个程序
首先导入需要的jar包
- spring-aop.jar
- spring-bean.jar
- spring-content.jar
- spring-core.jar
- spring-web.jar
springmvc就是servlet
springmvc也是一个spring,所以需要spring环境所需要的jar包
在springsrc下建立一个springmvc.xml的文件
正常的servlet会在访问/AA的时候会被拦截,然后去访问它所对应的servlet-class.
如果现在想用springmvc而不是普通的servlet,需要进行配置:
需要在web.xml中进行配置:
-
拦截所有请求,交给springmvc进行处理
这4中命名都是指servlet
-
前台jsp的页面
-
首先创建一个类,然后使其成为一个servlet
-
使用扫描器扫描有注解的类
-
配置视图解析器
-通过解析器给请求页面增加前缀和后缀
-
如果控制台报这个错误,证明jar包不够
-
请求页面的位置
-
springmvc中,拦截一切请求是/,而不是/*
-
只拦截user开头的请求
-
默认的路径应该在WebContent下的WEB-INF中,文件的名字应该为class-name的名字加上-servlet.xml
2.RequestMapping映射及属性
首先会找类前面的RequestMapping,然后再找方法前面的RequestMapping
默认使用的请求转发的方式
-
其中RequestMapping中有很多属性,使用的是键值对的形式
-
默认使用的值为value
规定请求的方式必须为post的方式,method是一个枚举类型
超链接请求默认为get请求的方式
通过表单来写一个请求方式为post的请求
-
请求参数必须包含name
-
如果请求参数中没有name,则会报404错误
-
通过表单写一个包含name属性的请求,则可以请求成功
-
不但需要有name属性,而且name的属性值必须为zs,否则不能请求成功,报404错误
-
如果有age属性,那么age的属性必须不为23,没有age属性也可以
-
请求参数中不能包含height
-
如果有了name="height",如下,则不能请求成功,也是报404错误
-
params={"xxx=xxx"}设置的是name=“xxx”的属性
-对请求头的约定
-
在mvc中书写,不应该写:应该写为=
-
请求头中的这条信息
ant风格的请求路径
-
*带表任意字符,中间写啥都可以(0个或多个)
-
**任意目录
-
?单个字符
传值
-
通过地址栏传值zs,@PathVariable
可以一键生成springmvc.xml文件
-
在xml文件中右击,选择Dispatcherservlet
REST风格,软件编程风格
SpringMVC GET : 查 POST :增 DELETE: 删 PUT :改
普通浏览器只支持get和post请求,delete和put是通过过滤器来实现的
过滤器转换delete和put的条件
- 表单type必须为hidden的类型(隐藏域的类型)
- 表单的name值必须为_method
- 表单的value值必须为delete或put
- 表单的请求方式必须为post的方式
当发现满足以上的要求,则自动进入过滤器中,通过value值来确定实际的请求方式
如果value值为delete,就将post请求转换为delete请求,如果value值为put,则将之前的post请求转换为put请求
过滤器需要配置,过滤器的名字为 HiddenHttpMethodFilter
-
删方式的表单内容
-
改方式的表单内容
-
要求请求方式是put和delete方式
-
全都请求一个映射名,然后通过method来区分
过滤器中处理delete和put的部分源码,经过过滤器请求之后,request请求就可以处理delete和put 的请求了
表单字段的传值
-
前台jsp中name="uname"
-
通过@RequestParam("uname") 来接收
-
如果是多个值,通过,分割来接收
前端jsp页面
servlet中@RequestParam中
-
在@RequestParam中,默认属性为value,如果需要写其他的属性,则通过键值对的形式
-设置默认的参数值defaultValue
常见属性的解释
-
获取请求头中的信息
通过mvc获取cookie的值(JSESSIONID)
-
通过注解@CookieValue来接收
-
控制台
使用对象(实体类student)接收请求参数
-
student实体类
-
address实体类
-
表单内容
-
通过实体类来直接接收
在mvc中使用原生态的servletAPI
- 通过在方法中添加参数来获取原生态的servletrequest
6处理模型数据及ModelAttribute等注解的使用
处理模型数据
如果跳转的时候需要带数据跳转过去(V视图,M数据),比如需要带request域中的数据过去,则需要使用以下方式:
-
ModerAndView 把数据自动放到了request作用域中
-
前台jsp页面
-
ModelMap 把数据自动放到了request作用域中
-
Map 把数据自动放到了request作用域中
-
Model 把数据自动放到了request作用域中
将数据存放到Session中,注意:需要先存放到request域中的对象,才可以存放到session域中
通过注解@SessionAttributes("student")在session域中存放数据
如果想要存放多个,可以通过,分割
通过对象类型来一次性都存放到session域中@SessionAttributes(type={Student.class,Address.class})
ModelAttribute 在任何请求前,都会执行此方法
将ModelAttribute中查到的student赋值到testModelAttribute中的student参数中
7视图、视图解析器、国际化
在springmvc中,返回值:
- String
- View
- ModelAndView
流程图
view接口的中方法
InternalResourceView的实现类JstlView
视图的顶级接口为:View
视图解析器的顶级接口:ViewResolver
View实现类简介
ViewResolver实现类
JstlView可以解析jstl,实现国际化操作
springMVC解析jsp时 会默认使用InternalResourceView, 如果发现Jsp中包含了jstl语言相关的内容,则自动转为JstlView。
国际化: 针对不同地区、不同国家 ,进行不同的显示
具体实现国际化步骤:
- a.创建资源文件
基名语言地区.properties
基名_语言.properties(地区可以省略)
i18n((其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。)
在i18n_zh_CN.properties中
在i18n_en_US.properties中
加载到mvc配置文件中
在springmvc.xml中
-
b.配置springmvc.xml,加载资源文件
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>
ResourceBundleMessageSource会在springmvc响应程序时 介入(解析国际化资源文件)
使用jstl实现国际化,首先引入支持国际化的标签
success.jsp页面
需要通过ResourceBundleMessageSource进行解析之后,页面才可以显示国际化显示,ResourceBundleMessageSource是在响应的时候进行的介入。所以需要通过一个页面请求之后,然后进行响应之后的显示。
- c.通过jstl使用国际化
需要的包 :jstl.jar standar.jar
springmvc在启动时,会自动查找一个id="messageSource"的bean,如果有 ,则自动加载。
将id改为messageSource,名字是固定的。不可以为别的。
前台jsp页面
将浏览器语言设置为:英语美国
jsp页面显示:
8视图解析器常见功能、处理静态资源、类型转换器
实现springmvc从一个jsp直接跳转到另一个jsp,不经过controller控制器
<mvc:view-controller path=" 请求链接("addservlet")" view-name="响应页面(success.jsp) ">
jsp页面
在springmvc.xml中进行配置,这样子写view-name也会被视图解析器解析。注意:如果只是这样配置的话,程序会把controller中的地址全都屏蔽掉,访问controller中的地址都会找不到报404错误
如果俩者请求的是同一个地址:
如果想要是俩种请求都共存,需要加入注解:
springmvc中的注解驱动支持:
<mvc:annotation-driven></mvc:annotation-driven>
将默认的请求转发更改为重定向:(如果使用此方法,视图解析器不会自动拼接前缀和后缀)
请求转发:
重定向:(这里因为是在springmvc框架中,所以重定向也不用写项目名)
处理静态资源,不会因为时间,地点的变化而变化(html,css,js,图片,视频)
在springmvc中,如果直接访问静态资源,会报404错误找不到。原因是:请求图片的请求被dispatcherservlet拦截了,然后去找对应的requestMapping(“”)或者<mvc:view-controller path=" 请求链接("addservlet")" view-name="响应页面(success.jsp) ">,因为这俩这都没有配置处理,所以找不到。
如果需要springmvc处理的,则交给dispatcherservlet处理。如果不需要,则使用tomcat默认的servlet处理。 在tomcat中处理请求是通过url-pattern来拦截。如果没有相应的url-pattern拦截,则会直接访问这个资源。
tomcat默认的servlet在\conf\web.xml中
tomcat中默认servlet(DefaultServlet)的功能:在tomcat中处理请求是通过url-pattern来拦截。如果没有相应的url-pattern拦截,则会直接访问这个资源。
在springmvc.xml中增加一个配置:这个注解会让springmvc接收到一个请求,并且没有对应的@requesetMapping时,将该请求交给默认的servlet处理(直接访问),此注解也需要注解驱动的支持<mvc:annotation-driven></mvc:annotation-driven>否则只能访问静态资源
<mvc:default-servlet-handler></mvc:default-servlet-handler>
实现类型的转换:
<a href=" ">
-
创建一个class类,实现Converter接口
前台传一个字符串,后台转为一个学生
学生实体类Student
将转换器加入到springmvc.xml中:
-
将自定义转换器纳入springIOC容器:
-
再将myConverter(自定义的转换器)纳入springmvc提供的转换器bean中
这个bean是:ConversionServiceFactorybean
-
再将conversionService注册到annotation-driven中