什么是SpringMVC?

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。
Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
在Spring的Web MVC框架提供了模型 - 视图 - 控制器架构以及可用于开发灵活,松散耦合的Web应用程序准备的组件。 MVC模式会导致分离的应用程序(输入逻辑,业务逻辑和UI逻辑)的不同方面,同时提供这些元素之间的松耦合。

  • 模型(Model )封装了应用程序的数据和一般他们会组成的POJO。
  • 视图(View)是负责呈现模型数据和一般它生成的HTML输出,客户端的浏览器能够解释。
  • 控制器(Controller )负责处理用户的请求,并建立适当的模型,并把它传递给视图渲染。

    DispatcherServlet

    SpringMVC 围绕 DispatcherServlet 设计, DispatcherServlet 的作用是==将请求分发到不同的处理器==。在 Spring 2.5 之后,支持使用 @Controller 注解来注册处理器

SpringMVC 以请求为驱动 , 围绕一个DispatcherServlet 分派请求及提供其他功能,DispatcherServlet 是一个实际的 Servlet ( 继承自 HttpServlet 基类 )
image.png

SpirngMVC工作流程

image.png

SpringMVC的配置

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  5. http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  6. version="3.1">
  7. <display-name>springmvc</display-name>
  8. <welcome-file-list>
  9. <welcome-file>index.jsp</welcome-file>
  10. </welcome-file-list>
  11. <!--前端控制器:
  12. 拦截所有请求,并且智能分发
  13. -->
  14. <servlet>
  15. <servlet-name>springDispatcherServlet</servlet-name>
  16. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  17. <!--contextConfigLocation:指定springmvc的配置文件-->
  18. <!--如果配置init-param,则需要在WEB-INF下配置[servlet-name]-servlet.xml的文件-->
  19. <init-param>
  20. <param-name>contextConfigLocation</param-name>
  21. <param-value>classpath:springmvc.xml</param-value>
  22. </init-param>
  23. <!--servlet 启动是创建对象,值越低,优先级越高-->
  24. <load-on-startup>1</load-on-startup>
  25. </servlet>
  26. <servlet-mapping>
  27. <servlet-name>springDispatcherServlet</servlet-name>
  28. <!--拦截请求
  29. /*拦截所有请求
  30. / 会拦截除*.jsp以外的请求,,如*.action,*.do,*.xx
  31. -->
  32. <url-pattern>/</url-pattern>
  33. </servlet-mapping>
  34. </web-app>

url-pattern拦截请求

  • /*:拦截所有请求
  • / :会拦截除.jsp以外的请求,,如.action,.do,.xx

注:web.xml继承于defaultweb.xml
在defaultweb.xml中,/是默认配置静态资源(如:html等)
当web.xml中设置拦截请求为/时,会默认覆盖父类的xml,则在webapp下生成的静态资源,就无法访问,会默认认为是一个请求,被前端控制器拦截。
image.png

url-pattern

而jsp这种动态页面却不会被拦截,因为defaultweb.xml中有一个jspservlet,还单独的处理jsp页面,如果web.xml设置拦截请求为/*,则会覆盖父类的jspServlet。

Springmvc配置文件

  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:context="http://www.springframework.org/schema/context"
  5. 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">
  6. <!--扫描所有组件-->
  7. <context:component-scan base-package="com.springmvc"></context:component-scan>
  8. <!--视图解析器,帮我们解析拼接页面-->
  9. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  10. <property name="prefix" value="/WEB-INF/success/"></property>
  11. <property name="suffix" value=".jsp"></property>
  12. </bean>
  13. </beans>

不指定SpringMVC配置文件

不指定配置文件,会默认在WEB-INF下寻找前端控制器-servlet.xml的配置文件
如果不指定配置配置,需要在WEB-INF下配置[servlet-name]-servlet.xml的文件

控制层

  1. @Controller
  2. public class MyFirstController {
  3. @RequestMapping("/hello")
  4. public String myFirstController(){
  5. System.out.println("请求收到,正在处理");
  6. //如果没有视图解析器的话,这转发地址需要为/WEB-INF/success/success.jsp
  7. return "success";
  8. }
  9. }

跳转链接

  1. <a href="hello">hello链接</a>

image.png

执行流程

  • 点击链接,会发送地址http://localhost/8080/springmvc/hello
  • 进入tomcat服务器
  • 前端控制器获得请求
  • 根据请求会从@RequestMapping标准的匹配
  • 执行方法,视图解析器会返回的字符串拼接,封装成一个model
  • 根据model所携带信息会被解析,转发到相应的页面

    SpringMVC注解

    @RequestMapping

    作用:

  • 告诉SpringMVC,这是来处理什么请求的

  • /是可以省略的,默认是从当前项目开始的,即http://localhost/8080/springmvc/

标在类上,则会有二级请求。

RequestMapping参数

method:规定请求方式

  • get、post等

parmas:规定请求参数

  • parmas={‘xxx’}规定请求的参数,如果没有携带,这会报40x错误

headers:规定请求头参数

  • 可以设置不同浏览器访问等

ant风格:RequestMapping可以指定相应的不同字符的路径

  • ?:一个字符
  • *:多个字符
  • **:多层路径

    1. @RequestMapping("/hell*")

    占位符:{}

  • 用于获取路径上的路径名 ```java @RequestMapping(“user/{id}”) public String test01(@PathVariable(“id”) String id){ System.out.println(“路径上的占位符”+id); return “success”;

}

  1. 可以获取到{id}中的值
  2. <a name="RNvsS"></a>
  3. ### RequestParam注解
  4. ```java
  5. @RequestMapping("test")
  6. public String test02(@RequestParam(value = "user",required = false,defaultValue = "") String username){
  7. System.out.println("传入的参数"+username);
  8. return "success";
  9. }

如果不指定RequestParam,则处理请求函数参数要和表单参数同名,才能封装上。
RequestParam指定后,传入参数必须有值,如果没有,则指定不需要值。

RequestHeader注解

  1. @RequestMapping("test")
  2. public String test02(@RequestParam(value = "user",required = false,defaultValue = "") String username,@RequestHeader("User-Agent") String userAgent){
  3. System.out.println("传入的参数"+username);
  4. System.out.println("请求头参数,浏览器为"+userAgent);
  5. return "success";
  6. }

获取请求头参数,RequestHeader参数和RequestParam相同。

CookieValue注解

  1. @RequestMapping("test")
  2. public String test02(@RequestParam(value = "user",required = false,defaultValue = "") String username,
  3. @RequestHeader("User-Agent") String userAgent,
  4. @CookieValue("JSESSIONID") String cookie){
  5. System.out.println("传入的参数"+username);
  6. System.out.println("请求头参数,浏览器为"+userAgent);
  7. System.out.println("cookie的值"+cookie);
  8. return "success";
  9. }

获取cookie的值,使用情况和上面注解相同。

POJO对象自动封装

当表单参数名和对象参数名匹配时,自动调用对象的set方法,将表单参数传入,甚至是级联参数也能匹配。

Servlet原生API

在SpringMVC中可以使用原生的API进行使用,常用的有三个HttpServletRequest、HttpServletRespone和HttpSession。
在jsp页面中相应的域中可以找到,响应之后的数据。

解决乱码问题

在Tomcat的server.xml,将8080端口的标签添加上URIEncoding=utf-8。
在web.xml配置编码过滤器

  1. <!--解决乱码-->
  2. <filter>
  3. <filter-name>characterEncodingFilter</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. <init-param>
  10. <param-name>forceEncoding</param-name>
  11. <param-value>true</param-value>
  12. </init-param>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>characterEncodingFilter</filter-name>
  16. <url-pattern>/*</url-pattern>
  17. </filter-mapping>

数据输出

请求处理后,输出的数据在请求域中可以获取到。

  1. @RequestMapping("test1")
  2. public String test03(Map<String,String> map){
  3. map.put("msg","map中的值");
  4. return "success";
  5. }
  1. ${requestScope.msg}

image.png
Model,ModelMap和ModelAndView中的数据均可以在请求域中获取到。

Map、Model和ModelMap之间的关系

image.png
继承关系,这三个类最后获得的类型都是BindingAwareModelMap,并且输出到请求域中。

转发和重定向

  1. @RequestMapping("forward")
  2. public String test04(){
  3. return "forward:/hello.jsp";
  4. }
  5. @RequestMapping("redirect")
  6. public String test05(){
  7. return "redirect:/hello.jsp";
  8. }

转发是一次请求,所以可以携带参数;
重定向是两次请求,因此携带参数也无法被下个请求使用。

Restful风格

一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

传统方式操作资源

http://127.0.0.1/item/queryUser.action?id=1 查询,GET
http://127.0.0.1/item/saveUser.action 新增,POST
http://127.0.0.1/item/updateUser.action 更新,POST
http://127.0.0.1/item/deleteUser.action?id=1 删除,GET或POST
使用Restful风格后,就变成了
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item/ 新增,POST
http://127.0.0.1/item/ 更新,POST
http://127.0.0.1/item/x 删除,GET或POST
这种以路径来实现对后端的访问。

实例

不使用Restful风格

  1. @Controller
  2. public class RestFulController {
  3. //http://localhost:8080/add?a=1&b=2
  4. @RequestMapping("/add")
  5. public String test1(int a,int b,Model model){
  6. int res=a+b;
  7. model.addAttribute("msg","结果为"+res);
  8. return "test";
  9. }
  10. }

通过url带参数访问得到
image.png

使用Restful风格后

  1. @Controller
  2. public class RestFulController {
  3. //http://localhost:8080/add/a/b
  4. @RequestMapping("/add/{a}/{b}")
  5. public String test1(@PathVariable int a,@PathVariable int b, Model model){
  6. int res=a+b;
  7. model.addAttribute("msg","结果为"+res);
  8. return "test";
  9. }
  10. }

通过参数作为路径可以得到结果
image.png

JSON

什么是 JSON ?

  • JSON 指的是 JavaScript 对象表示法(_J_ava_S_cript _O_bject _N_otation)
  • JSON 是轻量级的文本数据交换格式,JSON 比 XML 更小、更快,更易解析。
  • JSON 独立于语言
  • JSON 具有自我描述性,更易理解

JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

常用的JSON包有,jackson,gson,fastson
以jackson为例。

Ajax

Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新刷新加载整个页面的情况下。即通过js异步请求,局部更新页面的技术。

原生Ajax请求响应过程