Spring MVC是一个基于MVC(Model view Controller)模式的WEB框架,它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化、等等),使用非常简单,SpringMvc作为Spring中的一个模块,可以与Spring无缝集成。
SpringMvc以Spring框架为核心,为应用程序中的Web层(表现层)提出的一套优秀的解决方案。
spring-webmvc-4.1.2.RELEASE.jar SpringMVC的jar文件。
spring-web-4.1.2.RELEASE.jar Spring对Web项目运行的支持。
1.1.1. MVC框架思想-核心控制器(前端控制器)
顾名思义核心控制器用于Web层核心功能的处理以及在所有控制器执行的。所有的WebMvc框架都采用了这种方式。
在Struts2中我们使用的是StrutsPrepareAndExecuteFilter作为核心控制器,在SpringMVC中使用的是DispatcherServlet为核心控制器.
DispatcherServlet核心控制器会拦截匹配的请求,把拦截下来的请求,依据相应的规则分发到目标Controller来处理。
创建项目确保Spring可用
导入jar包
com.springsource.org.apache.commons.logging-1.1.1.jar(版本三)
spring-beans-4.1.2.RELEASE.jar
spring-context-4.1.2.RELEASE.jar
spring-core-4.1.2.RELEASE.jar
spring-expression-4.1.2.RELEASE.jar
spring aop、orm、jdbc、tx相关jar根据项目使用自行添加;
准备配置文件配置 applicationContext.xml
1.1.1. 加入相关Spring mvc相关jar包。
spring-web-4.1.2.RELEASE.jar spring 对web项目的支持。
spring-webmvc-4.1.2.RELEASE.jar SpringMVC核心包。
1.1.1. 配置核心控制器
Webmvc框架的心脏就是核心控制器,负责所有请求的公共功能,然后再分发给具体的控制器(我们编写的控制器),完成业务逻辑,响应视图。
配置:
<!-- springmvc的核心控制器,拦截所有的请求,负责分发到对应的Controller中的方法 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- / 拦截所有的请求,拦截Controller的地址
/*拦截所有的请求,会拦截*.jsp类似请求
*.do *.action 拦截.do .action结尾的请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
1.1.1. 准备SpringMVC映射文件
规范要求 |
说明 |
实现Controller接口或子接口。 注意:子接口很多已经过时了。 |
核心方法为handleRequest(req,resp),处理用户请求 |
普通的类(常用的哦) |
使用一个普通的类作为我们的控制器,每一个方法就是一个处理器,这种方式需要配合注解标签才能使用。 |
SpringMVC是Spring的一个模块,它的配置文件就是Spring的配置差不多,复制一份applicationContext.xml修改为applicationContext-mvc.xml。
SpringMVC中的控制器有一定规范,要么实现接口,要么使用POJO对象与注解配合使用。
handleRequest方法的两个参数与我们以前的servlet中service方法一样,request和response对象,我们可以使用这个两个对象完成一次请求的所有工作,比如你可以使用request接受参数,或者使用response重定向等等,注意方法除了返回值以外还有一个返回值ModelAndView。
1 SpringMVC的控制器Controller,和Struts2中的action一样。 2 */ 3 public class HelloController implements Controller{ 4 /** 5 * 处理请求方法。 6 * request:封装了请求对象; 7 * response:封装了这个请求的响应对象 8 * 返回一个ModelAndView对象: 9 * Model:模型 ,封装我们的数据 10 * View:视图,返回的jsp页面 11 * ModelAndView对象是springmvc控制器中的一个对象,用于封装数据模型和返回页面视图 12 */ 13 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 14 //获取请求参数 15 System.out.println("HelloController...."); 16 //调用service进行业务逻辑处理 17 System.out.println("HelloController 已经进行了业务逻辑处理"); 18 //返回jsp页面视图 19 ModelAndView mAndView = new ModelAndView(); 20 mAndView.setViewName("/01jsp/01_hello.jsp"); 21 return mAndView; 22 } 23 24 }
1)配置
SpringMVC是基于Spring,Spring中的核心就是Ioc容器,而Ioc容器中最重要的成员就是<bean>,SpringMVC中的控制器也是一个一个<bean>。使用name属性:表示这个Controller的访问路径
1 <!-- springmvc的核心控制器,拦截所有的请求,负责分发到对应的Controller中的方法 --> 2 <servlet> 3 <servlet-name>springmvc</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 6 <!-- 启动springmvc的核心控制器的时候,就初始化加载springmvc的配置文件 --> 7 <init-param> 8 <param-name>contextConfigLocation</param-name> 9 <param-value>classpath:applicationContext-mvc.xml</param-value> 10 </init-param> 11 <!-- DispatcherServlet启动比较耗时,在启动加载文件的时候就进行加载 --> 12 <load-on-startup>1</load-on-startup> 13 </servlet> 14 <servlet-mapping> 15 <servlet-name>springmvc</servlet-name> 16 <!-- / 拦截所有的请求 17 /*拦截所有的请求 18 *.do *.action 拦截.do .action结尾的请求 19 --> 20 <url-pattern>/</url-pattern> 21 </servlet-mapping>
1.1.1. 入门小结:
①:创建一个动态工程,配置tomcat和编译路径
②:Spring的环境准备:导入基本的5个jar包和一个applicationContext.xml配置文件
③:Springmvc的环境的准备:
Web ,webmvc的两个jar包;
applicationContext-mvc.xml的配置文件
Web.xml:配置核心控制器:DispatcherServlet
④:Controller的准备:写一个类,实现Controller接口,覆写方法,返回一个视图jsp页面
同时应把这个Controller配置到applicationContext-mvc.xml,变成一个bean,name就是访问的路径
⑤:准备一个jsp视图
⑥:启动测试
1.1. 静态资源文件访问问题
由于我们配置的拦截器规则是”/”,”/”就代表默认控制器,tomcat本身自带有一个默认控制器,这个控制器用于处理静态资源请求,如果我们配置默认控制器,那么tomcat的默认控制器就不生效,导致静态资源无法访问。
解决办法:springmvc开启静态资源控制器。(适应于HTML页面视图)
<mvc:default-servlet-handler/>
1.1. 控制器三种实现方式
① 实现Controller接口
② 实现HttpRequestHandler接口
③ 普通类(pojo)和注解 @RequestMapping
public class ImplController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("我implements Controller进来了。。。。。"); return null; } }
配置:将这个Controller交给spring管理,并使用name属性配置映射关系(就是这个Controller的访问路径)
1 public class HandlerController implements HttpRequestHandler { 2 @Override 3 public void handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { 4 System.out.println("进来了implements HttpRequestHandler。。。。"); 5 } 6 }
配置:将这个Controller交给spring管理,并使用name属性配置映射关系(就是这个Controller的访问路径)。
缺点:只能有一个方法,不能实现多个地址的映射
普通类(pojo)和注解
1 @RequestMapping("/user") 2 public class UserController { 3 /** 4 * 一个Index方法 5 * @return 6 */ 7 @RequestMapping("/index")//访问地址:/user/index 8 public String index(){ 9 System.out.println("我是一个index。。。。。。。。。。。。"); 10 return ""; 11 } 12 /** 13 * 一个list方法 14 * @return 15 */ 16 @RequestMapping("/list")//访问地址:/user/list 17 public void list(){ 18 System.out.println("我是一个list。。。。。。。。。。。。"); 19 } 20 21 }
配置:@RequestMapping配置类上和方法上
(只需要配置让spring管理这个bean即可,无需指定路径,因为方法上面通过@RequestMapping指定)
<!-- Controller的实现:方式一:定义一个普通的java类-->
<bean class="cn.itsource.springmvc._02_controller.UserController"> </bean>
需要开启SprigMVC注解支持:
<!-- 开启Springmvc的注解驱动:扫描@RequestMapping等注解 -->
<mvc:annotation-driven/>
总结
Springmvc中所有控制器,其实在spring中就是一个一个bean。
spring管理bean的方法分为两种,第一种是xml,,第二种是注解。
Springmvc中控制器建议使用注解方式,是官方推荐的,也外面公司使用方式。
控制器注解实现方式
1 /** 2 * 3 * Controller的实现: 4 * 全注解: 5 * @Controller的配置:相当于一起的xml中的bean配置 6 * @RequestMapping("/department")配置:bean的name的配置 7 * 8 * 注意:需要配置spring注解的扫描路径 9 * <!-- 开启Spring的注解的扫描:@Controller @Service @Repository @Component等 --> 10 <context:component-scan base-package="cn.itsource.springmvc"/> 11 * 开启springmvc注解的扫描: 12 * <!-- 开启Springmvc的注解驱动:扫描@RequestMapping等注解 --> 13 <mvc:annotation-driven/> 14 * @author admin 15 * 16 */ 17 @Controller//将这个类,交给Spring管理,需要开启注解的扫描路径 18 @RequestMapping("/department") 19 public class DepartmentController { 20 21 @RequestMapping("/index") 22 public void index(){ 23 System.out.println("index..........."); 24 } 25 @RequestMapping("/del") 26 public void del(){ 27 System.out.println("del......."); 28 } 29 30 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:mvc="http://www.springframework.org/schema/mvc" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xsi:schemaLocation=" 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 10 <!-- 开启springMVC的默认处理控制器 :处理静态资源 --> 11 <mvc:default-servlet-handler /> 12 <!-- 开启spring对mvc注解支持功能,能识别@RequestMapping等注解 --> 13 <mvc:annotation-driven /> 14 <!-- 开启spring对注解配置支持,默认这个配置是存在的,但是为了规范起见,还是写上:@Controller:controller @Service:service @Repository:dao @Component :其他 --> 15 <context:annotation-config /> 16 <!-- 组件扫描路径 --> 17 <context:component-scan base-package="cn.itsource.springmvc" /> 18 </beans>
和struts2一样,控制器除了我们前面重点讲解处理请求并返回视图以外,还需要一些事情,比如接收页面传递参数、绑定数据到页面、返回json数据、文件上传、文件下载等
参数接收
配置请求编码过滤器
参数接收,首先要考虑乱码问题。然而springmvc框架本身没有处理请求编码,但是spring框架为我们提供了一个请求编码过滤器,我们在web.xml配置一个请求编码过滤器。
1.1. 参数接收
1.1.1. 配置请求编码过滤器
参数接收,首先要考虑乱码问题。然而springmvc框架本身没有处理请求编码,但是spring框架为我们提供了一个请求编码过滤器,我们在web.xml配置一个请求编码过滤器。
1 <!-- 支持UTF-8编码 --> 2 <filter> 3 <filter-name>characterEncoding</filter-name> 4 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 5 <init-param> 6 <param-name>encoding</param-name> 7 <param-value>UTF-8</param-value> 8 </init-param> 9 </filter> 10 <filter-mapping> 11 <filter-name>characterEncoding</filter-name> 12 <url-pattern>/*</url-pattern> 13 </filter-mapping>
1.1.1. 参数接收方式
① 通过控制器的执行方法参数来接收普通参数
② 通过Domain模型对象来接收
③ 通过传统的HttpServletRequest接收
④ 通过url中的参数接收(restfull风格) @PathVariable("id")转换
1.通过控制器的执行方法参数来接收普通参数
2.通过模型对象来接收(常用)
3.接收url中参数的请求,接收用户请求参数值
4.通过传统的HttpServletRequest接收
1.1. 数据传递
就是Controller往前台(页面)传递数据
① 通过ModelAndView对象传递
② 通过Model对象传递
③ 通过request对象传递
④ 通过返回值传递
①通过ModelAndView对象传递
/** * 通过一个ModelAndView对象来传递参数 * @return */ @RequestMapping("/demo1") public ModelAndView demo1() { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg", "大家好啊"); modelAndView.setViewName("/03jsp_contrlloerParamsToView/controllerToView.jsp"); User user=new User("zs", 13, 11L); modelAndView.addObject(user); return modelAndView;
2. 通过Model对象进行数据传递
1 /** 2 * 通过形参中的一个Model对象来传递参数。 3 * springMvc自动创建模型对象传入到方法中,我们只需要在这个模型上添加数据就以。 4 * @param model 封装数据的模型对象 5 * @return 返回值是一个字符串,表示是返回的视图view 6 */ 7 @RequestMapping("/demo2") 8 public String demo2(Model model) { 9 model.addAttribute("msg", "一点都不好"); 10 return "/03jsp_contrlloerParamsToView/controllerToView.jsp"; 11 }
3.通过request对象进行数据传递
1 /** 2 * 使用原始的在request上添加属性 3 * @param request 4 * @return 返回值是一个字符串,表示返回的视图view 5 */ 6 @RequestMapping("/demo3") 7 public String demo3(HttpServletRequest request) { 8 request.setAttribute("msg", "我是另一种方式了哦"); 9 return "/03jsp_contrlloerParamsToView/controllerToView.jsp"; 10 }
4.通过返回值传递数据
1 /** 2 * 返回一个自定义对象:user。 3 * 返回值就是模型数据。 4 * springmvc会自动创建一个ModelAndView对象,mav,将uer添加到mav中:mav.addObject("user",user); 5 * 并且返回视图路径就是访问路径:mav.setViewName("/demo4.jsp"); 6 * @return 7 */ 8 @RequestMapping("/demo4") 9 public User demo4() { 10 User user=new User("2",34,34L); 11 return user; 12 } 13 14 yi
原文:https://www.cnblogs.com/wzscom/p/10514152.html