SpringMVC和Spring

news2024/9/22 1:08:21

1.AOP

1.基础内容

AOP是面向切面的的编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。

面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术(增强代码),AOP是靠动态代理实现的,

AOP一共有七个术语

1.连接点:每一个方法就是一个连接点

2.切点:要加强代码的方法就是切点

3.通知:要加强的代码内容

4.目标:代理的目标对象

5.植(织)入:把增强代码应用到目标上,生成目标对象

6.切面:切点加上通知就是切面

7.代理:生成的代理对象

通知分类

分别在不同时机调用不同的通知类型

前置通知:@Before

后置通知:@After

返回后通知:@After-Returning

抛出异常通知:@After-throwing

环绕通知:@Around

2.AOP实现

AOP实现要定义切点和,通知类型

3.静态代理和动态代理

静态代理:

public class EasyA implements Shopping{ public void shopping(){
        System.out.println("EasyA");
    }
}

public class Factory {

    public static Shopping getshopping(){
        EasyA easyA=new EasyA();
        Shopping s=new Proxy(easyA);
        Shopping s1=new Proxy(easyA);
        return s;
    }

    public static void main(String[] args) {
        Shopping shopping=getshopping();
        shopping.shopping();
    }
}
public class Proxy implements Shopping{
    Shopping shop;
    public Proxy(Shopping s){
        this.shop=s;
    }
    public void shopping() {
        System.out.println("---------一支穿云箭");
        shop.shopping();
        System.out.println("---------千军万马来相见");
    }
}
     public interface Shopping {
     void shopping();
}

动态代理:

public class EacyInvokinonHandler implements InvocationHandler {
    private  Object proxyedobj;//被代理对象
    public EacyInvokinonHandler(Object proxyedobj){
        this.proxyedobj=proxyedobj;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result=null;//定义方法的返回对象
        //开始正常执行业务逻辑
        System.out.println("--------执行方法之前添加的业务");
       result= method.invoke(proxyedobj,args);
        System.out.println("-------执行方法之后的处理------");
        return result;
    }
}
public interface EasyInterface {
    void easy();
}
 public class EasyObj implements EasyInterface{

    public void easy() {
        System.out.println("------正常业务逻辑");
    }
}
public class Factory {
    public static Object getProxy(Object object){
        //jdk的代理只能实现接口中的方法
       return    Proxy.newProxyInstance(object.getClass().getClassLoader()//类加载器

                ,object.getClass().getInterfaces(),//实现的接口
                new EacyInvokinonHandler(object));//被代理的对象
    }

    public static void main(String[] args) {
        EasyObj easy=new EasyObj();
        Object object=getProxy(easy);//动态生成的代理类的对象
        if (object instanceof EasyInterface){
            System.out.println("obj是代理对象,是EasyInterface的实例");
            EasyInterface easyInterface=(EasyInterface) object;
            easyInterface.easy();
        }
        Class s=object.getClass();
        System.out.println(s);


        EasyA easyA=new EasyA();
        Object obj=getProxy(easyA);
        Shopping s1=(Shopping)obj;
        s1.shopping();
        System.out.println(obj.getClass());
    }
}

2.SpringMVC

1.注解

@Controller:

这个注解会优先将返回的字符串解析成地址,然后跳转到这个地址,如果不想让它解析成地址可以使用@ResponseBody注解,这样就可以返回要返回的

@RestController

这个注解就是类似于加了@ResponseBody的@Controller

@RequestMapping

前端控制器,来浏览器输入这个括号内的字符串地址就会访问到这个方法

@PathVariable   

从路径上获取参数,在浏览器输入本机/端口号/地址之后?参数=--

@requestparam  

  接收参数的时候使用

@Get/Post/Put/DeleteMapping

请求资源状态转换

2.接收前端参数

1.接受一个参数

在前端浏览器?name=张三就可以传递参数

方法只能接受名字叫name的参数
    @RequestMapping("parama")
    public String getparamA(String name){
        return "Springmvc接收到的参数是:"+name;
    }

2.接收多个参数

1.map 接受非常灵活(不太严谨)

@RequestParam可以将请求参数注入到对象上

如果不加这个注解,Map就只会是一个Moudle容器

使用这个之后即使不想接受这个参数也必须接受

@RequestMapping("paramb")
    public Map getparamB(@RequestParam Map param){
        return param;
    }
2.使用封装对象接收参数    程序中只接受所需要的数据(严谨)

只会接受想要的参数,如果注入参数会是默认值

 @RequestMapping("paramc")
    public Staff paramc(Staff staff){

        return staff;
    }

Staff类中有name,id,salary,所以只会接受这些参数




@RequestMapping("paramd/{id}")
    public String paramd(@PathVariable Integer id, HttpServletRequest request){
        String username=request.getParameter("username");//得到一个username的参数
        return "参数是"+id+"-------"+username;
    }

3.请求资源状态转换

REST   请求状态转换
//get  post  put  delete
//get      user/1        获取         user/get
//post     user...       新增         user/add
//delete   user/1        删除         user/del?id=1
//put      user....      编辑         user/edit

4.拦截器

1.当请求的路径与拦截器拦截的路径相匹配时,程序会先执行拦截器类(MyInterceptor)的 preHandle() 方法。若该方法返回值为 true,则继续向下执行 Controller(控制器)中的方法,否则将不再向下执行;

2.控制器方法对请求进行处理;

3.调用拦截器的 postHandle() 方法,此时我们可以对请求域中的模型(Model)数据和视图做出进一步的修改;通过 DispatcherServlet 的 render() 方法对视图进行渲染;

4.调用拦截器的 afterCompletion () 方法,完成资源清理、日志记录等工作。

多个拦截器的执行流程

@Component
public class EasyInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("-----preHandle");

        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("-----postHandle");

    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("-----afterCompletion----------处理完毕");

    }
}



@Component
@Configuration
public class INterceptorConfig implements WebMvcConfigurer {
    @Autowired
    EasyInterceptor easyInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(easyInterceptor).addPathPatterns("/methodc");
    }

}

5.SpringMVC运行原理

这个需要背过

6. springmvc异常处理机制

@ExceptionHandler 注解(局部处理)表示在这个类中如果出现了指定的异常就会执行这个方法

@ControllerAdvice全局处理,项目内出现一场都会执行这个方法,全局处理里面可以有局部处理

    @GetMapping("ex")
    public CommonResult ex(){
        int i=12/0;
        return CommonResult.success();
    }
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public CommonResult exh(){
        return CommonResult.success(200,"糟糕,页面走丢了!!!!",null);
    }

 7.作用域对象

HttpServletRequest    HttpServletSession   (servletContext)application

8.请求转发和重定向

请求转发,重定向
//转发:同一个服务器中,不同的服务进行转发,浏览器发送了一个请求,可以转发到项目中受保护的资源(WEB-INF),转发是request对象执行forward方法去转发
//重定向:可以在不同服务之间进行跳转(浏览器发送两次请求),重定向是通过response对象通知浏览器,重新访问(redirect方法)
//Spring默认是转发形式

请求转发是发送一次请求所以在浏览器上面路径还是现实method

重定向会跳转到baidu地址上

@RequestMapping("methoda")
    public String methoda() {
        System.out.println("methoda");
        return "forward:http://www.baidu.com";
    }


@RequestMapping("methoda")
    public String methoda() {
        System.out.println("methoda");
        return "redirect:http://www.baidu.com";
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开源项目】基于RTP协议的H264播放器

基于RTP协议的H264播放器 1. 概述2.工程3.测试4.小结 1. 概述 前面记录了一篇基于RTP协议的H264的推流器、接收器的实现过程,但是没有加上解码播放,这里记录一下如何实现解码和播放,也是在前面的基础之上实现的。前一篇的记录为【开源项目】…

完成QT上位机(八)

一. 正式开始设计界面 这一章节我们将完成QT上位机的设计,如果有同学对QtCreater的使用不太熟悉的,可以参考下面的链接 Qt 快速入门系列教程 Qt 快速入门系列教程 (gitbooks.io)https://wizardforcel.gitbooks.io/qt-beginning/content/ 二. 数据库处…

从零开始的MicroPython(五)PWM

上一篇:串口 文章目录 定义ESP32代码 定义 要理解一个定义,就要引申一个已经掌握的概念,PWM是什么?我们或许可以用“周期”的概念来理解。 高电平出现的占比是占空比。 PWM(脉冲宽度调制)是一种调节信号…

022.(附加)chromedriver编译-绕过selenium机器人检测

有小伙伴说使用selenium没能绕过机器人检测,盘他。 一、selenium简介 Selenium 是一个强大的工具,用于Web浏览器自动化,更常被用于爬虫但selenium需要通过webdriver来驱动chrome,每次运行selenium时,都要先找到对应版…

VMware Workstation17 安装 Ubuntu 操作系统

今天给伙伴们分享一下VMware Workstation17 安装 Ubuntu 操作系统 ,希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维…

企业邮箱有哪些便捷功能

企业邮箱有哪些便捷功能?一、消息流实现社交式互动;二、邮件委托轻松分担工作;三、音视频通话即时沟通;四、邮件定时发送与提醒确保重要信息不遗漏;五、邮件召回与延迟发送提供反悔机会;六、离线阅读邮件实现无缝工作…

QtQuick Text-对齐方式

属性 Text项目 的horizontalAlignment和verticalAlignment分别用来设置文本在 Text项目区域中的水平、垂直对齐方式。 默认文本在左上方。 属性值有: horizontalAlignment Text.AlignLeftText.AlignRightText.AlignHCenterText.Justify verticalAlignment Text.…

(纯分享01)初学AI,怎样才算是有效提示问题呢?

前言 你有没有想过,为什么有些人似乎能从 AI 工具中获得惊人的效果,而其他人却举步维艰?好用的永远在别人那,而自己的人工智能AI怎么这么像"人工智障"呢?有没有经常被气到呢哈哈哈哈? 问题的答…

Python IDLE修改JetBrains Mono字体教程

自己在使用Python IDLE过程中发现原生字体不好看,不美观。尤其是对于部分字符,l打印不美观,区别不明显。于是诞生了换字体的想法。 教程简单,快速,3-5分钟不到即可完成。 目录 选型 下载安装 使用 选型 考虑到代码…

网络空间资产测绘:为安全防护“画出”实时“地图”

网络空间已成为继海、陆、空、天之后的“第五疆域”,对其空间布局进行摸排并形成“地图”,是维护网络空间安全的基础性工作。近日在2024全球数字经济大会上发布的DayDayMap全球网络空间资产测绘平台,能为用户提供全面、精准、实时的全球网络空…

Go语言中获取tls中的KeyLogFile,用于dubug

文章目录 获取KeyLogFile示例代码:1. client2. client3. 效果 获取KeyLogFile tls.config自带了接口,所以配置的时候只需要打开就行,以客户端为例 keylogfile 是一个 io.Writer 开了这个就自动使用了 keyLogFile, _ : os.OpenFile(keyLogFi…

C#开发编程软件下载安装

1、Visual Studio 2022社区版下载 2、开始安装 3、安装进行中 。。。。

基于edge和bwmorph函数的两种图像边缘检测方法及应用

边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。本文给出edge和bwmorph两个函数进行边缘检测的基本用法,并给出一个应用示例。 一、edge和bwmorph函数简介 edge和bwmorph是MATLAB中用于图像处理边缘检测…

Datawhale AI 夏令营(2024第三期)AI+逻辑推理方向 模型微调学习笔记

如何基于开源大模型进行优化 1. Prompt工程 大模型可能知道问题相关,但是我们问的不清楚。所以需要根据我们的提问,构建出一个比较结构化的、大模型易于理解和分析的提问内容。 在下方的第二个资料里,我才知道有这么多Prompt的构建思路&…

认真学习JVM中类加载过程

本文我们总结JVM中类加载器子系统关于类加载过程,这里默认是Oracle的Hotspot。 【1】类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载&#xff0…

软件测试——测试分类(超超超齐全版)

为什么要对软件测试进行分类 软件测试是软件⽣命周期中的⼀个重要环节,具有较⾼的复杂性,对于软件测试,可以从不同的⻆度加以分类,使开发者在软件开发过程中的不同层次、不同阶段对测试⼯作进⾏更好的执⾏和管理测试的分类⽅法。…

见证中国数据库的崛起:从追赶到引领的壮丽征程《一》

见证中国数据库的崛起:从追赶到引领的壮丽征程《一》 一、追溯历史:中国数据库发展的艰难起步萌芽阶段(20世纪70年代末-80年代初)起步阶段(20世纪80年代中期-90年代初)发展阶段(20世纪90年代中期…

实验2-1-7 输出倒三角图案

本题要求编写程序&#xff0c;输出指定的由“*”组成的倒三角图案。 输出格式: * * * ** * ** **程序&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {for (int i 0; i < 4; i) {for (int k 0; k < i; k) {printf(" &qu…

YOLO:目标检测模型的训练和推理(简单Demo)

作者&#xff1a;CSDN _养乐多_ 本文将介绍如何训练和推理YOLO模型。使用coco8数据集以一个简单的demo进行示例。 文章目录 一、准备1.1 模型类型1.2 环境配置 二、模型训练和推理三、讨论 一、准备 1.1 模型类型 YOLO8模型性能数据&#xff1a; ModelSize (pixels)mAPval…

ICC2:分段长tree简易版教程

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 分段长tree让一部分sink balance的更好,有助于时序收敛,但ICC2的分段长tree需要单独写一个sdc去做sub tree再换回原始sdc去长tree,流程繁琐,我整理了一个简单的流程,不需要额外的sdc,唯一的缺…