SpringMVC

SpringMVC

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

springMVC概述:
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。

springMVC入门案例:
1.在pom.xml文件中,添加jar包坐标,具体如下:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!--锁定spring的版本-->
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

2.在工程的web.xml中配置SpringMVC的核心控制器DispatcherServlet

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">
      <!--配置springMVC的核心控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

3.在resources目录下创建springmvc.xml配置文件

<?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">
	<!--开启组件的注解扫描-->
    <context:component-scan base-package="com"></context:component-scan>

</beans>

4.在web.xml中添加配置,加载springmvc.xml配置文件

<!--  配置SpringMVC的核心控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc.xml配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
<!--    DispatcherServlet服务器开启的时候就创建这个servlet对象-->
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
<!--    /表示拦截所有请求-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

注:<load-on-startup>num</load-on-startup>
设置该servlet在加载时的优先级以及是否在容器中加载该servlet,num为数字,当为正值时,表示加载,且数字越小表示优先级越高;若为负数,则容器启动时不加载,只有该servlet被选中时才加载

5.创建处理请求的类
在com包下新建一个controller包,存放处理请求的所有类

@Controller//采用注解的方式把这个类交由Spring容器管理
public class HelloController {
    //   配置请求的映射路径
    @RequestMapping("/hello")//采用注解的方式把这个类交给spring容器管理
    public String hello() {
        System.out.println("请求来了");//配置请求的映射路径
        return "success";//返回跳转到jsp页面的名称
    }
}

注:在@RequestMapping注解中,属性有path和value,其值都代表映射路径,而且仅有一个属性时,可以省略不写。所以,括号中的完整写法是:value=“/hello"或path=”/hello"

6.在springmvc.xml配置文件中配置视图解析器 InternalResourceViewResolver,并开启spirngmvc的注解驱动

<!--    配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
        <!--prefix 前缀  suffix 后缀 拼完成就是 /WEB-INF/success.jsp 因为我们返回的是一个success这个字符,然后再拼接上我们配置的前缀和后缀,就可以跳转到success.jsp这个页面-->
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
<!--    开启springmvc注解的驱动-->
    <mvc:annotation-driven />

7.在WEB-INF目录下创建一个success.jsp页面
在上面配置的前后路径中,jsp文件存在/WEB-INF下,因此我们在其下建立一个成功页面,随便写一句话即可

8.在index.jsp中请求hello这个方法

<a href="${pageContext.request.contextPath}/hello">请求后台</a>

9.整体的文件目录如下:
在这里插入图片描述

10.发布项目,进行测试

入门案例的执行流程
在这里插入图片描述

  1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,
    就会加载springmvc.xml配置文件
  2. 开启了注解扫描,那么HelloController对象就会被创建
  3. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解
    找到执行的具体方法
  4. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
  5. Tomcat服务器渲染页面,做出响应

官方的详细流程图
在这里插入图片描述

基本组件的简单解释:
1.DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,相当于是SpringMVC的大脑,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

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

3.Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。这里所说的Handler就是我们自己编写的Controller

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

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

6.View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。

表单提交数据是post请求方式时,中文会乱码的情况
在web.xml中配置一个SpringMVC提供的一个过滤器CharacterEncodingFilter,具体内容如下:
<!--  配置springmvc提供的一个过滤器解决中文乱码问题-->
  <filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
SpringMVC常用注解:
RequestMapping注解的属性介绍

作用:建立请求URL和处理方法之间的对应关系
作用对象:可以作用在方法和类上
作用在类上:第一级的访问目录
作用在方法上:第二级的访问目录

eg:

@RequestMapping(path = "/a") //一级路径
public class Hello {
    @RequestMapping(value = "/b") //二级路径
    public String hello() {
        System.out.println("请求来了");
        return "success";
    }
}
//最终代表的路径就是:/a/b
//前台请求的路径也要跟着变:
<a href="${pageContext.request.contextPath}/a/b">请求后台</a>

RequestMapping的属性:

  1. path 配置请求路径
  2. value 配置请求路径
  3. mthod 配置介绍那种请求方式
    eg:@RequestMapping(value="/hello",method ={RequestMethod.GET,RequestMethod.POST}) 意思是接收get请求和post请求都可。
    如果仅有一种请求方式的话,也可以换个注解,如get请求对应的就是@GetMapping(“/hello3”),相当于method属性融入@RequestMapping中了。类似的还有 @PostMapping,@PutMapping,@DeleteMapping
    eg:@RequestMapping(value = "/hello2",method = {RequestMethod.GET})
    上面的写法可以使用一个注解来代替:@GetMapping(value = “/hello2”)
    4.params 指定限制请求参数的条件
    @RequestMapping(value = "/hello",params ={"username"} ) 表示请求的时候必须有请求参数username 当但是跟请求参数的值没关系
 <a href="${pageContext.request.contextPath}/hello?username=zhangsan">请求后台</a>
如果配置了请求参数的名称和值,那么在请求时,必须保持一致
@RequestMapping(value = "/hello",params ={"username=zhangsan"} )
 <a href="${pageContext.request.contextPath}/hello?username=zhangsan">请求后台</a>
请求时的参数名和值要和 @RequestMapping注解中配置的一致

RequestParam注解
作用:把请求中的指定名称的参数传递给控制器中的形参赋值,此注解用在形参上。
属性
1. value:请求参数中的名称 或者使用name属性 两个一样
2. required:请求参数中是否必须提供此参数,默认值是true,必须提供
3. defaultValue = “lisi” 参数的默认值

eg:

@RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(value = "uname") String username){
        System.out.println(username);
        return "success";
}

RequestBody注解
作用:用于获取请求体的内容(注意:get方法不可以,因为get请求没有请求体),此注解用在方法的形参上
属性
required:是否必须有请求体,默认值是true
:@ResponseBody 用于前后台异步交互,将Java对象转换成JSON字符串返回给前台,也可以使用在类上或方法上
使用在类上,那表示该类中的所有方法都返回JSON数据
使用在方法上,那表示该方法返回JSON数据

@RestController :
综合了@ResponseBody和@Controller

后台方法的返回值:
1.返回一个字符串
之前就是返回字符串,其实是跳转页面的名称

2.返回void
如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。
如果返回void那么进行页面的跳转,就需要用原生的Servlet API 进行跳转。跳转路径需要自己编写,因为使用原生的Sevlet API 不会执行视图解析器

3.返回值是ModelAndView对象
ModelAndView对象是SpringMVC提供的一个对象,可以用来调整具体的JSP视图
使用ModelAndView可以把数据存到请求域中,还可以指定要跳转的视图

跳转页面的另一种方式forward(转发)和redirect(重定向):

  • 转发:forward: 这个是固定写法,路径要写正确了,因为不走视图解析器
    request.getRequestDispatcher(“/WEB-INF/pages/success.jsp”).forward(request, response);
  • 重定向: redirect: 固定写法 可以不用写项目路径,重定向不能访问WEB-INF目录下的资源
    response.sendRedirect(request.getContextPath() + “/home.jsp”);
配置静态资源不被拦截
当前台用Jquery进行异步请求时,代码往往失效,因为放在服务器端的这些静态资源文件被SpringMVC的前端控制器拦截了,无法请求到相关静态资源。因此,需要在springmvc.xml下进行相关配置,让DispatcherServlet不要拦截静态资源

配置方式1:

<!-- 设置静态资源不过滤 -->   
     <!-- 样式 -->  
	 <mvc:resources location="/css/" mapping="/css/**"/>   
      <!-- 图片 -->  
	 <mvc:resources location="/images/" mapping="/images/**"/>   
	 <!-- javascript -->
	 <mvc:resources location="/js/" mapping="/js/**"/>  

配置方式2:

<mvc:default-servlet-handler/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值