Spring,Spring MVC 小结

Spring

Spring是开源的具有IOC功能和AOP思想的实例容器,它能管理和装配实例供项目使用。它是轻量型非侵入式的框架,轻量是因为它的大小和开销都很小,非侵入是指Spring开发应用中的对象可以不依赖Spring的API。

Spring IOC

控制反转(Inversion of Control),将原来由代码控制反转为配置Xml文件控制

核心组成:容器 自动注入要使用的类,返回代理对象。

运行时扫描Bean目录创建Bean实例,找到set方法注入要使用的类。

Spring DI

依赖注入(Dependency Injection),IOC的另一种表述方式,组件以预先定义好的方法(例如set方法)接收容器的注入。

Spring AOP

面向切面编程(Aspect-Oriented Programming),AOP 的主要编程对象是切面(aspect),切面就是横切关注点(跨越应用程序多个模块的功能/业务)被模块化的特殊对象。它把应用中可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中,使得每个业务逻辑位于一个位置, 代码不分散, 便于维护和升级。

Spring配置

1.导入Spring的Jar包
com.springsource.org.apache.commons.logging-1.1.1.jar
spring-beans-4.2.1.RELEASE.jar
spring-context-4.2.1.RELEASE.jar
spring-context-support-4.2.1.RELEASE.jar
spring-core-4.2.1.RELEASE.jar
spring-expression-4.2.1.RELEASE.jar

  1. xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
   
   
    <!-- 管理实例 p1   -->
    <!--   key       value 要管理类型的实例-->
    <bean id="p1" class="com.senchen.ioc.test.Person">
         <!--        set方法       value set方法需要的参数-->
        <property name="pid"        value="10"/>
        <property name="pname"      value="哈哈1"/>
        <property name="pweight"    value="180"/>
    </bean>
    
    <!-- 管理实例 p2 -->
    <bean id="p2" class="com.senchen.ioc.test.Person">
        <constructor-arg index="1"  value="哼哼"/>
        <constructor-arg type="int" value="201"/>
        <constructor-arg type="double"  value="20"/>
    </bean>
        
</beans>        

3.使用:

package com.senchen.ioc.run;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.senchen.ioc.test.Person;

public class Test {

    
    public static void main(String[] args) {
        //创建springIoc容器,web项目使用Listener创建
        ApplicationContext cxt=new ClassPathXmlApplicationContext("app.xml");
        
        //从容器中取出要使用的实例
        Person a=(Person) cxt.getBean("p1");
        
        System.out.println(a.getPid());
        System.out.println(a.getPname());
        System.out.println(a.getPweight());
        
        System.out.println("--------------------------");
        //从容器中取出要使用的实例
        Person b=(Person) cxt.getBean("p2");
        
        System.out.println(b.getPid());
        System.out.println(b.getPname());
        System.out.println(b.getPweight());
        
        
    }//main()

}

Spring 使用注解配置

1.再导入Spring的扫描Jar包
spring-context-4.2.1.RELEASE.jar
spring-context-support-4.2.1.RELEASE.jar

2.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   
   xmlns:context="http://www.springframework.org/schema/context"
    
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
   
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
  
  <context:component-scan base-package="com.senchen.ioc" ><!-- 扫描并加载ioc及其子包所有注解 -->
    <!--   扫描时不扫描Controller
        <context:exclude-filter  type="annotation"  expression="org.springframework.stereotype.Controller" /> 
     -->         
  </context:component-scan>
  
  
</beans>        

3使用注解

package com.senchen.ioc;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import com.senchen.ioc.manager.PersonManager;
import com.senchen.ioc.manager.UserManager;


@Controller                     //<bean id="pCtrl"  class="com.senchen.ioc.PersonController"  autowire="byType" /> 
public class PersonController {
    
    
    //@Resource(name="aa")              //使用byName注入,无需set方法
    @Autowired
    @Qualifier("aa")                    //使用byName注入
    PersonManager pmng;
    
    //@Resource                         //使用byType注入,无需set方法
    @Autowired                          //使用byType注入
    UserManager umng; 
    
    public void  preUpd() {
        System.out.println(this.getClass()+"....preUpd....");
        System.out.println(this.getClass()+"....查找详情....");
        
        System.out.println(pmng);
        pmng.list();
        
        System.out.println(this.getClass()+"....查找登陆信息....");
        umng.findAll();
        
    }//preUpd
    
    
    
}

Spring MVC

Spring 的一个模块,MVC开发模式中的Model 2 模式的一种实现方式。

核心组成:分发器(DispatcherServlet) 、处理器映射(HanderMapping)、控制器(Controller)、视图解析器(ViewResolver)

Spring MVC.png

运行过程/工作原理:

  1. 请求提交给DispatcherServlet,它会委托应用系统的其他模块对请求进行真正的处理;

2.DispatcherServlet查询一个或多个HanderMapping,找到处理请求的Controller;

3.DispatcherServlet通过HanderAdapter将请求提交到目标Controller;

4.Controller进行业务逻辑处理后,会返回一个ModelAndView;

5.DispatcherServlet查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象View;

6.视图对象负责渲染返回给客户端。

MVC设计思想

把应用的输入、输出、处理、分离出来,分别称为模型(Model)、视图(View)、控制器(controller)。

模型(Model):完成应用业务/功能的类

视图(View):接收数据、展示数据

控制器(controller):决定调用某个model,负责跳转

Spring MVC的简单配置

1.导入Jar包
com.springsource.org.apache.commons.logging-1.1.1.jar
spring-aop-4.2.1.RELEASE.jar
spring-beans-4.2.1.RELEASE.jar
spring-context-4.2.1.RELEASE.jar
spring-context-support-4.2.1.RELEASE.jar
spring-core-4.2.1.RELEASE.jar
spring-expression-4.2.1.RELEASE.jar
spring-web-4.2.1.RELEASE.jar
spring-webmvc-4.2.1.RELEASE.jar

2.web.xml配置加入前端控制器(DispatcherServlet),传入Spring配置文件的位置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name></display-name>
  
  <servlet>
    <servlet-name>example</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:appContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>example</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

3.编写Spring MVC的配置文件appContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    
    <!-- 自动扫描controller的位置  -->
    <context:component-scan base-package="com.senchen.controller"/>
    
    
    
    <!-- 试图解析器  springMVC管理的jsp文件位置应该在 /WEB-INF/meto/  -->
    <!-- jsp的位置  -->
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/meto/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

4.编写Controller加入Spring注解

package com.senchen.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.senchen.entity.Users;


@Controller      //加入容器管理
@RequestMapping("/sss")      //接收的URL
public class ScondController {
    @RequestMapping("/aaa")
    public String f1(HttpServletRequest req){
        String p0 = req.getParameter("name");
        String p1 = req.getParameter("age");
        System.out.println("日志1...HttpServletRequest 接收 p0:"+p0+"\t"+p1);
        return "redirect:/first.jsp";
    }
    @RequestMapping("/bbb")
    public String f2(   String name,int age  ){
        
        System.out.println("日志2...方法中参数 接收 "+name+"\t"+age);
        return "redirect:/first.jsp";
    }
    
    @RequestMapping("/ccc")
    public String f2(   Users u  ){
        
        System.out.println("日志3...对象的get方法 接收 "+u.getUname()+"\t"+u.getUage());
        return "second";   //返回了jsp名称(需要视图解析器拼凑 前缀+名字+后缀)
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容