作者:tingel34 | 来源:互联网 | 2023-09-25 11:20
#Spring是什么
开源的,用来简化企业级应用开发的应用开发框架。
简化开发: Spring框架对常用的api都做了封装,比如对jdbc就做了一套封装(Spring Jdbc),使用SpringJdbc访问数据库,就不再需要考虑如何获取连接与关闭连接等操作了。 解耦: Spring帮我们管理对象之间的依赖关系(对象之间的耦合度降低了),这样软件的维护性得到提高。 集成其它框架:Spring可以很好地和其它的一些框架进行集成,这样,使用这些框架就更方便了。 #Spring容器 (1) 什么是Spring容器? Spring框架中的一个核心模块,用来管理对象。 管理对象:对象的创建、销毁、初始化等等操作,以及对象之间的依赖关系。
(2) 如何启动Spring容器? step1.导包。 spring-webmvc step2.添加Spring配置文件。 step3.启动容器。
(3) 如何创建对象?
方式一 无参构造器 step1.为类添加无参构造器或者直接使用缺省构造器。 step2.在配置文件当中,添加bean元素。
step3.启动容器,调用容器提供的一个方法(getBean)。
方式二 静态工厂方法
方式三 实例工厂方法
(4) 作用域
默认情况下,对于某个bean元素,容器只会创建一个实例。 如果将作用域设置为"prototype",容器会创建多个实例。
(5) 生命周期相关的两个方法 1)初始化 使用init-method属性指定初始化方法。
2)销毁 使用destroy-method属性指定销毁方法。 只有作用域为singleton时,销毁方法才会执行。
destroy-method="destroy" scope="singleton"/>
(6)延迟加载 1)默认情况下 容器启动之后,会将所有作用域为singleton的bean先创建好。
2)容器启动之后,对于作用域为singleton的bean,不再创建 (当调用getBean方法时才会创建)
#IOC和DI
IOC (Inversion Of Controll 控制反转) 对象之间的依赖关系由容器来建立。
DI(Dependency Injection 依赖注入) 容器通过调用set方法或者构造器来建立对象之间的依赖关系。
IOC是目标,DI是手段。
依赖注入的两种方式 方式一 set方法注入 step1. 添加set方法。 step2. 在配置文件当中,使用
来配置set方法注入。 step3. 启动容器,调用getBean方法。
方式二 构造器注入 step1. 添加相应的构造器 step2. 在配置文件当中,使用
来配置构造器注入。 step3. 启动容器,调用getBean方法。
4)自动装配
容器默认情况下,是不会自动装配的。 可以让容器依据某些规则,自动建立对象之间的依赖关系 (仍然需要调用set方法或者构造器)。 自动装配建议少用,如果要使用,建议使用byName。
#注入基本类型的值
注入集合类型的值 List,Set,Map,Properties (1)方式一 直接注入
喝酒 抽烟 烫头 烫头
北京 上海 深圳 tom 1234
(2)方式二 引用的方式注入
钓鱼 国画 做饭 金陵 洛阳 北平 sally 1234
#Spring表达式 读取bean的属性值或者读取集合类型的值
#注解 step1.使用注解简化配置文件
组件扫描 容器会扫描base-package指定的包及其子包下面所有的类,如果该类前面有一些特定的注解(比如 @Component),则纳入容器进行管理(相当于在配置文件当中有一个对应的bean元素一样)。 编程步骤 step1.在类前面添加一些特定的注解。 @Component 通用。 @Repository 持久层。 @Service 业务层。 @Controller 控制层。 step2.在配置文件当中,配置组件扫描。
##几个注解
依赖注入相关的几个注解 @Autowired @Qualifier
支持set方法注入
支持构造器注入 @Resource(只支持set方法注入)
@Value
#SpringMVC
SpringMVC 是一个用来简化基于MVC架构的web应用程序开发的应用开发框架。 SpringMVC是Spring框架的一部分。 ##MVC (Model 模型 View 视图 Controller 控制器)
优点 方便测试 (将业务逻辑写在servlet里面,需要部署之后才能测试,而写在java类里面,可以直接测试)。 方便代码的维护(修改模型不影响视图,反之也是如此)。 方便分工协作。 ##五大组件 DispatcherServlet 前端控制器 HandlerMapping 映射处理器 Controller 处理器 ModelAndView 模型和视图 ViewResolver 视图解析器 #基于XML配置的mvc应用 step1.导包。 导入Spring-webmvc.jar包(3.2.8)
step2.添加spring配置文件。
step3.配置DispatcherServlet。
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-mvc.xml 1 springmvc *.do
step4.写Controller。
package controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller;public class HelloController implements Controller{public ModelAndView handleRequest(HttpServletRequest arg0,HttpServletResponse arg1) throws Exception {System.out.println("handleRequest()");/** ModelAndView有两个常用的构造器* ModelAndView(String viewName)* ModelAndView(String viewName,Map data)* viewName:视图名* data: 数据*/return new ModelAndView("hello");} }
step5.写jsp。
<%&#64;page pageEncoding&#61;"utf-8" contentType&#61;"text/html; charset&#61;utf-8" %> Hello,SpringMVC!
step6.在spring配置文件中&#xff0c;配置HandlerMapping,Controller和ViewResolver。
helloController
#基于注解的配置的mvc应用
##编程步骤 step1.导包 (spring-webmvc)
step2.添加Spring配置文件。
step3.配置DispatcherServlet。 需要指定初始化参数&#xff08;因为DispatcherServlet的初始化方法会启动Spring容器&#xff0c;所以&#xff0c;需要知道Spring配置文件的位置&#xff09;。
step4.写Controller。 a. 不再需要实现Controller接口。 b.方法名不作要求&#xff0c;返回类型可以是ModelAndView,也可以是String。 c.可以有多个方法。 d.在Controller类前添加&#64;Controller。该注解用于组件扫描。 e.使用&#64;RequestMapping来代替HandlerMapping的配置。 该注解可以添加到类前面以及方法前面。
&#64;Controller //&#64;RequestMapping("/demo") public class HelloController {&#64;RequestMapping("/hello.do")public String hello(){System.out.println("hello()");//返回视图名return "hello";}
step5.写jsp。
step6.在Spring的配置文件里面&#xff0c;添加:视图解析器&#xff0c;组件扫描&#xff0c;mvc注解扫描&#xff0c;要想让&#64;RequestMapping起作用&#xff0c;需要配置mvc注解扫描。
##读取请求参数值 方式一 通过request
&#64;RequestMapping("/b.do")/** DispatcherServlet利用java反射分析处理器的* 方法签名&#xff08;方法名&#xff0c;参数类型&#xff0c;返回类型&#xff09;&#xff0c;然后* 将需要的对象作为参数传进来。* 比如&#xff0c;这儿&#xff0c;需要有一个request对象&#xff0c;* DispatcherServlet就会将request作为参数传进来。*/public String bmi(HttpServletRequest request){System.out.println("bmi()");String height &#61; request.getParameter("height");String weight &#61; request.getParameter("weight");System.out.println(height &#43; " " &#43; weight);return "view";}
方式二 通过&#64;RequestParam
&#64;RequestMapping("/b2.do")/** * DispatcherServlet利用java反射分析方法的签名&#xff0c;* 会将参数值获得之后&#xff0c;赋给对应的形参。* 注&#xff1a;* 可以使用&#64;RequestParam注解告诉DispatcherServlet,* 形参名与请求参数名的对应关系。*/public String bmi2(&#64;RequestParam("height") String height1,String weight){System.out.println("bmi2()");System.out.println(height1 &#43; " " &#43; weight);return "view";}
方式三 通过javabean
&#64;RequestMapping("/b3.do")/** * DispatcherServlet通过反射分析方法的签名&#xff0c;* 会将BmiPraram对象创建好之后传进来。* 注&#xff1a;* 会读取相应的请求参数值&#xff0c;并且&#xff0c;会做类型转换。*/public String bmi3(BmiParam bp){System.out.println("b3()");System.out.println(bp.getHeight() &#43; " " &#43; bp.getWeight());return "view";}
##向页面传值 方式一 绑订数据到request
&#64;RequestMapping("/b4.do")public String bmi4(HttpServletRequest request){String status &#61; "很帅";request.setAttribute("status", status);//默认就是转发return "view";}
方式二 返回ModelAndView
&#64;RequestMapping("/b5.do")public ModelAndView bmi5(){ String status &#61; "很帅";/** 将数据添加到ModelAndView。* DispatcherServlet会将数据(data)取出来&#xff0c;* 然后绑订到request上&#xff08;以key作为绑订名&#xff09;。*/Map data &#61; new HashMap();data.put("status", status);ModelAndView mav &#61; new ModelAndView("view",data);return mav;}
方式三 绑订数据到ModelMap
&#64;RequestMapping("/b6.do")public String bmi6(ModelMap mm){double bmi &#61; weight / height / height;String status &#61; "很帅";/** DispatcherServlet从ModelMap中取出数据&#xff0c;* 然后绑订到request上&#xff08;以key作为绑订名&#xff09;。*/mm.addAttribute("status", status); return "view";}
方式四 绑订数据到session
&#64;RequestMapping("/b7.do")public String bmi7HttpSession session){ String status &#61; "很帅";session.setAttribute("status", status);return "view";}
##重定向 情形一 方法的返回值是String
return "redirect:toIndex.do"
情形二 方法的返回值是ModelAndView
RedirectView rv &#61; new RedirectView("toIndex.do");ModelAndView mav &#61; new ModelAndView(rv); return mav;