一、介绍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";
}
}