Spring MVC

Spring MVC

SpringMVC是spring的子框架,应用于web端的架构模式

M指的是Model模型层,Java中的实体类,作用是处理数据
V指的是View视图层,像html,jsp这些页面,作用是展示数据
C指的是Controller控制层,比如servlet,作用是接收请求和响应请求,收集数据

springmvc的执行流程

用户发送请求到前端控制器,前端控制器调用处理器映射器执行处理器生成处理器执行链,返回给前端控制器,前端控制器通过处理器执行链找到处理器适配器,处理器适配器执行处理器获取ModelAndView,返回给前端控制器,前端控制器将ModelAndView传给视图解析器,视图解析器解析视图返回给前端控制器,前端控制器将数据填充到视图,最终返回给用户

实际开发步骤:

1.创建web项目,添加依赖(在项目结构中找到Artifacts,导入相关jar包)
2.编写web.xml配置文件,注册DispatcherServlet前端控制器
3.编写spring config配置文件
4.创建控制层类,完成映射
5.启动服务器,测试结果

创建web项目,添加相关依赖
在这里插入图片描述
添加的依赖:

将坐标打包方式写为war
spring-webmvc
javax.servlet-api

编写web.xml配置文件,注册servlet和配置接收路径的扩展名

<?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">
    <!--启动tomcat会创建DispatcherServlet对象,同时创建springmvc容器,读取springmvc配置文件-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--自定义springmvc读取配置文件的位置-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--tomcat启动后,创建DispatcherServlet的顺序,0-N,数字越小顺序越靠前-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--配置映射名和映射路径-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--/表示顶替了default的servlet功能,default的/可以处理静态资源,被顶替后,无法处理静态资源了,需要另外配置-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

配置spring config文件

<?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"
       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">
    <!--扫描包下注解,创建对象-->
    <context:component-scan base-package="com.alibaba.springmvc.controller" />

<!--配置视图解析器Internal....对象-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!--后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

修改web目录的路径
在这里插入图片描述

编写控制层代码

@Controller
public class UserController {
    @RequestMapping("/doSome")
    public ModelAndView method() {
        ModelAndView mav = new ModelAndView();
        mav.addObject("msg", "huanying........");
        mav.addObject("fun", "huanying111111111111........");
        mav.setViewName("/show.jsp");
        return mav;
    }
}

编写默认的JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
<h1>第一个springmvc项目</h1>
<p><a href="/springmvc02_war_exploded/doSome">点击跳转页面</a></p>
</body>
</html>

编写跳转的JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>title</title>
</head>
<body>
<h3>show jsp</h3><br>
<h3>show jsp:${msg}</h3><br>
<h3>show jsp:${fun}</h3><br>
</body>
</html>

启动tomcat服务器,测试结果

总结:
在WEB-INF目录下的资源是受保护的,用户不能直接访问,只能通过其他未受保护的页面间接访问

-------------------------------------------------------------
SpringMVC注解

@RequstMapping:在类上表示提取请求映射的公共部分,在方法上只是普通请求映射
属性method表示请求方式,值是RequestMethod枚举类型,有GET,POST,PUT,DELETE等
如果没有加method属性,那么GET,POST请求都是可以的

方法接收参数需要注意的问题

1.方法的参数名字必须和请求参数的name相同,跟参数的位置无关,springmvc框架会自动根据名字赋值
2.前端发送请求的参数都是字符串类型,如果方法的形参不是字符串类型,框架会帮我们将字符串转换成形参的类型,形参最好不要用基本类型,因为参数为null的话,基本类型不能接收,而包装类可以
3.如果发送请求方式是get,中文不会乱码,如果是post,会发生乱码,配置过滤器可以解决乱码问题

在web.xml配置文件中解决post请求中文乱码

 <!--配置过滤器,解决post请求中文乱码问题-->
    <filter>
        <!--配置需要创建的过滤器对象-->
        <filter-name>characterEncodingFilter</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>
        <!--强制让请求对象使用过滤器-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <!--强制让响应对象使用过滤器-->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

   <filter-mapping>
       <filter-name>characterEncodingFilter</filter-name>
       <!--表示强制所有的请求使用characterEncodingFilter过滤器-->
       <url-pattern>/*</url-pattern>
   </filter-mapping>

@RequstParam注解的使用

当发送请求的参数名和方法的形参名不同时,使用@RequstParam
属性value,写的是发送请求的参数名
属性required,默认为true,表示发送的请求必须传参,改为false,可以不传参

当发送请求参数的个数过多,可以使用Java对象作为方法的形参

要求Java对象的属性名和发送请求的参数名相同

关于方法的返回值类型

1.ModelAndView:表示需要数据模型和视图,对视图进行转发
2.String:表示如果返回的是简写视图名称,需要配置视图解析器,框架对视图进行转发forward,如果返回的是完整的视图,不需要配置视图解析器
3.void:不表示数据,也不返回视图,处理ajax可以使用,ajax只需要数据
4.Object:返回数据,和视图无关,响应ajax请求,可以是自定义类,比如Student,User等,也可以是对象数组List<User>

将数据转换成json对象的实现步骤:

4.1将数据转换成json对象,springmvc框架需要依赖jackson-core和jackson-databind
4.2在springmvc配置文件,添加标签<mvc:annotation-driven>,注解驱动
4.3在方法上加注解@ResponseBody
以上可以将数据转换成json对象,响应给ajax

@ResponeseBody注解的作用

如果返回的是String类型,方法上加了ResponeseBody注解,那么返回的数据类型是文本text,而不是视图,也不是json对象

tomcat 的web.xml配置文件下有一个servlet,叫default,服务器启动时自动创建

它的作用是:
1.处理静态资源,比如图片
2.处理未被映射到其它servlet的请求

当我们写的servlet映射路径为斜杠/时,顶替了default的功能,而我们写的servlet无法处理静态资源,为了处理静态资源,有两种方式:

方式1.spring config配置文件里配置,这种方式的缺点是需要依赖服务器

<!--将静态资源转发给default的servlet处理-->
    <mvc:default-servlet-handler />

而<mvc:default-servlet-handler />和注解@RequestMapping有冲突,需要在spring config配置annotation-driven注解驱动解决问题

<mvc:annotation-driven/>

方式二:在springmvc配置文件中使用mvc:resources标签,属性mapping表示,访问静态资源的url,location表示静态资源在项目中的目录位置,推荐这种方式,不用依赖服务器!

<mvc:resources mapping="/images/**" location="/images"></mvc:resources>

mapping属性以web为根,/**表示images目录下可以是文件,也可以是隔着一层目录在有文件,也可以是隔着多层目录才有文件
location属性以web为根,静态资源所在的目录

mvc:resources标签同样和注解RequestMapping有冲突,需要加注解驱动

<mvn:annotation-driven/>

开发中只需要配置一个即可
在这里插入图片描述-------------------------------------------------------
关于在前端主页面,点击链接跳转页面的url是否以斜杠开始问题

没有以斜杠开始,点击跳转时,公式是页面当前路径 - 资源名(文件名) + 后端url
以斜杠开始,点击跳转时,公式是页面当前路径 - 项目名 - 资源名(文件名) + 后端url,需要手动在路径前加项目名,而且在开发中项目名不能写死了

如果url不以斜杠开始的解决办法:
方式一:适合有大量请求时,一劳永逸!

1.在前端页面代码,添加如下,注意位置在html开头标签上方page头标签下方

<%
    String basePath = request.getScheme() + "://" +
            request.getServerName() + ":" + request.getServerPort() +
            request.getContextPath() + "/";
%>

2.在head标签内,添加如下

<base href="<%=basePath%>" />

方式二(不管以不以斜杠开始都可以):适合少量请求,更方便

在前端页面,请求跳转的路径前添加如下el表达式

${pageContext.request.contextPath}

比如,全路径为:“${pageContext.request.contextPath}/springmvc/doSome”

--------------------------------------------------------------------------
转发和重定向解释说明:
在这里插入图片描述
转发:在这里插入图片描述

转发使用场景:当配置了视图解析器,我们向跳转的页面路径不需要前缀,而们又不想修改配置文件的前缀,这个时候可以直接使用转发,就不走视图解析器的路线了

重定向:
在这里插入图片描述在这里插入图片描述----------------------------------------------------------------
全局统一异常处理

在写业务代码时,经常会抛出异常,最终处理的方式是try…catch…default,当有多个controller类,代码众多时,可以使用springmvc框架的异常机制

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述-----------------------------------------------------------------------
拦截器
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

有三个拦截器方法,只需要掌握preHandle

在这里插入图片描述多个拦截器执行顺序
在这里插入图片描述在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值