SpringMVC_简介

本文深入讲解SpringMVC框架,涵盖项目创建、重要组件、执行流程及请求参数绑定等关键概念,适合初学者快速掌握。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解MVC模型结构,熟悉SpringMVC项目创建以及重要的组件;掌握SpringMVC执行流程;

三层结构

我们在使用Java语言进行开发程序中,一般都是基于C/S架构或者B/S架构,我接触的都是B/S架构,即Browser/Server,而在B/S架构又分成三层结构,即:表现层(用于与客户端交互数据),业务层(处理业务逻辑),持久层(数据库操作)。

MVC模型

MVC 是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建 Web 应用程序表现层的模式;
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,是目前最主流的MVC框架之一;
SpringMVC通过一套注解让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口;

Model数据模型,用于封装数据
View通常指代前台的html或者jsp,用于展示数据
Controller整个流程的控制器,用于接收用户的请求

SpringMVC为表现层框架。
在这里插入图片描述 图片来源于黑马视频


SpringMVC项目创建

注意点一: 配置核心的前端控制器(配置DispatcherServlet);

 <!--配置前端控制器-->

  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建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>
  
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

注意点二: 在Resources目录下创建一个配置文件并编写配置文件内容(习惯性命名为springmvc.xml);

 <!-- 开启注解扫描,指定扫描路径 -->
    <context:component-scan base-package="com.yp"></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>

    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven></mvc:annotation-driven>

SpringMVC的重要组件

DispatcherServlet: 前端控制器,是整个流程控制的中心,由它调用其他组件处理请求;

HandlerMapping: 处理器映射器,用于根据用户请求找到对应的Handler;

Handler: 具体的业务控制器,处理用户请求;

HandlerAdapter: 处理器适配器,执行Handler;

ViewResolver: 视图解析器,根据处理结果进行视图解析,返回View给控制器;

SpringMVC执行流程

在这里插入图片描述图片来源于黑马视频


SpringMVC的请求参数绑定

绑定机制: 表单数据以key=value进行提交;SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定;

支持的数据参数类型: 基础数据类型和字符串类型; POJO类型;集合类型;

使用要求:

基础数据类型和字符串类型参数名称必须和控制器中方法的形参名称保持一致,严格区分大小写
POJO类型表单中参数名称和 POJO 类的属性名称保持一致,并且控制器方法的参数类型是 POJO 类型
数组和集合类型集合类型的请求参数必须在 POJO 中,在表单中参数名称和 POJO 类的属性名称保持一致;给 List 集合中的元素赋值使用下标,给 Map 集合中的元素赋值使用键值对;

部分注解介绍


@RequestMapping: 既可以作用在类上,也可以作用在方法上。

作用: 用于建立请求URL和处理请求方法之间的联系;

属性:
path: 用于指定请求的 URL;@RequestMapping(path="/account");
value: 用于指定请求的 URL; @RequestMapping(value="/account");
method: 用于指定请求的方式; @RequestMapping(value="/account",method=RequestMethod.POST);
params: 用于指定限制请求参数的条件;@RequestMapping(value="/account",params = {“userName”});
headers: 用于指定限制请求消息头的条件;


@RequestParams:

作用: 把请求URL中的指定名称的参数传递给控制器中的形参赋值;

属性:
value: 用于指定请求URL中参数名称;
required: 请求参数中是否必须提供此参数,默认值是true,必须提供;

代码示例:

<!--jsp代码-->
<a href="anno/testRequestParam?name=哈哈">RequestParam</a>

<!--控制器代码-->
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username){
        System.out.println(username);
        return "success";
    }

@RequestBody:

作用: 用于获取请求体内容,get请求方式不适用;

属性:
required: 是否必须有请求体,默认值是:true;

代码示例:

<!--jsp代码-->
 <form action="anno/testRequestBody" method="post">
        用户姓名:<input type="text" name="username" /><br/>
        用户年龄:<input type="text" name="age" /><br/>
        <input type="submit" value="提交" />
    </form>

<!--控制器代码-->
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
        System.out.println(body);
        return "success";
    }

@PathVariable:

作用: 用于绑定 url 中的占位符;

属性:
value: 用于指定 url 中占位符名称;
required: 是否必须提供占位符;

代码示例:

<!--jsp代码-->
<a href="anno/testPathVariable/100">testPathVariable</a>

<!--控制器代码-->
 @RequestMapping(value="/testPathVariable/{sid}")
 public String testPathVariable(@PathVariable(name="sid") String id){
        System.out.println(id);
        return "success";
    }

@RequestHeader:

作用: 用于获取请求消息头内容

属性:
value: 用于提供消息头名称;
required: 是否必须有此消息头;

代码示例:

<!--jsp代码-->
  <a href="anno/testRequestHeader">RequestHeader</a>

<!--控制器代码-->
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header) throws IOException {
        System.out.println(header);
        return "success";
    }

@CookieValue:

作用: 用于把指定 cookie 名称的值传入控制器方法参数;

属性:
value: 用于指定 cookie 的名称;
required: 是否必须有此 cookie;

代码示例:

<!--jsp代码-->
<a href="anno/testCookieValue">CookieValue</a>

<!--控制器代码-->
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
        System.out.println(cookieValue);
        return "success";
    }

@ModelAttribute: 既可以作用在方法上,也可以作用在参数上。

作用:

作用范围作用效果
方法表示当前方法会在控制器的方法执行之前先执行
参数获取指定的数据给参数赋值

属性:
value: 用于获取数据的 key; key 可以是 POJO 的属性名称,也可以是 map 结构的 key;

代码示例:

<!--jsp代码-->
   <form action="anno/testModelAttribute" method="post">
        用户姓名:<input type="text" name="uname" /><br/>
        用户年龄:<input type="text" name="age" /><br/>
        <input type="submit" value="提交" />
    </form>
    
<!--控制器代码-->
<!--无返回值类型-->
 @ModelAttribute
 public void showUser(String uname, Map<String,User> map){
        // 通过用户查询数据库(模拟)
        User user = new User();
        user.setUname(uname);
        user.setAge(20);
        user.setDate(new Date());
        map.put("abc",user);
    }
 @RequestMapping(value="/testModelAttribute")
 public String testModelAttribute(@ModelAttribute("abc") User user){
        System.out.println(user);
        return "success";
    }


<!--有返回值类型-->
@ModelAttribute
public User showUser(String uname){
        // 通过用户查询数据库(模拟)
        User user = new User();
        user.setUname(uname);
        user.setAge(20);
        user.setDate(new Date());
        return user;
    }
 @RequestMapping(value="/testModelAttribute")
 public String testModelAttribute( User user){
        System.out.println(user);
        return "success";
    }


@SessionAttributes: 只能作用在类上

作用: 用于多次执行控制器方法间的参数共享;

属性:
value: 用于指定存入的属性名称;
type: 用于指定存入的数据类型;

代码示例:

<!--jsp代码-->
 <a href="anno/testSessionAttributes">testSessionAttributes</a>
 <a href="anno/getSessionAttributes">getSessionAttributes</a>
 <a href="anno/delSessionAttributes">delSessionAttributes</a>

<!--控制器代码-->

@SessionAttributes(value={"msg"})  
public class AnnoController {

 /**
     * 存入值
     * @return
     */
 @RequestMapping(value="/testSessionAttributes")
 public String testSessionAttributes(Model model){
        // 底层会存储到request域对象中
        model.addAttribute("msg","Session存值");
        return "success";
    }
 /**
     * 获取值
     * @param modelMap
     * @return
     */
@RequestMapping(value="/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
        String msg = (String) modelMap.get("msg");
        System.out.println(msg);
        return "success";
    }

    /**
     * 清除值
     * @param status
     * @return
     */
@RequestMapping(value="/delSessionAttributes")
public String delSessionAttributes(SessionStatus status){
        status.setComplete();
        return "success";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值