IOC控制反转指将对象的创建,存储,管理交给spring容器.spring容器是spring中的一个核心模块,底层可以理解为一个map集合.
Spring DI 即依赖注入,指在创建对象的同时或之后,如何给对象的属性赋值.赋值方式有三种
Set方式注入 构造方法注入 基于注解的注入
工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。 代理设计模式 : Spring AOP 功能的实现。 单例设计模式 : Spring 中的 Bean 默认都是单例的。 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
不是,Spring框架中的单例bean不是线程安全的。
spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。
实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
有状态就是有数据存储功能。 无状态就是不会保存数据。
Spring支持两种类型的事务管理: 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
前端控制器,负责接受请求,调用其他组件处理请求,响应结果.相当于中央处理器,是整个流程的控制中心
答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
1.用户发现送请求给前端控制器。前端控制器的作用的接受请求,调用其他组件,响应结果。相当于中央处理器,是整个流程的控制中心。
2.前端控制器会调用处理器映射器,处理器映射器会根据url找到具体的处理器,并生成处理器对象和拦截器(如果有则生成),并将两个结果一并返回。
3.前段控制器会调用处理器适配器,处理器适配器经过适配调用具体的处理器(后端控制器),处理器执行会返回ModelAndView给处理器是配置,处理器适配器再把结果返回给前段控制器。
4.前端控制器将ModelAndView传给视图解析器,视图解析器经过解析后返回视图给前端控制器
5.前端控制器对视图进行渲染,即将模型数据填充至视图中
6.前段控制器将渲染后的视图响应给用户
mvc是一种设计模式(设计模式就是日常开发中编写代码的一种好的方法和经验的总结)。模型(model)-视图(view)-控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端业务数据处理的分离。
mvc设计模式的好处 1.分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。 2.有利于系统的并行开发,提升开发效率。
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
请求路径上有个id的变量值,可以通过@PathVariable来获取 @RequestMapping(value = “/page/{id}”, method = RequestMethod.GET)
@RequestParam用来获得静态的URL请求入参 spring注解时action里用到。\
转发是一次请求,一次响应; 转发后地址栏地址没有发生变化(还是访问testForward的地址); 转发前后的request和response对象也是同一个。
相当于: request.getRequestDispatcher(“url”).forward(request,response);
redirect方式相当于:response.sendRedirect(url);
重定向是两次请求,两次响应; 重定向后地址栏地址发生了变化(变为转发后的地址); 并且在重定向前后,request和response对象不是同一个。
如果请求是GET提交,并且tomcat是8.0及以后的版本,GET提交的中文参数,在获取时不会出现乱码问题
如果请求是POST提交,不管是哪个版本的tomcat服务器,在获取中文参数时,都会出现乱码问题。因为tomcat底层在接收POST提交的参数时,默认会使用iso8859-1编码接收,而这个编码中没有中文字符,所以在接收中文参数时,一定会出现中文乱码问题! 解决方法是:通知服务器在接收POST提交的参数时,使用utf-8编码来接收!
request.setCharacterEncoding(“utf-8”);
由于服务器在通过response获取的流发送数据时,默认使用iso8859-1编码,而这个编码中没有中文字符,所以在通过response获取的流发送中文数据时,会出现乱码问题。
解决方法是:在响应数据之前,通知服务器使用utf-8发送数据。
/* 通知服务器在响应数据时,使用utf-8编码 * 也能通知浏览器使用utf-8接收服务器发送的数据 */ response.setContentType( "text/html;charset=utf-8" ); PrintWriter out = response.getWriter(); out.write( "你好" );在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
<!-- 配置过滤器,解决POST提交的中文参数乱码问题 --> <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>答:直接在方法的形参中声明request,Spring MVC就自动把request对象传入。 public SysResult doLoing(HttpServletResponse response,HttpServletResponse response)
@RequestMapping("/doLogin") @ResponseBody public SysResult doLoing(User user,HttpServletResponse response,HttpServletResponse response) { System.out.println("进来了+++++++++++++++"); //1.通过user传递用户名和密码,交给业务层service进行校验,获取ticket信息(校验之后的回执) String ticket=userService.doLoing(user); if(StringUtils.isEmpty(ticket)) { return SysResult.fail(); } Cookie cookie=new Cookie("JT_TICKET", ticket); //指定以"jt.com"结尾的网址可以查看cookie的值 cookie.setDomain("jt.com"); //任意网址,都可以获取Cookie信息 cookie.setPath("/"); //设置cookie的生存时间为7天 cookie.setMaxAge(7*24*60*60); //将cookie添加到response中 response.addCookie(cookie); return SysResult.success(); }答:直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样
答:直接在方法中声明这个对象,Spring MVC就自动会把属性赋值到这个对象里面。
答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。
返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。