实现SpringMVC底层机制(三)

这篇具有很好参考价值的文章主要介绍了实现SpringMVC底层机制(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.封装请求数据

1.将方法的httpservletrequest和httpservletresponse参数封装到参数数组进行反射调用
1.修改SunDispatcherServlet.java的executeDispatch方法
    //请求分发
    private void executeDispatch(HttpServletRequest request, HttpServletResponse response) {
        //获取映射对象
        SunHandler sunHandler = getSunHandler(request);
        //映射对象不等于空则反射调用controller的方法
        if (sunHandler != null) {
            try {
                /**
                 * 1.这里的的方法调用方式只支持有两个参数的方法
                 * 2.将实参放到参数数组,然后给这个invoke方法设置可变参数
                 */
                //1.获取目标方法的形参列表
                Class<?>[] parameterTypes = sunHandler.getMethod().getParameterTypes();
                //2.创建实参列表
                Object[] objects = new Object[parameterTypes.length];
                //3.遍历形参列表,将实参的类型跟形参匹配并填充到实参列表中
                for (int i = 0; i < parameterTypes.length; i++) {
                    //封装HttpServletRequest request, HttpServletResponse response
                    if ("HttpServletRequest".equals(parameterTypes[i].getSimpleName())) {
                        objects[i] = request;
                    }
                    if ("HttpServletResponse".equals(parameterTypes[i].getSimpleName())) {
                        objects[i] = response;
                    }
                }

                sunHandler.getMethod().invoke(sunHandler.getController(),objects);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            }
        } else {
            //当映射对象是空的时候,返回404
            try {
                response.getWriter().write("<h1>404 not found!</h1>");
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }
    }
2.debug测试

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

2.封装http请求参数
1.需求分析

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

2.自定义注解RequestsParam
package com.Sun.sunspringmvc.annotation;

import java.lang.annotation.*;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Target(ElementType.PARAMETER) //作用于方法中的参数
@Retention(RetentionPolicy.RUNTIME) //作用范围
@Documented
public @interface RequestsParam {
    String value() default "";
}
3.修改MonsterService接口,添加方法

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

4.修改MonsterServiceImpl.java添加方法
    //根据姓名返回妖怪对象数组
    public List<Monster> findMonstersByName(String name) {
        ArrayList<Monster> monsters = new ArrayList<Monster>();
        monsters.add(new Monster(1, "牛魔王", "芭蕉扇", 500));
        monsters.add(new Monster(2, "蜘蛛精", "吐口水", 200));
        monsters.add(new Monster(3, "蜘蛛精", "吐口水", 200));
        monsters.add(new Monster(4, "蜘蛛精", "吐口水", 200));
        monsters.add(new Monster(5, "蜘蛛精", "吐口水", 200));
        //根据姓名查找
        //存放结果
        ArrayList<Monster> monsters1 = new ArrayList<Monster>();
        for (Monster monster : monsters) {
            if (monster.getName().equals(name)) {
                monsters1.add(monster);
            }
        }
        return monsters1;
    }
5.修改SunDispatcherServlet.java编写方法根据请求参数的名字判断对应于形参列表的哪个位置
    //根据请求参数的名字判断对应于形参列表的哪个位置,如果没有对应的则返回-1
    public int getIndexRequestParameterIndex(Method method, String name) {
        //遍历方法的参数列表
        Parameter[] parameters = method.getParameters();
        for (int i = 0; i < parameters.length; i++) {
            //获取参数对象,查看是否有注解RequestParam
            Parameter parameter = parameters[i];
            if (parameter.isAnnotationPresent(RequestsParam.class)) { //如果有这个注解
                //得到这个注解
                RequestsParam annotation = parameter.getAnnotation(RequestsParam.class);
                //如果这个注解的值和请求的参数相同,则返回这个位置
                if (annotation.value().equals(name)) {
                    return i;
                }
            }
        }
        //遍历之后如果没有找到对应位置返回-1
        return -1;
    }
6.修改SunDispatcherServlet.java的executeDispatch方法

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

7.单元测试

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

8.通过参数名匹配
1.修改SunDispatcherServlet.java的executeDispatch方法

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

2.添加方法
    //获取目标方法所有形参名并以列表的形式返回
    public List<String> getParameterNames(Method method) {
        List<String> parNames = new ArrayList<String>();
        Parameter[] parameters = method.getParameters();
        for (Parameter parameter : parameters) {
            String name = parameter.getName();
            parNames.add(name);
        }
        return parNames;
    }
3.引入插件pom.xml否则getName得到的形参列表是下面的[arg0, arg1, arg2]
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <compilerArgs>
              <arg>-parameters</arg>
            </compilerArgs>
            <encoding>utf-8</encoding>
          </configuration>
        </plugin>

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

4.单元测试

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

2.完成视图解析

1.需求分析

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

2.框架搭建
1.编写Service
1.MonsterService.java

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

2.MonsterServiceImpl.java添加方法
    //处理登录的方法
    @Override
    public boolean login(String name) {
        if ("sun".equals(name)) {
            return true;
        }
        return false;
    }
2.编写MonsterController.java添加方法
    @RequestMapping("monster/login")
    public String login(String mName) {
        System.out.println("接收到的名字=" + mName);
        boolean login = monsterService.login(mName);
        if (login) {
            //返回给视图解析器
            return "forward:/login_ok.jsp";
        } else {
            return "forward:/login_error.jsp";
        }
    }
3.编写login.jsp
<%--
  Date: 2024/2/28
  Time: 13:54
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="get" action="monster/login">
    姓名:<input name="mName" type="text"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>

4.login_ok.jsp
<%--
  Date: 2024/2/28
  Time: 13:56
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登录成功</h1>
欢迎你:${?}
</body>
</html>

5.login_error.jsp
<%--
  Date: 2024/2/28
  Time: 13:56
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Title</title>
</head>
<body>
<h1>登录失败</h1>
欢迎你:${?}
</body>
</html>

6.修改SunDispatcherServlet.java解决中文乱码问题

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

3.完成基本视图解析器

1.修改SunDispatcherServlet.java

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

                //以下是视图解析器
                //1.判断是否是字符串
                if (result instanceof String) {
                    //判断是否包含:
                    if (((String) result).contains(":")) {
                        //根据冒号分割
                        String[] split = ((String) result).split(":");
                        String type = split[0];
                        String name = split[1];
                        if (type.equals("forward")) {
//                            /login_ok.jsp
                            try {
                                //请求转发
                                request.getRequestDispatcher(name).forward(request, response);
                            } catch (ServletException e) {
                                throw new RuntimeException(e);
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }
                        } else if (type.equals("redirect")) {
                            //重定向
                            String fill = "/sun_springmvc";
                            try {
                                response.sendRedirect(fill + name);
                            } catch (IOException e) {
                               throw new RuntimeException(e);
                            }
                        }
                    } else {
                        //没有冒号比如login.jsp, 默认请求转发
                        try {
                            request.getRequestDispatcher("/" + result).forward(request, response);
                        } catch (ServletException e) {
                            throw new RuntimeException(e);
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
2.单元测试

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

4.自定义ResponseBody注解

1.需求分析

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

2.编写注解ResponseBody.java
package com.Sun.sunspringmvc.annotation;

import java.lang.annotation.*;

/**
 * 用于标识一个要返回json数据的方法
 *
 * @author 孙显圣
 * @version 1.0
 */
@Target(ElementType.METHOD) //作用目标是方法
@Retention(RetentionPolicy.RUNTIME) //作用范围
@Documented
public @interface ResponseBody {
}

3.编写Controller,MonsterController.java
    //编写一个方法,添加ResponseBody注解,返回json数据
    @ResponseBody
    @RequestMapping(value = "monster/list/json")
    public List<Monster> listMonsterByJson(HttpServletRequest request, HttpServletResponse response) {
        List<Monster> monsters = monsterService.listMonsters();
        return monsters;
    }
4.引入Json格式转换工具jackjson
    <!--引入jackson 使用它的工具可以进行json类型转换-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.4</version>
    </dependency>
5.修改SunDispatcherServlet.java,在executeDispatch方法添加逻辑

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

 else if (result instanceof ArrayList) { //如果结果类型是ArrayList则表明可能要求返回的是Json形式
                    //得到这个目标方法对象
                    Method method = sunHandler.getMethod();
                    //判断是否含有ResponseBody注解
                    if (method.isAnnotationPresent(ResponseBody.class)) { //如果有,则以json形式返回数据
                        //把返回的结果转换成json格式的数据
                        ObjectMapper objectMapper = new ObjectMapper();
                        String json = objectMapper.writeValueAsString(result);
                        //返回给浏览器
                        //注意设置字符编码
                        response.setContentType("text/html;charset=utf-8");
                        PrintWriter writer = response.getWriter();
                        writer.write(json);
                        //刷新和关闭
                        writer.flush();
                        writer.close();
                    }
                }
6.单元测试

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc

5.SpringMVC框架总结

实现SpringMVC底层机制(三),底层机制,开发语言,java,spring,springmvc文章来源地址https://www.toymoban.com/news/detail-860928.html

到了这里,关于实现SpringMVC底层机制(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java语言开发在线小说推荐网 小说推荐系统 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据、人工智能、机器学习开发

    1、开发工具和使用技术 MyEclipse10/Eclipse/IDEA,jdk1.8,mysql5.5/mysql8,navicat数据库管理工具,tomcat,SSM(spring+springmvc+mybatis)开发框架,jsp页面,javascript脚本,jquery脚本,bootstrap前端框架(用户端),layui前端框架(管理员端),layer弹窗组件等。 2、实现功能 前台用户包含:注

    2023年04月26日
    浏览(57)
  • Java开发之框架(spring、springmvc、springboot、mybatis)【面试篇 完结版】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文主要记录spring的单例bean、切面编程AOP、spring事务、循环依赖、常见注解等 提示:以下是本篇文章正文内容,下面案例可供参考 ① 问题引入 Spring框架中的bean是单例的 singleton :bean在每个Spring IOC容

    2024年02月07日
    浏览(38)
  • (第十一天)初识SpringMVC SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录

    今天我们要来学习一下SSM框架的最后一个框架SpringMVC 一、初认SpringMVC 基本概念: ​ Spring MVC(Model-View-Controller)是一个用于构建Java Web应用程序的开源框架,它提供了一种基于MVC架构的方式来开发Web应用 。 ​ SpringMVC是Spring Framework的一部分,它是一种基于模型-视图-控制器(

    2024年02月07日
    浏览(55)
  • 【Spring+SpringMVC+Mybatis】Spring+SpringMVC+Mybatis实现前端到后台完整项目

    🌕博客x主页:己不由心王道长🌕! 🌎文章说明:Spring+SpringMVC🌎 ✅系列专栏:Spring 🌴本篇内容:使用Spring、SpringMVC对以前做过的项目进行重新整合和介绍。🌴 ☕️每日一语:宁愿因做自己而招人厌恶,也不愿为了迎合他人而伪装自己,懂你的人会留下来,不懂你的人,你

    2024年02月02日
    浏览(35)
  • Spring+SpringMVC+MyBatis整合项目开发(配有项目,已开源)

    🍰 个人主页:__Aurora__ 🍞 如果文章有什么需要改进的地方还请各位大佬斧正。 🍉如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️ 🔥最近在学SSM框架,本文是根据b站【黑马程序员 ssm框架 2021 版】整理。 🔥视频链接:https://www.bilibili.com/video/BV1WZ4y1P7Bp?spm_id_from=3

    2023年04月08日
    浏览(41)
  • SpringMVC底层原理源码解析

    SpringMVC的作用毋庸置疑,虽然我们现在都是用SpringBoot,但是SpringBoot中仍然是在使用SpringMVC来处理请求。 我们在使用SpringMVC时,传统的方式是通过定义web.xml,比如: 我们只要定义这样的一个web.xml,然后启动Tomcat,那么我们就能正常使用SpringMVC了。 SpringMVC中,最为核心的就是

    2024年02月05日
    浏览(35)
  • 【SpringMVC】9—底层原理

    ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆 9.1.1 初始化操作调用路线 类和接口之间的关系 调用路线图 调用

    2023年04月10日
    浏览(23)
  • Java框架学习(二)SSM体系:Spring、SpringMVC、MybatisPlus

    在原始的分层架构实现中,负责响应请求的Controller层依赖于业务逻辑处理的Service层,而业务逻辑处理的service层又依赖与数据访问Dao层。上下层间相互依赖耦合,耦合的缺陷在于牵一发而动全身,不利于后期维护拓展。 为了分层解耦,Spring采用IoC控制反转和DI依赖注入,来解

    2024年02月11日
    浏览(35)
  • 基于ssm实现图书商城(spring+springmvc+mybatis)

    一、项目功能 前台 图书基本展示,包括推荐图书展示和类图书类型展示. 推荐图书包括条幅推荐,热销推荐和新品推荐. 按照图书类型展示商品. 图书详细信息展示. 图书加入购物车. 修改购物车内图书信息,例如数量等. 用户登录. 用户注册. 修改个人信息,包括密码和收获信息. 购

    2024年02月12日
    浏览(36)
  • Java项目:ssm框架基于spring+springmvc+mybatis框架的民宿预订管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文)

    本项目是一套ssm827基于SSM框架的民宿预订管理系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse 确保可以运行! 该系统功能

    2024年01月22日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包