Spring全家桶知识概括
Springmvc与JS
对于springMVC:
- 在web工程中对于资源的路径和handler的路径都是相对于web工程的!!!
- 因为都在webcontent文件夹中。虽然java类的编译Class文件在WEB-INF的classes中
但springmvc映射了路径!!!
springMVC接受参数:
@pathVariable:从路径中获取变量,也就是把路径当做变量
someUrl/{
paramId}
@RequestParam是从请求里面获取参数
/Springmvc/user/page.do?pageSize=3&pageNow=2
Spring MVC 会按请求参数名和 POJO属性名进行自动匹配,自动为该对象填充属性值。支持级联属性
。如:dept.deptId、dept.address.tel 等
springMVC与JS中接受发送数组(一名多值)详解:
- JS发送一个数组时默认会将每个元素设置为同名的
数组名[]形式
,以表示发送的为一个数组。
①例如:
array=1
array=2
array=3
②springMVC对于同名的数组可以使用数组或List接受但是需要在请求参数后面要写多个[],例如@RequestParam("array[]")。
此外JS也可以使用带下标的人造数组方式发送:
①例如:
array[1]=1
array[2]=2
array[3]=3
②springMVC对于带下标的数组可以使用javabean接受,但javabean里要有一个List或数组字段。
对于上述两种方式都比较麻烦,因此可以采用JS发送JSON格式化的数组。
①springMVC对于JSON字符串可以在入参中使用requestBody注解进行解析接受。
②使用String接受,在Cotroller层转化回数组或List。
springMVC与JS中接受发送Map详解:
- SpringMVC处理请求用Map类型接收参数时,如果参数无注解(@requestParam),则会传入BindingAwareModelMap类型,等价于Model、ModelMap参数。
参数添加@RequestParam注解时,会将参数包装称LinkedHashMap对象
,参数的key为Map的key,参数值为Map的value,支持Get、Post方法(应该支持Put、Delete,没有测,俩方法与Post类似)。
①可以采用JS直接发送对象。
②此处可以:
<1>发送json对象,然后使用map接受,逐个取出。
<2>发送值为json字符串的对象,然后使用map接受,取出一个即ok添加@RequestBody注解时接收Json类型数据
,也会包装成LinkedHashMap对象,该注解不支持Get请求,Get请求没有请求体不能传Json。
①可以采用JS发送JSON字符串。
②@RequestBody只接受JSON字符串。
//发送ajax请求(第一种方式,推荐):1.contentType 可以不填 2.发送数据为json对象
let obj=getFromData();
$.ajax({
url: "srarch_data/search_data_detail.action",
type: "post",
dataType:'json',
data: {
"jsonData":JSON.stringify(obj)},
success: function (json) {
}
});
//发送ajax请求(第二种方式):1.必须填写contentType 2.发送数据为json字符串
$.ajax({
url: "srarch_data/search_data_detail.action",
type: "post",
dataType:'json',
contentType : 'application/json;charset=utf-8',
data: JSON.stringify(obj),
success: function (json) {
}
});
//第一种ajax请求对应的后台接口
@RequestMapping("search_data_detail")
@ResponseBody
public void searchInfo(@RequestParam Map<String,String> map){
Map<String, Object> jsonMap= JsonToMap.jsonToMap(map.get("jsonData"));
for (Map.Entry<String,Object> entry:jsonMap.entrySet()){
System.out.print("得到键为:==="+entry.getKey());
System.out.println("得到值为:==="+entry.getValue());
}
}
//第二种ajax请求后台对应的后台接口
@RequestMapping("search_data_detail")
@ResponseBody
public void searchInfo(@RequestBody Map<String,String> map) {
for (Map.Entry<String,String> entry:map.entrySet()){
System.out.print("得到键为:==="+entry.getKey());
System.out.println("得到值为:==="+entry.getValue());
}
}
- 此外还可以使用spring框架中的一个工具类WebUtils,里面有一个静态方法: ①
WebUtils.getParametersStartingWith(ServletRequest request, String prefix);
②第一个参数为request对象,第二个参数为键值名的前缀,没有前缀直接写空串。
③此处JS发送的是JS对象。
public ServerResponse list(ServletRequest request){
//获取所有前缀为s_的name存入map中
Map<String,Object> map = WebUtils.getParametersStartingWith(request, "");
for (Map.Entry<String,Object> entry :map.entrySet()){
System.out.println("遍历map得到键为:"+entry.getKey());
System.out.println("遍历map得到值为:"+entry.getValue());
}
拦截器与过滤器的区别
拦截器与过滤器的区别 :
- 链接:拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
- Filter需要在web.xml中配置,依赖于Servlet;
- Interceptor需要在SpringMVC中配置,依赖于框架;
- Filter的执行顺序在Interceptor之前,具体的流程见下图;
- 两者的本质区别:
拦截器(Interceptor)是基于Java的反射机制
,而过滤器(Filter)是基于函数回调
。 从灵活性上说拦截器功能更强大些,过滤器能做的事情拦截器都能做
,而且可以在请求前,请求后执行,比较灵活。在一次请求的生命周期中:拦截器可以多次调用,而过滤器只能调用一次。
- Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(
比较泛的,比如登录不登录之类
), 太细的话,还是建议用interceptor
。不过还是根据不同情况选择合适的。
spring容器、spring MVC容器、web容器的区别
简介:
spring容器、spring MVC容器、web容器的区别简介:
- springmvc和spring它俩都是容器,容器就是管理对象的地方,例如Tomcat,就是管理servlet对象的,
- 而springMVC容器和spring容器,就是管理bean对象的地方,
- 再说的直白点,springmvc就是管理controller对象的容器,spring就是管理service和dao的容器。
所以我们在springmvc的配置文件里配置的扫描路径就是controller的路径,而spring的配置文件里自然配的就是service和dao的路径
spring容器和springmvc容器的关系:
- 其次 spring容器和springmvc容器的关系是父子容器的关系。spring容器是父容器,springmvc是子容器。
- 在子容器里可以访问父容器里的对象,但是在父容器里不可以访问子容器的对象,
- 说的通俗点就是,在controller里可以访问service对象,但是在service里不可以访问controller对象
Web容器:
- web容器是管理servlet,以及监听器(Listener)和过滤器(Filter)的。这些都是在web容器的掌控范围里。但他们不在spring和springmvc的掌控范围里。
- 因此,我们无法在这些类中直接使用Spring注解的方式来注入我们需要的对象,是无效的,web容器是无法识别的。
- 但我们有时候又确实会有这样的需求,比如在容器启动的时候,做一些验证或者初始化操作,这时可能会在监听器里用到bean对象;又或者需要定义一个过滤器做一些拦截操作,也可能会用到bean对象。
- 那么在这些地方怎么获取spring的bean对象呢?下面我提供两个方法:
方法一:
public void contextInitialized(ServletContextEvent sce) {
ApplicationContext context = (ApplicationContext) sce.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
UserService userService = (UserService) context.getBean("userService");
}
方法二:
public void contextInitialized(ServletContextEvent sce) {
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
UserService userService = (UserService) webApplicationContext.getBean("userService");
}
- 注意:以上代码有一个前提,那就是servlet容器在实例化ConfigListener并调用其方法之前,
要确保spring容器已经初始化完毕!而spring容器的初始化也是由Listener(ContextLoaderListener)完成,因此只需在web.xml中先配置初始化spring容器的Listener,然后在配置自己的Listener。
Spring在web容器的配置与ContextLoaderListener简介:
ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext.xml的配置信息。
- ContextLoaderListener继承自ContextLoader,实现的是ServletContextListener接口。在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
- ContextLoaderListener可以指定在Web应用程序启动时载入Ioc容器,正是通过ContextLoader来实现的,ContextLoader来完成实际的WebApplicationContext,也就是Ioc容器的初始化工作
- ContextLoaderListener的作用就是启动Web容器时,读取在contextConfigLocation中定义的xml文件,自动装配ApplicationContext的配置信息,并产生WebApplicationContext对象,然后将这个对象放置在ServletContext的属性里,这样我们只要得到Servlet就可以得到WebApplicationContext对象,并利用这个对象访问spring容器管理的bean。
- 配置案例:
<!-- Spring配置文件开始 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml