一. 通知类型

spring aop通知(advice)分成五类:

(1)前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。 
(2)正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。 =====>也叫最终通知

案例:

(1)(2)的案例

增强类:

MyAdvice

  1. public class MyAdvice {
  2. public void enhance1() {
  3. System.out.println("======增强111=======");
  4. }
  5.  
  6. public void enhance2() {
  7. System.out.println("======增强222=======");
  8. }
  9. }

目标类

接口(便于扩张)

  1. public interface MyTarget {
  2.  
  3. public void update();
  4. }

接口实现类

  1. public class MyTargetImpl implements MyTarget {
  2.  
  3. @Override
  4. public void update() {
  5. System.out.println("=====update======");
  6. }
  7. }

配置文件(一般是application.xml)

测试

  1. public class MyTest {
  2. public static void main(String[] args) {
  3. // 创建一个容器对象
  4. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("com/_51doit/AOP2/application.xml");
  5. MyTarget target = (MyTarget)context.getBean("myTargetImpl");
  6. target.update();
  7. }
  8. }

运行结果

(3)异常返回通知[After throwing advice]:在连接点抛出异常后执行。

(4)返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。 ====>也叫后置通知

将实现类中写入一个异常,并该下application 如下

接口实现类(写入一个异常)

application.xml

运行结果(其他代码与前面一致)

可见,即使出现异常,此类通知的内容还会被执行

(5)环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

配置

  1. <aop:around method="myAround" pointcut-ref="pointcut"/>

增强类中

  1. public Object myAround(ProceedingJoinPoint pointCut) throws Throwable {
  2. System.out.println("=====前=====");
  3. Object obj = pointCut.proceed();
  4. System.out.println("======后======");
  5. return obj;
  6. }

运行结果

二. Springmvc

1.概述  

  Springmvc就是spring框架的一个子模块,它的全名叫spring web mvc,它是一个基于mvc的前端web框架。它的主要作用就是对前端请求进行处理。

  模型  M封装了应用程序数据,并且通常它们由 POJO 组成。

  视图   (V)  主要用于呈现模型数据,通常它生成客户端的浏览器可以解释的 HTML 输出。

  控制器 (C)  主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现。

2 执行流程

简单流程

修改版

复杂版

(1). 前端控制器(不需要开发,只需配置

  作用:接收前台页面的请求,并响应结果到前台页面。中间做请求转发,相当于中央处理器

(2). 处理器映射器(不需要开发,只需配置)

  作用:根据请求的URL查找处理器

(3). 处理器适配器(不需要开发,只需配置)

  作用:执行符合特定规则(HandlerAdapter要求的规则)的处理器

(4). 处理器(后端控制器:程序员开发)

  注意:编写Handler时要符合HandlerAdapter的规则,否则处理器适配器无法正确执行

(5). 视图解析器(不需要开发,只需配置)

  作用:进行视图解析,根据逻辑视图名解析成真正的视图

(6). 视图(程序员开发)

  VIew是一个接口,实现类支持不同的view类型(jsp、freemarker、pdf等)

三 springmvc入门程序

1. 步骤:

(1)创建web项目,导入jar包

(2)配置(web.xml)

springmvc.xml:  将一些对象(处理器适配器,处理器映射器,处理器(自己写的类),视图解析器)交给spring容器管理

(3)启动项目

前端控制器(即是一个servlet),当启动项目加载web.xml文件时就会创建前端控制器(即加载servlet,Servlet继而回去加载springmvc》xml),而以前(单独使用tomcat)是在发送请求时,才会加载servlet(前端控制器)

(4)类(处理器)    加载@Controller

案例

(1). 发送请求(localhost:8080/day17/index.do)至前端控制器

web.xml文件:

springmvc.xml文件:

classpath知识点: https://blog.csdn.net/pengmm1990/article/details/68951389

此处指定springmvc配置文件的路径容易出错(下图截取至stackover):

注意:此处若不指定路径的话,就得在web-inf下创建相应的xml文件(servlet名字-servlet.xml,如此处就应该在web-inf下创建springmvc-servlet.xml)

(2). 控制器

在容器中   要加上@controller(用来注解这个bean是MVC模型中的一个C 会被spring的auto-scan扫到并纳入管理)

@RequestMapping(“index.do”)方法(将index.do与对应的方法进行映射)

运行结果

总结:

(1)项目部署在tomcat中,启动tomcat,tomcat加载web.xml文件

(2)web.xml文件 配置前端控制器,自动创建实例对象(<load-on-startup>2</load-on-startup>)

(3)在创建前端控制器的时候,加载了springmvc.xml

不指定路径也可,如上面所说

(4)springmvc文件相当于springmvc的容器,配置的处理器就加载到容器中

(5)springmvc.xml容器中自带的处理器适配器,处理器映射器,视图解析器也被加载

(6)处理器方法上有个@RequestMapping(“url”)注解

(7)处理器映射器根据处理器的注解和方法名做出映射

四  访问保护资源

web-inf文件夹下面的资源是受保护的,不允许直接访问(404),可以通过方法来访问页面

通过方法来访问

  1. @RequestMapping("showLogin.do")
  2. public String showLogin() {
  3. return "WEB-INF/page/login.html";
  4. }

 五. 参数的绑定

  参数绑定:后台控制器的方法接收前台的请求数据,springmvc是通过方法的参数来接收页面的请求数据的

1.简单类型的参数绑定:  

页面name属性的值和后台方法的参数名一致,会自动绑定

前端部分(login.html)

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Insert title here</title>
  6. </head>
  7. <body>
  8. <h1>接收参数表单</h1>
  9. <form action="/day17/login.do" method="POST">
  10. Name:<input type="text" name="username"/><br/>
  11. <button type="submit">提交</button>
  12. </form>
  13. </body>
  14. </html>

后台部分

  1. @RequestMapping("login.do")
  2. public String login(String username) {
  3. System.out.println(username);
  4. return "index.html";
  5. }

运行结果显示可以接收到前端的username参数

若想要方法中的参数名和前台传送的参数名不一致,同时还要进行参数的接收,该怎么办?

解决:@RequestParam("name")  指定传输的数据由后台的那个参数接收

 2. POJO

接收前台页面的多个参数的时候,在方法的参数里面添加多个形参会很麻烦,解决办法=====>使用对象接收页面的请求数据

要求: pojo类的属性名和页面的name的值保持一致,会自动接收

login.html

后台部分

运行结果

3. 包装类接收数据

接收的数据比较复杂的时候,使用包装类接收页面的请求

前端部分(注意:包装类中的属性不能直接写,如下):

后台部分

运行结果

若前端传送的参数是中文,则会出现乱码情况,解决方法有两种:

(1)在各个方法中添加request参数,然后用request对象去set编码集,这种方法不推荐,因为若方法很多的话,每个方法都要进行此操作会很麻烦

(2)使用filter过滤器

  在web.xml中进行配置,如下

六. 返回数据类型

1. String

(1)返回的是视图名称

  1. @RequestMapping("test1")
  2. public String test1() {
  3. return "index.html";
  4. }

返回的“index.html”在前端显示的过程

(2)返回字符串(不让它返回视图)

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML

  数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

(3)转发

(4)重定向

2 . void

方法没有返回,默认找url名称资源

  1. @RequestMapping("test3")
  2. public void test3() {
  3. System.out.println("热河");
  4. }

这样请求http://localhost:8080/day17/test3.do会报404错误,但是控制台会打印出“热河”

 3. POJO

  1.    @RequestMapping("test4")
  2. @ResponseBody
  3. public User test4() {
  4. //此处正常是从数据库中获取,但为了演示方便就直接new了个对象
  5. User user = new User();
  6. user.setPassword("1");
  7. user.setUsername("李志");
  8. return user;
  9. }

当请求http://localhost:8080/day17/test4.do时会产生如下错误

原因:这个错误是后端数据发送给了前端,但是前端处理不了此数据(user)======>解决办法:在springmvc.xml中配置组件

再次请求同样的url,得到的结果如下:

 4. 视图和数据

(1)返回ModelAndView

(2)返回String(Model/Map)

七.  三大组件

处理器适配器、处理器映射器和视图解析器

八  注解

@RequestMapping("/page")

(1)加载方法上:路径和方法进行映射

(2)加载类上:路由的功能,窄化请求(当有多个类有同样的方法时,请求url时就会出现错误,这个时候使用这个对不同类中的相同方法设置不同的url)

  @RequestMapping(value="test8" , method=RequestMethod.post):只能接收post请求

若get请求会报如下错误

零基础学习java------38---------spring中关于通知类型的补充,springmvc,springmvc入门程序,访问保护资源,参数的绑定(简单数据类型,POJO,包装类),返回数据类型,三大组件,注解的更多相关文章

  1. 总结了零基础学习Java编程语言的几个基础知识要点

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这 ...

  2. 音乐出身的妹纸,零基础学习JAVA靠谱么

    问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...

  3. 零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构

    http://www.cnblogs.com/tanlon/p/3879081.html 在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVF ...

  4. [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构

    在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVFormatContext  AVFormatContext是一个贯穿始终的数据结构,很多函 ...

  5. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  6. salesforce零基础学习(一百一十三)Trigger中获取IP地址的过程

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.228.0.apexcode.meta/apexcode/apex_class_Auth ...

  7. Android零基础入门第38节:初识Adapter

    原文:Android零基础入门第38节:初识Adapter 在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter. 一.了解MVC模式 在开始 ...

  8. 【零基础学习iOS开发】【转载】

    原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...

  9. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

随机推荐

  1. binary-tree-postorder-traversal leetcode C++

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  2. linux 内核源代码情景分析——linux 内核源代码中的C语言代码

    linux 内核的主体是以GNU的C语言编写的,GNU为此提供了编译工具gcc.GNU对C语言本身作了不少扩充. 1) gcc 从 C++ 语言中吸收了"inline"和" ...

  3. Treevalue(0x02)——函数树化详细解析(上篇)

    本文将对 func_treelize 这一treevalue库中的核心功能进行详细的原理解析. 关于treevalue的概述,可以参考之前的文章:Treevalue(0x01)--功能概述 树化函数基 ...

  4. Java操作MongoDB之mongodb-driver(一)

    1. mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动. (1)通过maven仓库导入:https://mvnrepository.com/ar ...

  5. Typora图片自动上传至码云

    Typora图片自动上传至码云 下载PicGo图片上传工具 PicGo下载地址 下载完毕后打开PicGo,点击插件设置,搜索Gitee,点击安装gitee 2.0.3 码云仓库创建 创建参数是点击设置 ...

  6. Python 爬取 书籍

    ... import requests from bs4 import BeautifulSoup def gethtml(url,h): r = requests.get(url,headers=h ...

  7. Salesforce Consumer Goods Cloud 浅谈篇三之 行动计划(Action Plan)相关配置

    本篇参考: https://v.qq.com/x/page/f0772toebhd.html https://v.qq.com/x/page/e0772tsmtek.html https://v.qq ...

  8. [bzoj5025]单调上升路径

    由于题目的证明可以发现$ans\ge 2m/n \ge n-1$,于是大胆猜测答案就是n-1若n是奇数,则将边分为n组,每组(n-1)/2,如果同组内边没有交点,那么只需要每一组边一个权值区间,从每一 ...

  9. [atARC075F]Mirrored

    假设$n=\sum_{i=0}^{k}a_{i}10^{i}$(其中$a_{k}>0$),则有$d=f(n)-n=\sum_{i=0}^{k}(10^{k-i}-10^{i})a_{i}$,考虑 ...

  10. 跟着老猫来搞GO-内建容器Map

    前期回顾 在上面的文章中,老猫和大家分享了GO语言中比较重要的两种数据结构,一种是数组,另外一种是基于数组的slice.本篇文章想要继续和大家分享剩下的容器以及字符字符串的处理. MAP map的定义 ...