IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring MVC之(二)Spring MVC的核心类和常用注解 -> 正文阅读

[Java知识库]Spring MVC之(二)Spring MVC的核心类和常用注解

二、Spring MVC的核心类和常用注解

2.1 Spring MVC的核心类—DispatcherServlet

在前面的Spring MVC的工作流程中我们知道前端控制器(DispatcherServlet)在整个开发过成中发挥了不可或缺的作用。

DispatcherServlet的全名是org.springframework.web.servlet.DispatcherServlet,它在程序中充当这前端控制器的角色,在使用时只需将其配置在项目的web.xml文件中即可:

<?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_3_1.xsd"
         version="3.1">
  <display-name>Archetype Created Web Application</display-name>
  <!--配置前端过滤器-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--初始化时加载配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext-springmvc.xml</param-value>
    </init-param>
    <!--表示容器在启动时立即加载Servlet  这个值越小,启动级别越高-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--这个“/”就是指匹配不到.jsp,所以默认不拦截jsp页面,其他页面和请求一律拦截,也就是.jsp不会进入spring的DaispatcherServlet类;
        会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
        “/*”表示会匹配所有url,路径和后缀型的url(包括/login,*.jsp和.html等等)-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

在这里插入图片描述

2.2 @Controller注解类型

org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,其注解形式为@Controller。该注解在使用时不需要再实现Controller接口,只需要将@Controller注解加入到控制器类上,然后通过Sprring的扫描机制找到标注了该注解的控制器即可。

在配置文件中引入注解和注解要扫描的包:

<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       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
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--指定Spring要扫描的包-->
    <context:component-scan base-package="cn.controller"/>
    <!--启用SpringMVC注解-->
    <mvc:annotation-driven/>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--后缀:表示加载以.jsp结尾的文件-->
        <property name="suffix" value=".jsp"/>
        <!--前缀:表示加载这个目录下的文件-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
    </bean>

控制器类HelloController.java

package cn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 控制器类
 */
@Controller
public class HelloController {
    @RequestMapping("/showHello")
    public String showHello(){
        //这里只写了Hello,是因为在springmvc文件里已经启用了注解
        return "Hello";
    }
}

2.3 @RequestMapping注解类型

  • @RequestMapping注解的使用

    Spring通过@Controller注解找到相应的控制器类后,还需要知道控制器内部对每一个请求时如何处理的,这就需要使用@RequestMapping类型的注解。

    RequestMapping注解类型用于一个请求或一个方法,其注解形式为@RequestMapping,可以使用该注解标注在一个方法或一个类上。
    1. 标注在方法上

    当标注在一个方法上时,该方法将成为一个请求处理方法,它会在程序接收到对应的URL请求时被调用。

    package cn.controller;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * 控制器类
     */
    @Controller
    public class HelloController {
        @RequestMapping("/showHello")
        public String showHello(){
            //这里只写了Hello,是因为在springmvc文件里已经启用了注解
            return "Hello";
        }
    }
    

    2. 标注在类上

    当标注在一个类上时,该类的所有方法都将映射为相对于类级别的请求,表示该控制器所处理的所有请求都被映射到value属性值所指定的路径下。

    package cn.controller;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * 控制器类
     */
    @Controller
    @RequestMapping("/showHello2")
    public class HelloController {
        @RequestMapping("/showHello")
        public String showHello(){
            //这里只写了Hello,是因为在springmvc文件里已经启用了注解
            return "Hello";
        }
    }
    

    在这里插入图片描述

  • @RequestMapping注解的属性
    在这里插入图片描述
    这些属性都是可选的,但其默认属性是value,当value是其唯一属性时,可以省略属性名。

  • 组合注解

    • @GetMapping:匹配GET方式的请求;
    • @PostMapping:匹配POST方式的请求;
    • @PutMapping:匹配PUT方式的请求;
    • @DeleteMapping:匹配DELETE方式的请求;
    • @PatchMapping:匹配PATCH方式的请求
  • 请求处理方法的参数类型和返回类型
    话不多说,直接上代码:

    package cn.controller;
    import cn.pojo.SystemUser;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @Controller
    public class SystemUserController {
        /**
         * 请求打开登录界面---默认的请求方式是get请求
         * 这里的地址栏请求的地址value可以有多个,所以表示成数组形式
         * @return
         */
        //这个注解是SpringMvc注解
        @RequestMapping(method = RequestMethod.GET,value = {"/toLogin"})
        public String toLogin(){
            //故意写错,会调到错误界面,并把错误信息带过去
            System.out.println(1/0);
            return "login";
        }
    
        /**
         * 属性参数登录---在提交表单的时候设定是post请求,这里必须使用post请求
         * Servlet入参,就是在方法后面直接写这些参数
         * @param loginId
         * @param loginPwd
         * @return
         */
        @RequestMapping(method = RequestMethod.POST,value = {"/doLogin1"})
        public String doLogin1(String loginId, String loginPwd, HttpServletRequest request, HttpServletResponse response){
            System.out.println("用户名:"+loginId);
            System.out.println("密码:"+loginPwd);
            return "index";
        }
        /**
         * 有参数的方法中,可以根据@RequestParam注解来设定参数名称,
         * 当required为true时,说明这个参数必须有且必须是指定的名称,否则运行不成功
         * @param loginId
         * @param loginPwd
         * @return
         */
        @RequestMapping(method = RequestMethod.POST,value = {"/doLogin"})
        public String doLogin(@RequestParam(value = "loginId",required = true)String loginId,
                              @RequestParam(value = "loginPwd",required = true)String loginPwd){
            System.out.println("用户名:"+loginId);
            System.out.println("密码:"+loginPwd);
            return "index";
        }
    
        /**
         * 对象参数登录---在提交表单的时候设定是post请求,这里必须使用post请求
         * @param systemUser
         * @return
         */
        @RequestMapping(method = RequestMethod.POST,value = {"/doLogin2"})
        public String doLogin2(SystemUser systemUser){
            System.out.println(systemUser);
            return "index";
        }
    
        /**
         * 通过ModelAndView对象的方法返回指定的页面
         * @param systemUser
         * @return
         */
        @RequestMapping(method = RequestMethod.POST,value = {"/doLogin3"})
        public ModelAndView doLogin3(SystemUser systemUser){
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("myIndex");
            //这里添加对象,将数据返回到index.jsp页面
            //通过modelAndView添加内容封装进request作用域中,request转发的页面才能拿到数据
            modelAndView.addObject("USERS",systemUser.getLoginId());
            return modelAndView;
        }
        @RequestMapping(method = RequestMethod.GET,value = {"/myIndex"})
        public String myIndex(){
            return "index";
        }
    

除了上述的返回值类型之外,还可以进行重定向和请求转发:

  1. redirect重定向

    /**
     * 重定向找的是@RequestMapping注解下value方法下的指定的跳转路径,默认是get请求
     * 跳转到的的myIndex指的是另一个请求路径,也就是另一个value中的值,在给根据myIndex中的请求发送到最终的请求页面
     *
     * 注意:重定向中的内容一般封装在session作用域中,所以对于modelAndView封装的内容,重定向页面获取不到
     * @param loginId
     * @param loginPwd
     * @return
     */
    @RequestMapping(method = RequestMethod.GET,value = {"/doLogin4"})
    public String doLogin4(String loginId,String loginPwd){
        System.out.println("用户名:"+loginId);
        System.out.println("密码:"+loginPwd);
        return "redirect:/myIndex";
    }
    

    在这里插入图片描述
    在这里插入图片描述

  2. forward请求转发

    /**
     * 请求转发找的是@RequestMapping注解下value方法下的指定的跳转路径,默认是get请求
     * 直接跳转到的时myIndex页面
     *
     * 注意:请求转发中的内容一般封装在request作用域中,所以对于modelAndView封装的内容,请求转发页面可以获取到
     * @param loginId
     * @param loginPwd
     * @return
     */
    @RequestMapping(method = RequestMethod.GET,value = {"/doLogin5"})
    public String doLogin5(String loginId,String loginPwd){
        System.out.println("用户名:"+loginId);
        System.out.println("密码:"+loginPwd);
        return "forward:/myindex";
    }
    

    在这里插入图片描述
    在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:35:34  更:2021-07-23 10:36:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/18 17:52:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码