SpringMVC-03-介绍及程序创建

2.2 SpringMVC是什么
  • Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
  • Spring MVC 角色划分清晰,分工明细。由于 Spring MVC 本身就是 Spring 框架的一部分,可以说和 Spring 框架是无缝集成。性能方面具有先天的优越性,是当今业界最主流的 Web 开发框架,最热门的开发技能
  • Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
  • Spring MVC 是结构清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。

**Spring的Web模块:**Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。

  • Spring的MVC框架是Spring为构建Web应用提供了一个功能全面的MVC框架,使用IoC对控制逻辑和业务对象提供了完全的分离,它允许你声明性地将请求参数绑定到你的业务对象中,此外,Spring的MVC框架还可以利用Spring的任何其它服务

  • Spring MVC优点

  • 简单易学,灵活,轻量级,扩展性强
  • 清晰地角色划分,Spring MVC 在 Model、View 和 Controller 方面提供了一个非常清晰的角色划分,这 3 个方面真正是各司其职。开发效率高
  • 高效,基于请求响应的mvc框架
  • 灵活的配置功能,松耦合可插拔的组件结构,可以把类当作 Bean 通过 XML 进行配置。
  • 约定优于配置
  • 提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。
  • 功能强:注解驱动/RestFul/数据验证/格式化/本地化/国际化支持/主题
  • 真正做到与 View 层的实现无关。它不会强制开发者使用 JSP,可以根据项目需求使用 Velocity、FreeMarker 等技术。
  • 面向接口编程
  • 与 Spring 框架无缝集成,将需要的bean注册到spring中,用的时候直接从容器中取即可。
  • 使用的人、公司多
  • RestFul:url地址栏,不用?param1=xx&param2=xx进行传参,用/分割来传参进行请求响应

  • Spring 的web框架是围绕DispatcherServlet【调度Servlet】设计。DispatcherServlet是将请求分发到不同的处理器。Spring 2.5 版本开始,Java5之后的版本新增了 Spring MVC 注解功能,用于替换传统的基于 XML 的 Spring MVC 配置

2.3 创建一个Spring MVC程序
  • 步骤
  • 普通的maven子项目,加入web框架支持转为web项目,再需要确认项目下和发布的项目中是否有lib依赖

  • SpringMVC配置,在 web.xml 中配置 Servlet,创建 Spring MVC 的配置文件

  • 创建 Controller(处理请求的控制器)

  • 创建 View,jsp

  • 测试运行

2.3.1 SpringMVC配置
  • Spring MVC 是基于 Servlet 的,DispatcherServlet 是整个 Spring MVC 框架的核心,主要负责接收请求并将其分派给相应的处理器处理。所以配置 Spring MVC,首先要配置 DispatcherServlet。跟所有 Servlet 一样,用户必须在 web.xml 中进行配置。
  • web.xml 这个web版本必须时最新版本
<?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">
    <servlet>
        <!--配置 DispatcherServlet,是 Spring MVC 的入口 -->
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--使用 Spring 资源路径的方式进行指定,即 classpath:springmvc-servlet.xml-->
            <!--这个name是源码中的参数,固定  -->
            <param-name>contextConfigLocation</param-name>
            <!--classpath:当前项目路径-->
            <!--classpath*:所有项目路径-->
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--服务器容器启动,立刻加载Servlet-->
         <!-- 
        1、load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法);
        2、当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
        3、当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载;
        4、正数的值越小,该servlet的优先级越高,应用启动时就越先加载;
        5、当值相同时,容器就会自己选择顺序来加载。
		-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--/ 匹配所有请求不包括.jsp-->
    <!--/* 匹配所有请求包括.jsp-->
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!-- 处理所有URL -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
  • Spring MVC 初始化时将在应用程序的 WEB-INF 目录下查找Spring MVC的配置文件,该配置文件的命名规则是“servletName-servlet.xml”,例如 springmvc-servlet.xml。
  • 第二种方式配置处理器映射器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <!--添加处理映射器-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/login">sysController</prop>
                <prop key="/register">registerController</prop>
            </props>
        </property>
    </bean>
    <bean class="com.zk.controller.LoginController" id="sysController"/>
    <bean class="com.zk.controller.RegisterController" name="registerController"/>
    <!--添加处理适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--添加视图解析器,DispatcherServlet给它的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
</beans>
  • 可以将 Spring MVC 的配置文件存放在应用程序目录中,但需要使用 servlet 的 init-param 元素加载配置文件,通过 contextConfigLocation 参数来指定 Spring MVC 配置文件的位置
  • //不会匹配形如 .后缀 的url,而/*会, / *会将返回给用户的jsp再进行拦截,再走一遍流程若有此路径的映射方法返回的结果,可能再视图解析器这块再加一个.jsp,这样陷入了循环,无法给用户返回jsp页面,没有这样的映射方法那么直接报错
  • 同样联系后面的解决乱码问题,使用/一直翻车,需要给乱码过滤器匹配一个/*

servlet容器中的匹配规则是特定的规则,不要用通配符或者正则表达式的匹配规则来看待servlet的url-pattern

Servlet 2.5开始,一个servlet可以使用多个url-pattern规则,标签声明了与该servlet相应的匹配规则,每个标签代表1个匹配规则;

当servlet容器接收到浏览器发起的一个url请求后,容器将url去掉当前应用的根路径,以剩余的字符串作为servlet映射,假如url是http://localhost:8080/appname/index.html,其应用根路径是appname,容器会将http://localhost:8080/appname去掉,用剩下的/index.html部分拿来做servlet的映射匹配

标签< url-patten >的4种规则

  • 精确匹配中配置的项必须与url完全精确匹配。
<url-pattern>/com/*/hello</url-pattern> 这里的*不是通配符,是精确匹配
  • 扩展名匹配:以“.”开头的字符串被用于扩展名匹配,

    不能将路径型和扩展名型混用,要么是路径匹配(以“/”字符开头,并以“/”结尾),要么是扩展名匹配(以“.”开头),要么是精确匹配,三种匹配方法不能进行组合,不要使用通配符或正则规则。

url-pattern>/com/*.html</url-pattern> 错误,会产生IllegalArgumentException
  • 路径匹配:以“/”字符开头,并以“/*”结尾的字符串用于路径匹配
< url-pattern >/*< /url-pattern >

匹配到所有的 url ,包括路径型的和后缀型的 url (包括/login,.jsp),此时需要注意静态资源了,很多静态资源都是不需要经过 Servlet 的,会造成资源浪费,此时就需要做特殊处理;

  • 缺省匹配:缺省匹配url:会匹配到所有的路径。
< url-pattern >/< /url-pattern >
/*路径匹配的优先级仅次于精确匹配,所以“/*”会覆盖等级低的映射,很多404错误均由此引起,所以这是一种特别差的匹配模式,一般只用于filter的url-pattern
/是servlet中特殊的匹配模式,切该模式有且仅有一个实例,优先级最低,不会覆盖其他任何url-pattern,只是会替换servlet容器web.xml中的内建default servlet ,该模式同样会匹配所有request。
配置“/”不拦截*.jsp,的原因是servlet容器tomcat的web.xml有内置的“*.jsp”匹配器,而扩展名匹配的优先级高于缺省匹配。

若使用该标签,则需要在 springmvc 配置文件中配置 静态资源映射

<!-- 资源映射 -->
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
  • url-pattern匹配优先级:精确匹配>最长路径匹配(/*)>后缀匹配(Tomcat中的web.xml默认定义了jsp的servlet)>缺省匹配(/)以上都找不到servlet,就用默认的servlet
< url-pattern >*.do< /url-pattern > 后缀型映射,推荐用法

避免对静态资源的过滤,这样也就不需要像 方法1、2 那样需要对静态资源做特殊处理。

url-pattern映射匹配过程是有优先顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了

不能将两个Servlet映射到同一个url-pattern,Tomcat会报错;

<!-- 
	1、welcome-file-list一般情况下只能使用静态网页,如果非要把他配置成SpringMVC的控制器URL就会报错;
	2、若想使用动态网页(*.jsp),则 servlet 不能带有扩展名,否则就当成静态文件处理,即若想欢迎页面访问 *.jsp 页面,则扩展名不能有, <welcome-file>/pages/index</welcome-file>
	-->
  <welcome-file-list>
    <welcome-file>/pages/index.html</welcome-file>
  </welcome-file-list>
3.2.2 创建Spring MVC配置文件
  • 在 resources目录下创建 springmvc-servlet.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <!-- LoginController控制器类,映射到"/login" -->
    <bean class="com.zk.controller.LoginController" name="/login"/>

    <!-- RegisterController控制器类,映射到"/login" -->
    <!--  name="/register"不加上的话,会自动追加到项目名称后面,然后就会报404找不到,这里的/代表web项目的根目录-->
    <bean class="com.zk.controller.RegisterController" name="/register"/>
</beans>
  • 编写Controller,注意Controller是org.springframework.web.servlet.mvc.Controller;
  • 创建 RegisterController 和 LoginController 两个传统风格的控制器类
  • Controller 是控制器接口,接口中只有一个方法 handleRequest,用于处理请求和返回 ModelAndView。
public class LoginController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv =  new ModelAndView();
        mv.addObject("msg","登录过程!");
        mv.setViewName("/WEB-INF/jsp/login.jsp");
        return mv;
    }
}
public class RegisterController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv =  new ModelAndView();
        mv.addObject("msg","注册过程!");
        mv.setViewName("/WEB-INF/jsp/register.jsp");
        return mv;
    }
}
  • 编写view

  • index.jsp

<%--
  Created by IntelliJ IDEA.
  User: CNCLUKZK
  Date: 2022/6/30
  Time: 17:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%--${pageContext.request.contextPath}尽量加上--%>
  <a href="${pageContext.request.contextPath}/login" name="登录"/>登录
  <a href="${pageContext.request.contextPath}/register" name="注册"/>注册
  </body>
</html>
  • 编写WEB-INF/jsp/login.jsp、WEB-INF/jsp/register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
登录结果:${msg}
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
注册结果:${msg}
</body>
</html>
  • 部署运行,测试
    在这里插入图片描述
    在这里插入图片描述
  • 优化修改,再springmvc-servlet.xml 添加3个springmvc的实现类
<!--添加处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--添加处理适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<!--添加视图解析器,DispatcherServlet给它的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
  • 修改Controller
public class LoginController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv =  new ModelAndView();
        mv.addObject("msg","登录过程!");
        mv.setViewName("login");
        return mv;
    }
}
  • 测试同样可以实现跳转和数据传输

  • 可能遇到的问题:404,排查步骤

查看控制台输出,看看是缺少了jar包

若jar包存在,显示无法输出,就是再IDEA发布项目中,添加lib依赖

重启tomcat即可解决

在这里插入图片描述

  • 部署项目中lib文件缺失,需要添加lib中的jar包
下一篇:SpringMVC-04-执行流程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值