Spirng MVC——轻量级MVC框架-day1

Front设计模式

        Front(前端)设计模式就是有一个前端(不是前端专业那个前端,是最前面的意思)统一入口,在统一入口根据请求url分发给编写的普通类中的普通方法。

        这样进行设计的好处   

  • 只需要在一个Servlet中编写获取容器Bean的代码,减少了代码冗余。

  • 不需要为每个控制器都创建一个类,而是可以在一个普通Java类中提供普通实例方法代表以前servlet中的service方法。

  • 因为可以自己编写普通Java类,这类可以放入到Spring容器中,注入Service更方便。

  • 同时因为是自己编写的Java,所以可以进行一些封装,对其他操作进行简化。 

Spring MVC介绍

        Spring MVC 虽然在平时认为是一个独立的框架。但其本质为Spring 框架的一个扩展,在Spring官方ZIP包就是一个spring-webmvc.jar的jar包。

        Spring MVC是基于Front设计模式,并且Spring MVC中已经帮助编写了前端入口的DispatcherServlet,里面编写了请求分发功能,但是并没有提供@WebServlet注解,需要在web.xml手动编写<servlet>配置。

Spring中的父子容器关系

        Spring 官方为Spring MVC专门定义了一个容器,这个容器里面放Spring MVC中全部Bean,且这个容器属于Spring容器的子容器。

        并且有这样的一个规定:Spring MVC子容器可以调用Spring 父容器的全部内容。但是Spring父容器不能调用Spring MVC子容器内容。

                        

Spring MVC环境搭建

创建项目并引入依赖

        使用Maven骨架构建web项目,在pom.xml中引入Spring MVC的依赖和Tomcat的插件

  <!-- 依赖了Spring框架核心功能的5个依赖以及Spring整合Web的依赖spring-web -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.16</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat8-maven-plugin</artifactId>
        <version>3.0-r1756463</version>
        <configuration>
          <port>8080</port>
          <path>/${artifactId}</path>
        </configuration>
      </plugin>
    </plugins>
  </build>

创建Spring MVC配置文件进行配置

        和创建Spring配置文件类似,Spring MVC的配置文件也是在src/main/resource中进行创建和配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- Spring MVC配置文件 -->
<!--  扫描@Controller注解, 将有@Controller注解修饰的类交由Spring MVC容器管理  -->
    <context:component-scan base-package="com"/>
</beans>

编写web.xml配置文件

        web.xml的配置是因为Spring MVC中已经编写好的前端入口DispatcherServlet生效,并且在DispatcherServlet创建后加载Spring MVC的配置文件

<!-- 配置前端控制器(DispatcherServlet) -->
    <!-- Servlet路径的指定 -->
    <servlet>
        <servlet-name>cc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--  初始化参数,只能当前Servlet使用  -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--  Tomcat启动时完成Servlet的创建  -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!-- Servlet映射访问的路径 -->
        <servlet-name>cc</servlet-name>
        <!--  / 表示除了.jsp文件不会拦截,其他都会访问到DispatcherServlet进行分发  -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

创建控制器类进行测试

        创建controller包,创建自定义Controller控制器类(Spring MVC自定义控制器类都是以Controller结尾)

        自定义Controller在Spring MVC称为控制器类(Handler),里面的方法称为:控制单元(HandlerMethod)。控制单元的访问权限修饰符和方法名没有强制要求。

@Controller
public class TestController {
	@RequestMapping("frist")
	public String test01() {
		return "/index.jsp";
	}
}

        在浏览器输入:http://localhost:8080/springmvc_test01/frist   如果能转发到first.jsp页面说明整体环境搭建成功

@RequestMapping注解

@RequestMapping注解可以写在控制器类上,也可以写在控制单元方法上。

1.如果用在控制器类上,当访问控制单元时,必须写为类上@RequestMapping映射路径+方法上@RequestMapping映射路径

2.如果用在控制单元上,访问时只需要写为方法上@RequestMapping映射路径

注解的属性

        @RequestMapping注解中还提供了很多的参数,具体如下:

path:定义映射路径 。URL中出现指定映射路径时会执行当前控制单元。支持一个方法多个映射路径。

        当映射一个访问路径时,可以写为:path = "路径名" 或者 path = {"路径名"}(如果属性是数组类型,且取值只有一个时,{}可以省略不写)

        当映射多个访问路径时,可以写为:path = {"路径名1","路径名2"...}

value:作用和path相同。当只有一个value属性时,value属性名可以省略不写。

name:给控制单元定义一个名称。可以理解为给控制单元添加注释。

method:设置允许的请求方式。当设置了method属性后,表示只有指定类型请求方式才能访问这个控制单元方法,其他的请求方式访问时,响应会出现405状态码。

@RequestMapping(method = (RequestMethod.POST,RequestMethod.GET.....))

可以简化为:

@GetMapping(等价于@RequestMapping(method = RequestMethod.GET),@PostMapping.....

params:指定请求中必须携带指定名称的请求参数。如果请求中没有包含指定类型参数,响应会出现400状态码。并且明确提示在实际的请求参数中没有明确设置name属性。

headers:指定请求头中必须包含指定的请求头参数。如果请求头中没有指定的请求头参数,浏览器会报404。

consumes:表示处理请求内容的类型,大多情况都由Spirng MVC自动判断。

produces:只有在配合@ResponseBody注解使用时才会生效。指定响应内容的类型。

注解的映射路径

        映射路径就是web.xml中<url-pattern>的值或者@WebServlet("")注解的值。 无论是在Servlet中还是在Spring MVC中,都表示:当URL中出现指定路径时会执行Servlet的方法或执行Spring MVC的控制单元。

多级路径

        在Spring MVC 的映射路径也支持多层写法。多级路径需要注意转发到的返回值是否存在,只需要在返回值中使用绝对路径就可以减少出错的情况。

通配符映射路径

        在Spring MVC中支持三种特殊的符号的映射路径写法。(当访问同一映射路径有多种写法时(以frist为例),优先级为固定值 (frist) > ?形式(frist?) > 一个*号(/*) > (/**)形式 )

符号解释
?匹配任意单字符
*匹配0或者任意数量的字符
**匹配0或者更多数量的目录

Spring MVC中的转发和重定向

转发与重定向的区别

(1)转发为一次请求,tomcat内部跳转。重定向为多次请求,不是tomcat内部跳转。

(2)转发是一次请求,无论服务器内部转发多少次,请求对象都不变。所以转发可以共享请求域的值。同时对于客户端浏览器URL是不变的。

        重定向后需要客户端重新发起请求,和重定向之前不是一个请求。所以重定向后不能获取到之前设置在请求域的值。同时客户端浏览器URL是改变的。

(3)转发只能跳转到当前项目内部资源。重定向可以跳转到外部资源。例如:从自己的项目中跳转到百度应该使用重定向。

(4)转发时资源路径如果是绝对路径,第一个 / 表示当前项目根目录

Spring MVC中的转发和重定向

        在Spring MVC框架中,默认情况下都使用转发进行寻找资源。

@RequestMapping("t1")
	public String demo01() {
		System.out.println("demo01 执行了");
		return "/index.jsp";
	}

         在资源路径前面添加forward: 表示转发。因为写不写forward:都是转发,所以为了代码写起来简单一些,多省略forward:

	@RequestMapping("t1")
	public String demo01() {
		System.out.println("demo01 执行了");
		return "forward:/index.jsp";
	}

         重定向需要手动设置。如果希望使用重定向跳转到其他资源,只能在资源路径最前面明确添加redirect:。

@RequestMapping("t1")
	public String demo01() {
		System.out.println("demo01 执行了");
		return "redirect:/index.jsp";
	}

WEB-INF目录及目录中资源的访问

        把JSP文件放入到webapp目录中,或在webapp下新建一个目录把页面资源放入到目录中,这种情况JSP都是可以通过浏览器直接访问的。

        但是在一些特定的项目中,从安全性等方面考虑不希望客户端通过浏览器直接访问对应的资源。

        这时就可以把资源放入到WEB-INF目录中。因为在Java Web项目中规定:WEB-INF中资源是不允许被客户端直接访问,需要先访问控制器,通过控制器的转发来访问这些资源。

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        此时在浏览器地址栏访问hello.jsp是无法访问到的。

        ​​​​​​​        ​​​​​​​        ​​​​​​​

        需要提供一个控制单元方法,转发到JSP页面中。

@RequestMapping("/show")
public String show(){
    return "/WEB-INF/hello.jsp";
}

        这时访问控制单元,就可以看到对应的页面信息了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值