SpringMVC基本应用

一 SpringMVC简介

1.1 SpringMVC概述

  • SpringMVC 是一种基于Java的实现MVC设计模式的轻量级Web 框架
  • 还支持 RESTful 编程风格的请求。

  • SpringMVC的框架就是封装了原来Servlet中的共有行为;例如:参数封装,视图转发等。

1.2SpringMVC快速入门

* 步骤分析
1. 创建web项目,导入SpringMVC相关坐标(pom.xml)
2. 配置SpringMVC前端控制器 DispathcerServlet(web.xml)
3. 编写Controller类和视图页面
4. 使用注解配置Controller类中业务方法的映射地址
5. 配置SpringMVC核心文件 spring-mvc.xml

1.创建web项目,导入SpringMVC相关坐标

 <packaging>war</packaging><dependencies><!--springMVC坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.5.RELEASE</version></dependency><!--servlet坐标--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--jsp坐标--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency></dependencies>

2.配置前端控制器DispathcerServlet

  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--springMvc前端控制器:dispatcherServlet--><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:Spring-mvc.xml</param-value></init-param><!--应用启动时,完成servlet的实例化与初始化 >0--><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><!--/ 会匹配到所有访问路径。但不会匹配到*.jsp,带后缀名匹配不到--><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

3.编写Controller类和视图页面

  • UserController.java
public class UserController {public String quick() {System.out.println("quick running.....");return "success";}
}
  • /WEB-INF/pages/ success.jsp
<html>
<head><title>Title</title>
</head>
<body><h1>SpringMvc入门成功!</h1>
</body>
</html>

4.配置SpringMVC核心文件spring-mvc.xml

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"><!--开启IOC注解扫描(专门负责controller包下)--><context:component-scan base-package="com.zz.controller"/><!--视图解析器(将逻辑视图名解析为物理文件名)--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置前缀与后缀--><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean></beans>

二 SpringMVC组件概述

  • springmvc中的三大组件:

    1. 处理器映射器

    2. 处理器适配器

    3. 视图解析器

      [4.前端控制器]

2.1 SpringMVC的执行流程

1. 用户发送请求至前端控制器DispatcherServlet。2.  前端控制器收到请求调用处理器映射器,后者找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象返回给前端控制器。3. 前端控制器调用处理器适配器,后者经过适配调用具体的处理器,处理器(后端控制器)执行完成返回ModelAndView(或逻辑视图),适配器中转返回给前端控制器。4. 前端控制器将ModelAndView传给视图解析器,后者将其解析,返回具体View。5. 前端控制器对View进行渲染视图,并响应给用户。

2.2 SpringMVC组件解析

1. 前端控制器:DispatcherServlet用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet **是整个流程控制的中心**,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。
2. 处理器映射器:HandlerMappingHandlerMapping **负责根据用户请求找到 Handler 即处理器**,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3. 处理器适配器:HandlerAdapter通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
4. 处理器:Handler【**开发者编写**】它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到Handler。由Handler 对具体的用户请求进行处理。
5. 视图解析器:ViewResolver负责将处理结果生成 View 视图,首先根据**逻辑视图名解析成物理视图名**,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
6. 视图:View 【**开发者编写**】最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

2.3 @Controller与@RequestMapping

1.@Controller

  • SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器中。开启注解扫描。

2.@RequestMapping

* 作用:用于建立请求 URL 和处理请求方法之间的对应关系
* 位置:1.类上:请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的URL可以按照模块化管理:用户模块/user/add/user/update/user/delete2.方法上:请求URL的第二级访问目录,和一级目录组成一个完整的 URL 路径。* 属性:1.value:用于指定请求的URL。它和path属性的作用是一样的2.method:用来限定请求的方式3.params:用来限定请求参数的条件例如:params={"accountName"} 表示请求参数中必须有accountNamepramss={"money!100"} 表示请求参数中money不能是100

2.4 知识小结

* SpringMVC的三大组件处理器映射器:HandlerMapping处理器适配器:HandlerAdapter视图解析器:View Resolver
* 开发者编写处理器:Handler视图:View

三 SpringMVC的请求

3.1 获取基本类型参数

@RequestMapping("/simpleParam")
public String simpleParam(Integer id,String username) {System.out.println(id);System.out.println(username);return "success";
}

3.2 获取对象类型参数

  • 请求参数与形参的对象属性一致。
    /*获取对象类型参数*/@RequestMapping(value = "/pojoParam", method = RequestMethod.POST)public String pojoParam(User user) {System.out.println(user);return "success";}

3.2.1 中文乱码过滤器

  • 当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。

  • web.xml:

    <!--中文乱码过滤器--><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><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><!--/*:会匹配所有url--><url-pattern>/*</url-pattern></filter-mapping>

3.3 获取数组类型参数

  • 请求参数与形参数组名一致。
  • jsp:
<form action="${pageContext.request.contextPath}/user/arrayParam">编号:<br><input type="checkbox" name="ids" value="1">1<br><input type="checkbox" name="ids" value="2">2<br><input type="submit" value="数组类型">
</form>
  • controller:
    /*获取数组类型参数*/@RequestMapping("/arrayParam")public String arrayParam(Integer[] ids) {System.out.println(Arrays.toString(ids));return "success";}

3.4 获取集合(复杂)类型参数

  • 需要定义实体类,实体类中的属性与请求参数一致。

  • jsp:

<form action="${pageContext.request.contextPath}/user/queryParam" method="post">关键字:<input type="text" name="keyword"><br>user对象:<input type="text" name="user.id" placeholder="id"><input type="text" name="user.username" placeholder="username"><br>list集合:<input type="text" name="userList[0].id" placeholder="id"><input type="text" name="userList[0].username" placeholder="username"><br>list2:<input type="text" name="userList[1].id" placeholder="id"><input type="text" name="userList[2].username" placeholder="username"><br>map集合:<input type="text" name="userMap['key1'].id" placeholder="id"><input type="text" name="userMap['key1'].username" placeholder="username"><input type="submit" value="集合类型">
</form>
  • pojo实体:
public class QueryVo {private String keyword;private User user;private List<User> userList;private Map<String,User> userMap;//get、and、toString
}
  • controller:
   /*获取集合参数。自定义类*/@RequestMapping("/queryParam")public String queryParam(QueryVo queryVo) {System.out.println(queryVo);return "success";}

3.5 自定义类型转换器

  • SpringMVC 默认已经提供了一些常用的类型转换器;例如:客户端提交的字符串转换成int型进行参 数设置,日期格式类型要求为:yyyy/MM/dd不然的话会报错,对于特有的行为,SpringMVC提供了自定义类型转换器方便开发者自定义处理。

  • jsp:

<form action="${pageContext.request.contextPath}/user/converterParam">生日:<input type="text" name="birthday"><input type="submit" value="自定义类型转换器">
</form>
  • 自定义类实现Converter接口:
public class DateConverter implements Converter<String, Date> {@Overridepublic Date convert(String s) {SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");Date date=null;try {date=format.parse(s);} catch (ParseException e) {e.printStackTrace();}return date;}
}
  • 配置Spring-mvc.xml:
  <!--处理器映射器和适配器增强--><mvc:annotation-driven conversion-service="conversionService"/><!--自定义类型转换器--><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.zz.converter.DateConverter"/></set></property></bean>
  • controller:
@RequestMapping("/converterParam")
public String converterParam(Date birthday) {System.out.println(birthday);return "success";
}

3.6 相关注解

1.@RequestParam

  • 当请求的参数name名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注 解显示的绑定。
  • jsp:
<%--演示@RequstParam注解--%>
<a href="${pageContext.request.contextPath}/user/findByPage?pageNo=2">分页查询</a>
  • controller:
    /*演示@RequestParam注解name:前台传递参数的namedefaultValue:设置默认值required:是否必须传递该参数,默认值:true,一旦设置了默认值,则自动改为false*/@RequestMapping("/findByPage")public String findByPage(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize) {System.out.println(pageNum + " " + pageSize);//2 5return "success";}

2. @RequestHeader

  • 获取请求头的数据。
    /*@RequestHeader:获取请求头的数据*/@RequestMapping("/requestHead")public String requestHeader(@RequestHeader("cookie") String cookie) {System.out.println(cookie);//JSESSIONID=CAD668A4176B9DF501B70E29C7155B26return "success";}

3.@CookieValue

  • 获取cookie中的数据。
   /*@CookieValue:获取cookie中的值*/@RequestMapping("/cookieValue")public String cookieValue(@CookieValue("JSESSIONID") String jesessionId) {System.out.println(jesessionId);//0A74B6805D2DB3A666DB5EDB0A5F2F08return "success";}

3.7获取Servlet相关API

  • pringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入。
    /*原始servletApi的获取*/@RequestMapping("/servletAPI")public String servletAPI(HttpServletRequest request, HttpServletResponseresponse, HttpSession session) {System.out.println(request);System.out.println(response);System.out.println(session);return "success";}

四 SpringMVC的响应

4.1 SpringMVC响应方式介绍

  • 页面跳转:

    1. 返回字符串逻辑视图(return “success” ),最常用。
    2. void原始ServletAPI(重定向或请求转发)
    3. ModelAndView(创建模型视图对象)
  • 返回数据:
    1. 直接返回字符串数据
    2. 将对象或集合转为json返回(任务二演示)

4.2 Void原始ServletAPI

  • 可以通过request、response对象实现响应.
    @RequestMapping("/returnVoid")public void returnVoid(HttpServletRequest request, HttpServletResponse response)throws Exception {// 1.直接返回数据response.setContentType("text/html;charset=utf-8");response.getWriter().write("拉勾网");//request.setAttribute("username", "拉勾教育");
// 2.通过request实现转发request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);// 3.通过response实现重定向,两次请求
// WEB-INF:安全目录:不允许外部请求直接访问该目录资源,只可以进行服务器内部转发//在此访问webapp目录下的index.jspresponse.sendRedirect(request.getContextPath() + "/index.jsp");}

4.3 转发和重定向

  • 企业开发我们一般使用返回字符串逻辑视图实现页面的跳转,这种方式其实就是请求转发

  • 转发:

    • 如果用了forward:则路径必须写成实际视图url,不能写逻辑视图
    /*演示forward关键字请求转发当写了redirect或者forward关键字,是不会再走视图解析器
    */@RequestMapping("/forward")public String forward(Model model) {//模型中存值model.addAttribute("username", "拉勾招聘");return "forward:/WEB-INF/pages/success.jsp";// 使用请求转发,既可以转发到jsp,也可以转发到其他的控制器方法//return "forward:/product/findAll";}
    
  • 重定向:

    • 我们可以不写虚拟目录,springMVC框架会自动拼接,并且将Model中的数据拼接到url地址上。
      /*演示Redirect关键字进行重定向*/@RequestMapping("/redirect")public String redirect(Model model) {// model底层使用的还是request.setAttribute("username","拉勾教育") 域范围:一次请求model.addAttribute("username", "拉钩教育"); //index.jsp取值为空(重定向是两次请求)。需要使用@SessionAttributes注解,下面有讲return "redirect:/index.jsp";}
    

4.4 ModelAndView

1.创建方式一

  • 在Controller中方法创建ModelAndView
    @RequestMapping("/returnModelAndView1")public ModelAndView returnModelAndView1() {/*Model模型:封装数据View模型:展示数据作用范围:一次请求*/ModelAndView modelAndView = new ModelAndView();//设置模型数据modelAndView.addObject("username", "ModelAndView方式一");//设置视图名称modelAndView.setViewName("success");return modelAndView;}

2.创建方式二

  • 形参上直接声明ModelAndView,无需在方法中自己创建.
    /*modelAndView方式二在Controller中方法形参上直接声明ModelAndView*/@RequestMapping("/returnModelAndView2")public ModelAndView returnModelAndView2(ModelAndView modelAndView) {modelAndView.addObject("username", "ModelAndView方式二");modelAndView.setViewName("success");return modelAndView;}

4.5 @SessionAttributes

  • 在4.3中重定向后的页面访问不到ModelAndView中的值,因为model底层使用的还是request.setAttribute,域范围:一次请求。可以将model中对应的数据暂存到 HttpSession 中。

  • @SessionAttributes只能定义在类上

//向request域存入的key为username时,同步到session域中
@SessionAttributes("username")
public class UserController {
}

4.6 知识小结

* 页面跳转采用返回字符串逻辑视图
1. forward转发可以通过Model向request域中设置数据
2. redirect重定向直接写资源路径即可,虚拟目录springMVC框架自动完成拼接
* 数据存储到request域中Model modelmodel.addAttribute("username", "子慕");

五 静态资源访问的开启

  • 当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件。

  • 原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(缺省),代表对所有的

  • 静态资源都进行处理操作,这样就不会执行Tomcat内置的DefaultServlet处理。我们可以通过以下两种 方式指定放行静态资源:

  • 方式一:

<!--在springmvc配置文件中指定放行资源-->
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/img/**" location="/img/"/>
  • 方式二:全部放行
<!--在springmvc配置文件中开启DefaultServlet处理静态资源-->
<mvc:default-servlet-handler/>

uest域中
Model model
model.addAttribute(“username”, “子慕”);


## 五 静态资源访问的开启+ 当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件。[外链图片转存中...(img-TC5tYmjT-1615978422491)]+ 原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(缺省),代表对所有的+ 静态资源都进行处理操作,这样就不会执行Tomcat内置的DefaultServlet处理。我们可以通过以下两种 方式指定放行静态资源:+ 方式一:```xml
<!--在springmvc配置文件中指定放行资源-->
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/img/**" location="/img/"/>
  • 方式二:全部放行
<!--在springmvc配置文件中开启DefaultServlet处理静态资源-->
<mvc:default-servlet-handler/>

SpringMVC基本应用相关推荐

  1. 【SpringMVC】概述

    概述: SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的.                       理解是servlet的一个升级 Sp ...

  2. 【SpringMVC】基本概念

    SpringMVC的基本概念 三层架构 我们的开发一般都是基于c/s或者b/s架构.在JavaEE开发中,几乎全都是基于B/S架构开发.在B/S架构中,系统标准的三层架构包括:表现层,业务层,持久层. ...

  3. SSM框架整合(Spring+SpringMVC+MyBatis)

    输出结果 1.Maven Web项目创建 之前有写过Eclipse+Maven创建web项目的帖子,如果需要,请参考这里写链接内容 创建好项目之后因为入下图: 2.SSM整合 2.1 引入需要的JAR ...

  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  5. SpringMVC——通俗易懂讲讲Ajax~

    聊聊Ajax 一.什么是Ajax 二.iframe标签简单伪造Ajax 三.Ajax的实现 1. 基本概念的了解 Ajax的核心是什么? XMLHttpRequest是什么? Ajax数据传输的数据格 ...

  6. Jackson、FastJson快速入门(整合SpringMVC)

    目录 1. 什么是 JSON 2. JSON 语法规则 3. JSON 与 JS 对象的关系 4. JSON 和 JS 对象互转 5. Jackson-数据格式转换 1. 环境搭建 2. 对象转jso ...

  7. RESTful风格及其SpringMVC实现

    目录 1.RESTful概念 2.RESTful功能 3.对比:传统方式操作资源 4.SpringMVC实现传统方式操作资源 5.使用RestFul操作资源 6.SpringMVC实现RESTful操 ...

  8. 使用注解开发SpringMVC详细配置教程

    目录 1.使用注解开发SpringMVC 1.新建一个普通的maven项目,添加web支持 2.在pom.xml中导入相关依赖 3.配置web.xml 4.编写SpringMVC配置文件 1. 自动扫 ...

  9. SpringMVC的form:form表单的使用

    为什么要使用SpringMVC的form:form表单,有两个原因:一是可以更加快捷的完成表单的开发,比如会替你做好数据类型装换等本来需要你自己动手的工作.其次就是能够更加方便的实现表单回显. 首先要 ...

  10. SpringMVC工作环境搭建 配置文件

    web.xml配置 在服务器端容器启动之前加载配置文件的顺序:context-param>listener>filter>servlet //容器配置application上下文的时 ...

最新文章

  1. 多线程:pthread_cond_wait 实现原理
  2. java连接sqlserver 2005执行存储过程的几种情况
  3. linux 内核编译错误 undefined reference to '__mutex_lock_slowpath'
  4. python3写冒泡排序_使用python3实现冒泡排序、选择排序和快速排序
  5. linux弹性网卡,将弹性网卡附加到 ECS 实例上之后如何配置弹性网卡
  6. kubernetes ui 搭建
  7. Android调用Java WebSevice篇之二
  8. fatal: unable to access ‘https://XXXXX‘: : OpenSSL SSL_read: Connection was reset, errno 10054……
  9. 客户关系管理之会员管理(转)
  10. [ POI 2005 ] Bank Notes
  11. 0-1背包(动态规划)
  12. GooglePlay内购服务器验单配置
  13. SpringBoot系列课程(二)-SpringBoot整合MyBatis
  14. 面对垄断,互联网巨头何去何从?
  15. 路由器WiFi密码更改及隐藏操作
  16. 55、如何制作API
  17. 关于 NB-IoT NM1 模组 - FAQ
  18. python绘制等值线图_利用Python插值绘制等值线图
  19. python——简单通讯录
  20. VS2019显示错误未定义标识符delay

热门文章

  1. 快瞳AI+OCR识别,助力纸质文档数字化管理
  2. RGB、HSL、HSV互相转化【Java】
  3. PMP挂靠一年多少钱?
  4. 教师备课就只是看教材教参这么简单?
  5. Vue 进阶系列丨vuex持久化
  6. 2021年塔式起重机安装拆卸工(建筑特殊工种)考试题及塔式起重机安装拆卸工(建筑特殊工种)找解析
  7. LNMP源码编译安装及一键部署LNMP架构
  8. redis服务器配置(redis服务器篇)
  9. 【88】SR-IOV
  10. 对称加密和非对称加密(一)初步理解