SpringMVC--一、SpringMVC入门

三层架构和MVC

三层架构

  1. 咱们开发服务器端程序,一般都基于两种形式,一种C/S架构程序,一种B/S架构程序
  2. 使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构
  3. 三层架构
    1. 表现层:WEB层,用来和客户端进行数据交互的。表现层一般会采用MVC的设计模型
    2. 业务层:处理公司具体的业务逻辑的
    3. 持久层:用来操作数据库的

img

MVC模型

  1. MVC全名是Model View Controller 模型视图控制器,每个部分各司其职。
    1. Model:数据模型,JavaBean的类,用来进行数据封装。
    2. View:指JSP、HTML用来展示数据给用户
    3. Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等。

SpringMVC

而SpringMVC就是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于 Spring FrameWork 的后续产品,已经融合在Spring Web Flow里面。

SpringMVC入门案例

导入的包

创建maven项目,在pom.xml文件中导入如下包:

  1. spring-context
  2. spring-web
  3. spring-webmvc
  4. servlet-api
  5. jsp-api

配置核心控制器(DispatcherServlet)

web.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--SpringMVC核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置Servlet的初始化参数,读取springmvc的配置文件(我这里是springmvc.xml),创建spring容器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--配置servlet启动时加载对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--设置mapping为/,任何请求都会经过servlet-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

配置源文件

在src/main/resources文件下创建一个xml用于配置springmvc各种组件,这里创建springmvc.xml,

导入命名空间

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<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">
</beans>

配置组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--配置spring创建容器时要扫描的包-->
<context:component-scan base-package="com"></context:component-scan>

<!--配置视图解析器-->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--要跳转的包-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--后缀名-->
<property name="suffix" value=".jsp"></property>
</bean>

<!--配置spring开启注解mvc的支持-->
<mvc:annotation-driven></mvc:annotation-driven>

编写view层

index.jsp:

1
2
3
4
5
6
7
8
9
10
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello<br>
<a href="hello">翻译</a>
</body>
</html>

在WEB-INF目录下创建pages文件夹,编写success.jsp:

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a>你好</a>
</body>
</html>

编写控制器

HelloController:

1
2
3
4
5
6
7
8
@Controller
public class HelloController {
@RequestMapping("/hello")
public String translate(){
System.out.println("translate...");
return "success";
}
}

案例过程分析

  1. 服务器启动,应用被加载。读取到web.xml中的配置创建spring容器并且初始化容器中的对象。因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件。开启了注解扫描,那么HelloController对象就会被创建。
  2. 浏览器发送请求(即index.jsp),被DispatherServlet捕获,该Servlet并不处理请求,而是把请求转发出去。转发的路径是根据请求URL,匹配@RequestMapping中的内容(即HelloController的translate)。
  3. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件。
  4. 渲染结果视图,响应浏览器。

响应流程:

img

入门案例涉及的组件

DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

Handler:处理器

它就是我们开发中要编写的具体业务控制器。由DispatcherServlet把用户请求转发到Handler。由Handler对具体的用户请求进行处理。

HandlAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

View Resolver:视图解析器

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

View:视图

SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

mvc:annotation-driven说明

在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。 使用mvc:annotation-driven自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在SpringMVC.xml配置文件中使用mvc:annotation-driven替代注解处理器和适配器的配置。

它就相当于在xml中配置了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- Begin --> 
<!-- HandlerMapping -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- HadnlerExceptionResolvers -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver"></bean>
<bean class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"></bean>
<!-- End -->

RequestMapping注解

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

RequestMapping注解可以作用在方法和类上:

  1. 作用在类上:请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。 它出现的目的是为了使我们的URL可以按照模块化管理,例如:
    账户模块:
    /account/add
    /account/update
    /account/delete

    订单模块:
    /order/add
    /order/update
    /order/delete
    前面相同的部分就是把RequsetMapping写在类上,使我们的URL更加精细。
  2. 作用在方法上:URL的二级访问目录
  3. 细节:路径可以不编写 / 表示应用的根目录开始
  4. 细节:${ pageContext.request.contextPath }也可以省略不写,但是路径上不能写 /

RequestMapping的属性

  1. path 指定请求路径的url
  2. value value属性和path属性是一样的
  3. mthod 指定该方法的请求方式(get方法和post方法)
  4. params 用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。例如:
    params = {“accountName”},表示请求参数必须有accountName
    params = {“moeny!100”},表示请求参数中money不能是100。
  5. headers 发送的请求中必须包含的请求头(不常用)
Donate comment here