Spring和SpringMVC框架结构

一、介绍Spring

      1、Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

      2、概念:轻量级的IOC(控制反转或者依赖注入)、AOP(面向切面或者面向方面)

          AOP:在对程序不修改的情况下,对程序进行动态扩展。

        IOC:一种设计模式,控制权的反转,在程序中控制依赖转移到容器来控制。依赖注入,将相互依赖的对象

           分离,在Spring配置文件中,描述他们的依赖关系,相互建立依赖关系,用到一个对象时,直接使

           用,不需要New一个对象。

      3、什么是控制反转?

        ioc、Aop,当应用了ioc,一个对象的依赖的其他的对象会通过被动的方式注入进来,

        而不是程序员自己去New,创建、查找依赖的对象。

      4、什么是面向切面?

        允许程序通过分离的应用业务逻辑与系统级别服务、事物管理,进行内聚性的开发。

      5、容器

          Spring包含并且管理应用对象的配置和生命周期,可以配置每个bean如何被创建。

      6、框架

        Spring可以将简单的组件配置、组合成为复杂的应用,以及它们是如何被关联的,应用对象的生明式

        组合在一个xml文件中,提供了基础的功能(事物管理、持久化框架集成)

      7、Spring工作原理

        内部核心IOC,动态、注入,让一个对象创建不用New,可以自动产生。利用java的反射,反射原理就

        是运行时动态去创建、调用对象。Spring就是运行xmlSpring的配置文件,动态的去创建对象,调用对象里的方法!

      8、Spring注入方式有三种方式:Setter注入、构造注入、注解注入。

      9、Spring底层用的是工厂模式,是一个接口(beanFactory)
      

Spring.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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<bean id="user" class="com.zhiyou99.User.User"></bean> 		
	<bean id="aop" class="com.zhiyou99.AOP.TestAOP"></bean> 		
 		<aop:config>
 			<aop:pointcut expression="execution(* com.zhiyou99.User..*(..))" id="ab"/>
		 	<aop:aspect ref="aop">
<!-- 		 		 <aop:before method="BbBb" pointcut-ref="ab"/> -->
		 	<!-- 	 <aop:after-returning method="AaAa" pointcut-ref="ab"/> -->
		 		<!--  <aop:after-returning method="BbBb" pointcut-ref="ab"/> -->
		 	 	<!-- <aop:after-throwing method="CcCc" pointcut-ref="ab"/>
		 	 	<aop:after method="AaAa" pointcut-ref="ab"/>  -->
		 		
		 		<aop:around method="D" pointcut-ref="ab"/>  
		 	</aop:aspect>	
 		</aop:config>
</beans>

Spring2.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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<bean id="user" class="com.zhiyou99.User.User"></bean>
	<bean id="aop" class="com.zhiyou99.AOP.TestAOP"></bean>
	<aop:aspectj-autoproxy />
</beans>

SpringMVC

什么是MVC模式?

	M:model模型(JavaBean) v:view视图(jsp..)
	C:Controller控制器(Servlet) 目的:讲视图与模型结合在一起

什么是SpringMVC

	是一个基于MVC的框架,它能够在web开发中解决很多常见问题(参数接收,视图返回,文件上传,表单验证等..)而且使用特别的简单,与Spring无缝结合,目前很多公司招聘要求都是熟练使用SpringMVC

SpringMVC使用全注解形式:

	使用@RequestMapping来代表请求映射,请求映射路径不能重复,否则会报java.lang.IllegalStateException异常.当我们使用注解形式时,我们的controller映射路径是以方法为单位

使用注解的步骤:

	1)先在类上面贴上@Controller标签,声明这个类是controller
	2)使用RequestMapping来代表请求的路径
	3)在Spring.xml中开启MVC的注解支持 <mvc:annotation-driven />
	Tomcat对我们静态资源文件全部通过一个servlet来处理,此servlet的拦截路径同样为/.而容器启动的时候先
加载的肯定是Tomcat自身的web.xml文件,之后才会加载项目的web.xml如果项目的servlet拦截路径与Tomcat
的起冲突,则会覆盖掉Tomcat的servlet,这个时候我们需要在Spring.xml中配置
<mvc:default-servlet-handler/> 用来开启SpringMVC对静态资源文件的支持

SpringMVC接收参数的形式:

一.原生态Servlet接收(不用)  String name = request.getParameter("name");
二.形参列表方法接收(常用)  要求JSP的name与形参列表的参数名一直,如果不想一致的话,需要:@RequestParam("name123") 形参类型 变量名 	  					 			来接收,SpringMVC会自动的把对用的值注入到我们的形参列表中.	优点:对比于原生态,接收参数方便了许多
	缺点:如果接收数据较多的话,形参列表会超长
三.使用模型接收(常用)
	优点:无论多少数据,都可以直接使用model来接收
	缺点:jsp的name要求与model的字段名一致
	常见错误:HTTP Status 400 -Bad Request
	原因:提交的参数与model的类型不匹配
	解决问题:加入前台表单校验
四.URL地址传参
在@RequestMapping("/param4/{pass}")中使用{}包裹一个占位符,然后在形参列表中使用@PathVariable("pass")Integer id 获取对应占位符的值,兵注入对应的变量之中.
在类上添加:@RequestMapping("hello") 二级目录

SpringMVC编码过滤器(只针对post请求有效)
SpringMVC提供的编码过滤器是由org.springframework.web.filter包下存在的CharacterEncodingFilter类,其本身继承了OncePerRequestFilter是一个filter存在,所以我们只需要为web.xml中以配置filter的形式配置即可!

<!-- 配置SpringMVC提供的编码过滤器 -->
<filter>
	<filter-name>CharacterEncoding</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</filter>
<!-- 配置编码过滤器的拦截路径 -->
<filter-mapping>
	<filter-name>CharacterEncoding</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

SpringMVC传值的方法:

一.通过Servlet原生API方式
	req.setAttribute("msg", "今天天气好晴朗");
	req.getRequestDispatcher("index2.jsp").forward(req, rep);
二.通过ModelAndView返回
	ModelAndView mv=new ModelAndView();
	//	mv.addObject("msg", "明天天气好晴朗");
		User user=new User();
		user.setName("李四");
		User user2=new User();
		user2.setName("张三");
		user2.setPass(99);
	/*	mv.addObject(user);
		mv.addObject(user2);*/
		Map<String,User> map=new HashMap<>();
		map.put("m", user);
		map.put("n", user2);
		mv.addAllObjects(map);
		mv.setViewName("index2.jsp");
		return mv;
三.直接返回模型
	@RequestMapping("/value3")
	public User value3(HttpServletRequest req,HttpServletResponse rep){	
		User user=new User();
		user.setName("李四");
		return user;
	}
缺点:几乎没有优点,要求jsp名称必须与拦截路径一致,在开发中几乎无法实现
四:通过servlet原生API与String类型返回
五.单纯返回字符串
使用@ResponseBody 直接返回文本字符串,或JSON当前请求页面,不走视图解析器

Spring.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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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
       	http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
       	http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util.xsd
       	http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
       	http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	
<!-- 	<bean id="/hello" class="com.zhiyou100.Controller.HelloJava"></bean> -->
		<!-- 开启对MVC注解的支持 -->
		<mvc:annotation-driven/>
		<!-- 开启静态资源文件的处理 -->
		<mvc:default-servlet-handler/>
		<context:component-scan base-package="com.zhiyou100"/>
		<!-- 配置视图解析类 -->
	<!-- 	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<property name="prefix" value="WEB-INF/view/" />
			<property name="suffix" value=".jsp" />
		</bean> -->
</beans>

web.xml

<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SpringMVC</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  	<!-- 配置SpringMVC监听 -->
	<servlet>
	  	<servlet-name>SpringMVC</servlet-name>
	  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- 配置SpringMVC的拦截路径 -->
  	<servlet-mapping>
  		<servlet-name>SpringMVC</servlet-name>
		<url-pattern>/</url-pattern>
  	</servlet-mapping>
  	<!-- 配置SpringMVC提供的编码过滤器 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>  
	<!-- 配置SpringMVC的编码过滤器的拦截路径 -->
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

附 接受参数 .java

	package com.zhiyou100.Controller;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import org.springframework.stereotype.Controller;
	import org.springframework.web.bind.annotation.PathVariable;
	import org.springframework.web.bind.annotation.RequestMapping;
	import org.springframework.web.bind.annotation.RequestParam;
	import org.springframework.web.servlet.ModelAndView;
	import com.zhiyou100.model.User;
	
	@Controller
	public class HelloJava {
		
		@RequestMapping("hello")
		public ModelAndView hello(HttpServletRequest request, HttpServletResponse response){
			System.out.println("Hello Java!!!");
			return null;
		}
		@RequestMapping("hello1")
		public ModelAndView hello1(HttpServletRequest request, HttpServletResponse response){
			System.out.println("Hello Java!!!");
			return null;
		}
	//	使用servlet 原生API接受参数
		@RequestMapping("/param1")
		public ModelAndView param1(HttpServletRequest request, HttpServletResponse response){
			String name = request.getParameter("name");
			String password = request.getParameter("password");
			System.out.println("账户:"+name+"  密码:"+password);
			return null;
		}
		@RequestMapping("/param2")
		public ModelAndView param2(HttpServletRequest request, HttpServletResponse response,@RequestParam("name123")String name,String password){
			System.out.println("账户:"+name+"  密码:"+password);
			return null;
		}
		@RequestMapping("/param3")
		public ModelAndView param3(HttpServletRequest request, HttpServletResponse response,User user){
	//		System.out.println("账户:"+user.getName()+"  密码:"+user.getPassword());
			System.out.println(user);
			return null;
		}
		@RequestMapping("/param4/{password}")
		public ModelAndView param4(HttpServletRequest request, HttpServletResponse response,@PathVariable("password")Integer id){
			System.out.println(id);
			return null;
		}
	}

附 传值.java

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.zhiyou100.model.User;

@Controller
public class ValuesController {

	@RequestMapping("value1")
	public ModelAndView value1(HttpServletRequest request,HttpServletResponse response) throws Exception{
		request.setAttribute("msg", "今天好冷a");
		request.getRequestDispatcher("index2.jsp").forward(request, response);
		return null;
	}
	@RequestMapping("value2")
	public ModelAndView value2(HttpServletRequest request,HttpServletResponse response) throws Exception{
		ModelAndView modelAndView = new ModelAndView();
//		modelAndView.addObject("msg", "明天要下雨了");
//		只传单个,根据User的小写user ,String的为string...
//		modelAndView.addObject("我打字很慢");
		User user= new User();
		user.setName("李四");
		user.setPassword(80);
		User user2=new User();
		user2.setName("张三");
		user2.setPassword(70);
/*		modelAndView.addObject(user);
		modelAndView.addObject(user2);*/
		Map<String,User> map = new HashMap<>();
		map.put("m", user);
		map.put("n", user2);
		modelAndView.addAllObjects(map);
		modelAndView.setViewName("index2.jsp");
		return modelAndView;
	}
//	视图解析
	@RequestMapping("value3")
	public User value3(HttpServletRequest request,HttpServletResponse response){
		User user= new User();
		user.setName("李四");
		user.setPassword(123);
		return user;
	}
	@RequestMapping("value4")
	public String value4(HttpServletRequest request,HttpServletResponse response){
		User user= new User();
		user.setName("李四");
		user.setPassword(123);
		request.setAttribute("user", user);
		return "UserShow.jsp";
	}
	@ResponseBody
	@RequestMapping("value5")
	public String value5(HttpServletRequest request,HttpServletResponse response){
		return "asdazrsz";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值