2023SpringBoot教学课件 第2讲 Spring MVC_第1页
2023SpringBoot教学课件 第2讲 Spring MVC_第2页
2023SpringBoot教学课件 第2讲 Spring MVC_第3页
2023SpringBoot教学课件 第2讲 Spring MVC_第4页
2023SpringBoot教学课件 第2讲 Spring MVC_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2讲SpringMVCfdteachers@163.comSpringBoot导学课Spring,SpringMVC,SpringBoot有什么区别和联系SpringmakesiteasytocreateJavaenterpriseapplications.ItprovideseverythingyouneedtoembracetheJavalanguageinanenterpriseenvironmentSpring主要是基于IOC反转Beans管理Bean类SpringMVC是基于Spring的一个MVC框架,拥有web功能SpringBoot是基于Spring4的条件注册的一套快速开发整合包SpringCloud:现在是大数据、云时代,上云是必然选择,那么SpringCloud应运而生1SpringMVC是基于Spring的一个MVC框架,用以替代初期的SSH框架;(springFramework本身没有Web功能,SpringMVC使用WebApplicationContext类扩展ApplicationContext,使得拥有web功能)SpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面SpringBoot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题—>习惯大于约定。2众所周知Spring框架需要进行大量的配置,SpringBoot引入自动配置的概念,让项目设置变得很容易。SpringBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具3使用Spring进行开发各种配置过于麻烦比如开启某些Spring特性时,需要用XML或Java进行显式配置。于是,SpringBoot诞生了Spring旨在简化J2EE企业应用程序开发。SpringBoot旨在简化Spring开发(减少配置文件,开箱即用!)SpringBoot只是简化了配置,如果你需要构建MVC架构的Web程序,你还是需要使用SpringMVC作为MVC框架,只是说SpringBoot帮你简化了SpringMVC的很多配置,真正做到开箱即用springboot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然也就包含springmvc4如果承载的是WEB项目,使用SpringMVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是SpringMVC做的而不是SpringBoot熟悉使用Springboot,还有必要学习SpringMVC么如果你不是为了面试的话,就没太必要专门学了,因为你学SpringBoot其实就已经学了SpringMVC56springboot和SSM有以下几个主要区别springboot提供了一种约定优于配置的方式,它可以根据项目的依赖自动配置合适的组件,无需手动编写大量的配置文件。SSM则需要开发者自己配置各个框架之间的集成和协调,这会增加开发和维护的复杂度springboot支持创建可执行的jar包,这意味着可以直接运行一个jar文件来启动应用程序,无需额外的服务器容器。SSM则需要部署到一个服务器容器中,如Tomcat或Jetty,这会增加部署和运行的成本springboot拥有一个强大的生态系统,它提供了许多与其他技术集成的模块,如数据库、缓存、消息队列、安全、监控等。SSM则需要开发者自己寻找合适的第三方库来实现这些功能,这会增加开发和测试的难度。springboot更适合开发微服务架构的应用程序,它可以快速创建独立运行、松耦合、易于扩展的服务。SSM则更适合开发传统的单体应用程序,它可以实现较为复杂和稳定的业务逻辑7SSM框架项目会有大量的配置文件,需要手动的去整合SpringMVC、Spring、MyBatis,并且需要注意各种配置和兼容,后期的维护难度也很大SpringBoot的目的:快速整合和自动配置8SpringBoot开发相较于SSM开发,具有以下优势1.快速开发:SpringBoot采用约定大于配置的方式,大量减少了开发的配置量,提供丰富的自动配置,使开发者更加专注于业务逻辑的实现。

2.微服务支持:SpringBoot是微服务框架的首选,提供了各种与微服务相关的组件和功能,如服务注册和发现、负载均衡、调用链跟踪等。

3.灵活配置:SpringBoot采用Yaml格式的配置文件,使得配置更加清晰、具有易读性、易维护性;同时,支持动态更新配置,避免因为修改配置而重启应用程序的缺陷。4.大量Starter:提供了大量的开箱即用的Starter,便于程序员集成各种中间件,只需引入相应的Starter,SpringBoot就会根据classpath下的依赖自动生成相应的基础设置。9SpringBoot的优点

Spring由于其繁琐的配置,一度被人认为“配置地狱”,各种XML、Annotation配置,让人眼花缭乱,而且如果出错了也很难找出原因。pringBoot帮助开发者快速启动一个Web容器;SpringBoot继承了原有Spring框架的优秀基因;SpringBoot简化了使用Spring的过程。在使用SSM开发的时候,多数会选择Jsp作为视图,但是springboot不推荐使用jsp,主推的是thymeleaf和freemarker等模板引擎综上,SpringBoot适用于构建基于微服务架构的应用程序,简化了应用的开发和部署,提高了应用的可维护性和可扩展性;而SSM框架适用于构建传统的JavaWeb应用程序,遵循MVC模式,将业务逻辑和数据持久层分离,实现更好的可维护性和可扩展性。10学习最佳入门路径先看官方文档开始实践做完一两个实际项目之后,返回去再读一遍文档11Spring和springboot的区别12131415161718192021springboot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然也就包含springmvc。springmvc只是spring处理web层请求的一个模块SpringMVC提供了一种轻度耦合的方式来开发web应用。SpringMVC是Spring的一个模块,是一个web框架SpringBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置22SpringBoot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用SpringMVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是SpringMVC做的而不是SpringBoot。对使用者来说,换用SpringBoot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。23thymeleaf有必要学吗?24Spring的运行原理25262728SpringBoot知识体系29SpringBoot配置与日志SpringBoot的Web开发SpringBoot的数据访问SpringBoot的异步消息服务SpringBoot的安全管理SpringBoot的热部署与单元测试SpringBoot应用监控与任务管理本章目标了解SpringMVC的工作原理掌握基于注解的控制器的编写方式了解数据绑定的基本原理掌握SpringMVC应用的开发步骤了解拦截器的基本用法30本章内容312.1SpringMVC的工作原理2.2SpringMVC的工作环境2.3基于注解的控制器2.4表单标签库与数据绑定2.5JSON数据交互2.6拦截器2.7文件上传2.1SpringMVC的工作原理32?请思考

SpringMVC框架的核心控制器是?SpringMVC的工作流程1.客户端请求提交到DispatcherServlet;2.由DispatcherServlet控制器寻找一个或多个HandlerMapping,找到处理请求的Controller;3.DispatcherServlet将请求提交到Controller;4.Controller调用业务逻辑处理后,返回ModelAndView;5.DispatcherServlet寻找一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图;6.视图负责将结果显示到客户端。33SpringMVC接口SpringMVC所有的请求都经过DispatcherServlet接口来统一分发。DispatcherServlet将请求分发给Controller之前,需要借助于SpringMVC提供的HandlerMapping定位到具体的Controller。HandlerMapping接口负责完成客户请求到Controller映射。Controller接口将处理用户请求,这和JavaServlet扮演的角色是一致的。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。ViewResolver接口(视图解析器)在Web应用中负责查找View对象,从而将相应结果渲染给客户。34本章内容352.1SpringMVC的工作原理2.2SpringMVC的工作环境2.3基于注解的控制器2.4表单标签库与数据绑定2.5JSON数据交互2.6拦截器2.7文件上传2.2SpringMVC的工作环境2.2.1SpringMVC所需要的JAR包2.2.2使用Eclipse开发SpringMVC的Web应用362.2.1SpringMVC所需要的JAR包对于SpringMVC框架的初学者,开发SpringMVC应用时,只需将Spring的4个基础包、commons-logging-1.2.jar、注解时需要的JAR包spring-aop-5.1.4.RELEASE.jar和SpringMVC相关的JAR包(spring-web-5.3.2.jar和spring-webmvc-5.3.2.jar)复制到Web应用的WEB-INF/lib目录下即可。372.2SpringMVC的工作环境2.2.1SpringMVC所需要的JAR包2.2.2使用Eclipse开发SpringMVC的Web应用382.2.2使用Eclipse开发SpringMVC的Web应用【例2-1】SpringMVC入门程序的实现过程。1.创建Web应用ch2_1并导入JAR包创建Web应用ch2_1,导入如2.2.1节所示的JAR包。2.在web.xml文件中部署SpringMVC核心控制器DispatcherServlet在开发SpringMVC应用时,需要在WEB-INF目录下,创建web.xml文件,并在该文件中部署DispatcherServlet。39部署SpringMVC核心控制器DispatcherServlet40<!--配置springmvcDispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>3.创建Web应用首页在ch2_1应用的WebContent目录下,有个应用首页index.jsp。41<body>

没注册的用户,请<ahref="index/register">注册</a>!<br>

已注册的用户,去<ahref="index/login">登录</a>!</body>4.创建Controller类在ch2_1应用的src目录下,创建包controller,并在该包中创建基于注解的名为“IndexController”的控制器类,该类中有两个处理请求方法,分别处理首页index.jsp中“注册(index/register)”和“登录(index/login)”超链接请求。42@Controller@RequestMapping("/index")publicclassIndexController{ @RequestMapping("/login") publicStringlogin(){ return"login"; } @RequestMapping("/register") publicStringregister(){ return"register"; }}?请思考

与前端请求URL是什么关系?5.创建SpringMVC的配置文件在SpringMVC中,使用扫描机制找到应用中所有基于注解的控制器类。所以,为了让控制器类被SpringMVC框架扫描到,需要在配置文件中声明spring-context,并使用<context:component-scan/>元素指定控制器类的基本包(请确保所有控制器类都在基本包及其子包下)。另外,需要在配置文件中定义SpringMVC的视图解析器(ViewResolver)。43<!--使用扫描机制,扫描控制器类-->

<context:component-scanbase-package="controller"/> <!--配置视图解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!--前缀--><propertyname="prefix"value="/WEB-INF/jsp/"/><!--后缀--><propertyname="suffix"value=".jsp"/></bean>6.应用的其他页面IndexController控制器的register方法处理成功后,跳转到“/WEB-INF/jsp/register.jsp”视图;IndexController控制器的login方法处理成功后,跳转到“/WEB-INF/jsp/login.jsp”视图。因此,应用的“/WEB-INF/jsp”目录下应有“register.jsp”和“login.jsp”页面。44?请思考

与视图解析器是什么关系?7.发布并运行SpringMVC应用在Eclipse中第1次运行SpringMVC应用时,需要将应用发布到Tomcat。例如,运行ch2_1应用时,可以右击应用名称ch2_1,选择RunAs/RunonServer即完成发布并运行。45本章内容462.1SpringMVC的工作原理2.2SpringMVC的工作环境2.3基于注解的控制器2.4表单标签库与数据绑定2.5JSON数据交互2.6拦截器2.7文件上传2.3基于注解的控制器2.3.1Controller注解类型2.3.2RequestMapping注解类型2.3.3编写请求处理方法2.3.4Controller接收请求参数的常见方式2.3.5重定向与转发2.3.6应用@Autowired进行依赖注入2.3.7@ModelAttribute472.3.1Controller注解类型在SpringMVC中,使用org.springframework.stereotype.Controller注解类型声明某类的实例是一个控制器。例如,2.2.2节中的IndexController控制器类。别忘了在SpringMVC的配置文件中使用<context:component-scan/>元素(见【例2-1】)指定控制器类的基本包,进而扫描所有注解的控制器类。482.3基于注解的控制器2.3.1Controller注解类型2.3.2RequestMapping注解类型2.3.3编写请求处理方法2.3.4Controller接收请求参数的常见方式2.3.5重定向与转发2.3.6应用@Autowired进行依赖注入2.3.7@ModelAttribute492.3.2RequestMapping注解类型在基于注解的控制器类中,可以为每个请求编写对应的处理方法。如何将请求与处理方法一一对应呢?需要使用org.springframework.web.bind.annotation.RequestMapping注解类型将请求与处理方法一一对应。50方法级别注解51@ControllerpublicclassIndexController{

@RequestMapping(value="/index/login") publicStringlogin(){ /**login代表逻辑视图名称,需要根据SpringMVC配置中 *internalResourceViewResolver的前缀和后缀找到对应的物理视图 */ return"login"; }

@RequestMapping(value="/index/register") publicStringregister(){ return"register"; }}

注解的value属性将请求URI映射到方法,value属性是RequestMapping注解的默认属性,如果就一个value属性,则可省略该属性。可以使用如下URL访问login方法(请求处理方法):http://localhost:xxx/yyyy/index/login类级别注解52@Controller@RequestMapping("/index")publicclassIndexController{

@RequestMapping("/login") publicStringlogin(){ return"login"; }

@RequestMapping("/register") publicStringregister(){ return"register"; }}为了方便程序维护,建议开发者采用类级别注解,将相关处理放在同一个控制器类中,例如,对商品的增、删、改、查处理方法都可以放在一个名为GoodsOperate的控制类中。2.3基于注解的控制器2.3.1Controller注解类型2.3.2RequestMapping注解类型2.3.3编写请求处理方法2.3.4Controller接收请求参数的常见方式2.3.5重定向与转发2.3.6应用@Autowired进行依赖注入2.3.7@ModelAttribute53请求处理方法中常出现的参数类型54@Controller@RequestMapping("/index")publicclassIndexController{ @RequestMapping("/login") publicStringlogin(HttpSessionsession,HttpServletRequestrequest){ session.setAttribute("skey","session范围的值"); request.setAttribute("rkey","request范围的值"); return"login"; }}除了ServletAPI参数类型外,还有输入输出流、表单实体类、注解类型、与Spring框架相关的类型等等。但特别重要的类型是org.springframework.ui.Model类型,该类型是一个包含Map的Spring框架类型。每次调用请求处理方法时,SpringMVC都将创建org.springframework.ui.Model对象。请求处理方法常见的返回类型最常见的返回类型,就是代表逻辑视图名称的String类型。除了String类型外,还有Model、View以及其它任意的Java类型。552.3基于注解的控制器2.3.1Controller注解类型2.3.2RequestMapping注解类型2.3.3编写请求处理方法2.3.4Controller接收请求参数的常见方式2.3.5重定向与转发2.3.6应用@Autowired进行依赖注入2.3.7@ModelAttribute56通过实体bean接收请求参数通过一个实体bean来接收请求参数,适用于get和post请求方式。需要注意的是,bean的属性名称必须与请求参数名称相同。57<inputtype="text"name="uname"/><inputtype="password"name="upass"/><inputtype="password"name="reupass"/>packagepojo;publicclassUserForm{ privateStringuname;//与form表单的请求参数名称相同 privateStringupass; privateStringreupass; //省略getter和setter方法}@RequestMapping("/login")publicStringlogin(UserForm

user,HttpSessionsession,Modelmodel){}通过处理方法的形参接收请求参数通过处理方法的形参接收请求参数,也就是直接把表单参数写在控制器类相应方法的形参中,即形参名称与请求参数名称完全相同。该接收参数方式适用于get和post请求方式。58 @RequestMapping("/register") /** *通过形参接收请求参数,形参名称与请求参数名称完全相同 */ publicStringregister(Stringuname,Stringupass,Modelmodel){ if("zhangsan".equals(uname) &&"123456".equals(upass)){ return"login";//注册成功,跳转到login.jsp }else{ //在register.jsp页面上可以使用EL表达式取出model的uname值 model.addAttribute("uname",uname); return"register";//返回register.jsp } }通过@RequestParam接收请求参数通过@RequestParam接收请求参数,适用于get和post请求方式。59publicStringregister(@RequestParamStringuname,@RequestParamStringupass,Modelmodel){ if("zhangsan".equals(uname) &&"123456".equals(upass)){ return"login";//注册成功,跳转到login.jsp }else{ //在register.jsp页面上可以使用EL表达式取出model的uname值 model.addAttribute("uname",uname); return"register";//返回register.jsp } }?请思考

通过@RequestParam接收请求参数与“通过处理方法的形参接收请求参数”的区别是?通过@ModelAttribute接收请求参数@ModelAttribute注解放在处理方法的形参上时,用于将多个请求参数封装到一个实体对象中,从而简化数据绑定流程,而且自动暴露为模型数据用于视图页面展示时使用。而“通过实体bean接收请求参数”只是将多个请求参数封装到一个实体对象,并不能暴露为模型数据(需要使用model.addAttribute语句才能暴露为模型数据,数据绑定与模型数据展示,可参考第2.4节的内容)。602.3基于注解的控制器2.3.1Controller注解类型2.3.2RequestMapping注解类型2.3.3编写请求处理方法2.3.4Controller接收请求参数的常见方式2.3.5重定向与转发2.3.6应用@Autowired进行依赖注入2.3.7@ModelAttribute612.3.5重定向与转发在SpringMVC框架中,控制器类中处理方法的return语句默认就是转发实现,只不过实现的是转发到视图。在SpringMVC框架中,不管重定向或转发,都需要符合视图解析器的配置,如果直接重定向到一个不需要DispatcherServlet的资源,如:return"redirect:/html/my.html";62//转发到一个请求方法(同一个控制器类里,可省略/index/)return"forward:/index/isLogin";//重定向到一个请求方法return"redirect:/index/isRegister";//转发到一个视图return"register";<mvc:annotation-driven/><mvc:resourceslocation="/html/"mapping="/html/**"></mvc:resources>2.3基于注解的控制器2.3.1Controller注解类型2.3.2RequestMapping注解类型2.3.3编写请求处理方法2.3.4Controller接收请求参数的常见方式2.3.5重定向与转发2.3.6应用@Autowired进行依赖注入2.3.7@ModelAttribute632.3.6应用@Autowired进行依赖注入SpringMVC框架本身就是一个非常优秀的MVC框架,它具有一个依赖注入的优点。可以通过org.springframework.beans.factory.annotation.Autowired注解类型将依赖注入到一个属性(成员变量)或方法,如:在SpringMVC中,为了能被作为依赖注入,服务层的类必须使用org.springframework.stereotype.Service注解类型注明为@Service(一个服务)。另外,还需要在配置文件中使用<context:component-scanbase-package="基本包"/>元素来扫描依赖基本包。64@AutowiredpublicUserServiceuserService;2.3基于注解的控制器2.3.1Controller注解类型2.3.2RequestMapping注解类型2.3.3编写请求处理方法2.3.4Controller接收请求参数的常见方式2.3.5重定向与转发2.3.6应用@Autowired进行依赖注入2.3.7@ModelAttribute65绑定请求参数到实体对象(表单的命令对象)66@RequestMapping("/register")publicStringregister(@ModelAttribute("user")UserFormuser){ if("zhangsan".equals(user.getUname()) &&"123456".equals(user.getUpass())){ return"login"; }else{ return"register"; }

}上述代码中“@ModelAttribute("user")UserFormuser”语句的功能有两个,一是将请求参数的输入封装到user对象中;一是创建UserForm实例,以“user”为键值存储在Model对象中,与“model.addAttribute("user",user)”语句功能一样。如果没有指定键值,即“@ModelAttributeUserFormuser”,那么创建UserForm实例时,以“userForm”为键值存储在Model对象中,与“model.addAttribute("userForm",user)”语句功能一样。注解一个非请求处理方法在控制器类中,被@ModelAttribute注解的一个非请求处理方法,将在每次调用该控制器类的请求处理方法前被调用。这种特性可以用来控制登录权限,当然控制登录权限的方法很多,例如拦截器、过滤器等。67publicclassBaseController{

@ModelAttributepublicvoidisLogin(HttpSessionsession)throwsException{if(session.getAttribute("user")==null){thrownewException("没有权限");}}}@Controller@RequestMapping("/admin")publicclassModelAttributeControllerextends

BaseController{ @RequestMapping("/add") publicStringadd(){} @RequestMapping("/update") publicStringupdate(){} @RequestMapping("/delete") publicStringdelete(){}}SpringBoot采用全注解驱动1.组件注册:@Configuration、@SpringBootConfiguration@Bean、@Controller、@Service、@Repository、@Component、@Import、@ComponentScan2.条件注解@ConditionalOnXxx3.属性绑定注解@ConfigurationProperties、@EnableConfigurationProperties683.属性绑定@ConfigurationProperties@EnableConfigurationProperties将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定1.给容器中注册组件(@Componet、@Bean)2.使用@ConfigurationProperties声明组件和配置文件的哪些配置项进行绑定694@Data自动生成Getter/Setter@NoArgsConstructor自动生成无参构造器@AllArgsConstructor自动生成全参构造器70本章内容712.1SpringMVC的工作原理2.2SpringMVC的工作环境2.3基于注解的控制器2.4表单标签库与数据绑定2.5JSON数据交互2.6拦截器2.7文件上传2.4表单标签库与数据绑定2.4.1表单标签库2.4.2数据绑定72本章内容732.1SpringMVC的工作原理2.2SpringMVC的工作环境2.3基于注解的控制器2.4表单标签库与数据绑定2.5JSON数据交互2.6拦截器2.7文件上传2.5JSON数据交2.5.1JSON数据结构2.5.2JSON数据转换74对象结构对象结构以“{”开始,以“}”结束。中间部分由0个或多个以英文“,”分隔的key/value对构成,key和value之间以英文“:”分隔。其中,key必须为String类型,value可以是String、Number、Object、Array等数据类型。75{ key1:value1, key2:value2, …}数组结构数组结构以“[”开始,以“]”结束。中间部分由0个或多个以英文“,”分隔的值的列表组成。76[ value1, value2, …]{ "sno":"201802228888", "sname":"陈恒", "hobby":["篮球","足球"], "college":{ "cname":"清华大学", "city":"北京" }}?请思考:组合情况。2.5JSON数据交2.5.1JSON数据结构2.5.2JSON数据转换772.5.2JSON数据转换为实现浏览器与控制器类之间的JSON数据交互,SpringMVC提供了MappingJackson2HttpMessageConverter实现类默认处理JSON格式请求响应。该实现类利用Jackson开源包读写JSON数据,将Java对象转换为JSON对象和XML文档,同时也可以将JSON对象和XML文档转换为Java对象。jackson-annotations.jar:JSON转换注解包。jackson-core.jar:JSON转换核心包。jackson-databind.jar:JSON转换的数据绑定包。78JSON格式转换注解在使用注解开发时,需要用到两个重要的JSON格式转换注解,分别是@RequestBody和@ResponseBody。@RequestBody:用于将请求体中的数据绑定到方法的形参中,该注解应用在方法的形参上。@ResponseBody:用于直接返回JSON对象,该注解应用在方法上。通过一个实例来演示JSON数据交互过程。在该实例中,针对返回实体对象、ArrayList集合、Map<String,Object>集合以及List<Map<String,Object>>集合分别处理。791.创建Web应用并导入相关的JAR包创建Web应用ch2_4,除了导入如2.2.1节所示的JAR包外,还需将JSON相关的3个JAR包(jackson-annotations-2.12.0.jar、jackson-databind-2.12.0.jar和jackson-core-2.12.0.jar)复制到WEB-INF/lib目录中。802.创建Web和SpringMVC配置文件应用ch2_4的Web配置文件web.xml与【例2-3】一样,为节省篇幅,不再赘述。在应用ch2_4的src目录下,创建名为config的包,并在该包中创建SpringMVC配置文件springmvc.xml。81<context:component-scanbase-package="controller"/><mvc:annotation-driven/><mvc:resourceslocation="/js/"mapping="/js/**"></mvc:resources>3.创建JSP页面,并引入jQuery首先从jQuery官方网站/download/下载jQuery插件:jquery-3.5.1.min.js,将其复制到Web项目开发目录的WebContent/js目录下。然后在JSP页面中,通过<scripttype="text/javascript"src="js/jquery-3.5.1.min.js"></script>代码将jquery-3.5.1.min.js引入当前页面中。在应用ch2_4的WebContent目录下创建JSP文件index.jsp,在该页面中使用Ajax向控制器异步提交数据。824.创建实体类在应用ch2_4的src目录下,创建名为pojo的包,在该包中创建Person实体类。83packagepojo;publicclassPerson{ privateStringpname; privateStringpassword; privateIntegerpage; //省略set和get方法}5.创建控制器类在应用ch2_4的src目录下,创建名为controller的包,并在该包中创建TestController控制器类,在处理方法中使用@ResponseBody和@RequestBody注解进行JSON数据交互。84@RequestMapping("/testJson")@ResponseBodypublicList<Map<String,Object>>testJson(@RequestBodyPersonuser){}6.测试应用右击应用ch2_4,选择RunAs/RunonServer发布并运行应用。85本章内容862.1SpringMVC的工作原理2.2SpringMVC的工作环境2.3基于注解的控制器2.4表单标签库与数据绑定2.5JSON数据交互2.6拦截器2.7文件上传2.6拦截器2.6.1拦截器的定义2.6.2拦截器的配置2.6.3拦截器的执行流程872.6.1拦截器的定义在SpringMVC框架中,定义一个拦截器可以通过两种方式:一种是通过实现HandlerInterceptor接口或继承HandlerInterceptor接口的实现类来定义;另一种是通过实现WebRequestInterceptor接口或继承WebRequestInterceptor接口的实现类来定义。8889publicclassTestInterceptorimplementsHandlerInterceptor{ @Override publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler) throwsException{ } @Override publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler, ModelAndViewmodelAndView)throwsException{ } @Override publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex) throwsException{ }}实现HandlerInterceptor接口HandlerInterceptor接口中的方法preHandle()方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作。返回true表示继续向下执行,返回false表示中断后续操作。postHandle()方法:该方法在控制器的处理请求方法调用之后,解析视图之前执行。可以通过此方法对请求域中的模型和视图做进一步的修改。afterCompletion()方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。902.6拦截器2.6.1拦截器的定义2.6.2拦截器的配置2.6.3拦截器的执行流程9192 <!--配置拦截器--> <mvc:interceptors> <!--配置一个全局拦截器,拦截所有请求-->

<beanclass="interceptor.TestInterceptor"/> <mvc:interceptor> <!--配置拦截器作用的路径--> <mvc:mappingpath="/**"/> <!--配置不需要拦截作用的路径--> <mvc:exclude-mappingpath=""/> <!--定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截-->

<beanclass="interceptor.Interceptor1"/> </mvc:interceptor> <mvc:interceptor> <!--配置拦截器作用的路径--> <mvc:mappingpath="/gotoTest"/>

<beanclass="interceptor.Interceptor2"/> </mvc:interceptor> </mvc:interceptors>2.6配置拦截器2.6拦截器2.6.1拦截器的定义2.6.2拦截器的配置2.6.3拦截器的执行流程932.6.3拦截器的执行流程在配置文件中,如果只定义了一个拦截器,程序首先将执行拦截器类中的preHandle()方法,如果该方法返回true,程序将继续执行控制器中处理请求的方法,否则中断执行。如果preHandle()方法返回true,并且控制器中处理请求的方法执行后返回视图前,将执行postHandle()方法。返回视图后,才执行afterCompletion()方法。在需要Web应用中,通常有多个拦截器同时工作,这时它们的preHandle()方法将按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则按照配置顺序的反序执行。94【例2-5】多个拦截器的执行过程1.创建Web应用并导入相关的JAR包创建Web应用ch2_5,将如2.2.1节所示的JAR包复制到WEB-INF/lib目录中。2.创建Web配置文件web.xml在WEB-INF目录下,创建web.xml文件,该文件中的配置信息与【例2-1】相同,为节省篇幅,不再赘述。953.创建控制器类在src目录下,创建名为controller的包,并在该包中创建控制器类InterceptorController。96@ControllerpublicclassInterceptorController{ @RequestMapping("/gotoTest") publicStringgotoTest(){ System.out.println("正在测试拦截器,执行控制器的处理请求方法中"); return"test"; }}4.创建拦截器类在src目录下,创建一个名为interceptor的包,并在该包中创建拦截器类TestInterceptor、Interceptor1和Interceptor2。TestInterceptor的代码与2.6.1节的示例代码相同,为节省篇幅,不再赘述。975.创建配置文件springmvc.xml在src目录下,创建名为config的包,并在该包中创建配置文件springmvc.xml。在配置文件配置一个全局拦截器和两个局部拦截器。98?请思考:全局拦截器与局部拦截器的区别是什么?6.创建视图JSP文件99在WEB-INF目录下,创建一个jsp文件夹,并在该文件夹中创建一个JSP文件test.jsp。<body>

视图 <%System.out.println("视图渲染结束。");%></body>7.测试拦截器首先,将应用ch2_5发布到Tomcat服务器,并启动Tomcat服务器。然后,通过地址http://localhost:8080/ch2_5/gotoTest测试拦截器。100?请思考:拦截器的执行顺序。本章内容1012.1SpringMVC的工作原理2.2SpringMVC的工作环境2.3基于注解的控制器2.4表单标签库与数据绑定2.5JSON数据交互2.6拦截器2.7文件上传2.7文件上传文件上传是一个SpringMVC应用中经常使用的功能,SpringMVC通过配置一个MultipartResolver来上传文件。在SpringMVC的控制器中,可以通过MultipartFile来接收单个文件上传,通过List<MultipartFile>来接收多个文件上传。由于SpringMVC框架的文件上传是基于commons-fileupload组件的文件上传。因此,需要将commons-fileupload组件相关的jar(commons-fileupload.jar和commons-io.jar)拷贝到SpringMVC应用的WEB-INF/lib目录下。【例2-6】上传多个文件。1021

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论