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

    一. 通知类型

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

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

    案例:

    (1)(2)的案例

    增强类:

    MyAdvice

    public class MyAdvice {
        public void enhance1() {
            System.out.println("======增强111=======");
        }
        
        public void enhance2() {
            System.out.println("======增强222=======");
        }
    }
    View Code

    目标类

    接口(便于扩张)

    public interface MyTarget {
        
        public void update();
    }
    View Code

    接口实现类

    public class MyTargetImpl implements MyTarget {
    
        @Override
        public void update() {
            System.out.println("=====update======");
        }
    }
    View Code

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

     测试

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

    运行结果

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

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

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

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

     application.xml

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

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

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

     

     配置

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

    增强类中

    public Object myAround(ProceedingJoinPoint pointCut) throws Throwable {
            System.out.println("=====前=====");
            Object obj = pointCut.proceed();
            System.out.println("======后======");
            return obj;
        }

    运行结果

    二. 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),可以通过方法来访问页面

    通过方法来访问

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

     五. 参数的绑定

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

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

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

    前端部分(login.html)

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>接收参数表单</h1>
    <form action="/day17/login.do" method="POST">
    Name:<input type="text" name="username"/><br/>
    <button type="submit">提交</button>
    </form>
    </body>
    </html>

    后台部分

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

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

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

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

     2. POJO

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

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

    login.html

     后台部分

     运行结果

    3. 包装类接收数据

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

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

     后台部分

     运行结果

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

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

    (2)使用filter过滤器

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

    六. 返回数据类型

    1. String

     (1)返回的是视图名称

    @RequestMapping("test1")
    public String test1() {
        return "index.html";
    }

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

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

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

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

     (3)转发

     (4)重定向

    2 . void

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

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

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

     

     3. POJO

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

    当请求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请求会报如下错误

  • 相关阅读:
    制作一个螺旋矩阵
    通过C++修改系统时间代码
    绝对值最小
    compile cmdow
    2017-10-04清北模拟赛
    2017-10-03清北模拟赛
    2017-10-01清北模拟赛
    HTML容易遗忘内容(二)
    SSM框架关于后台返回JSON数据中显示很多不需要的字段为NULL
    关于Unix时间戳转北京时间的问题
  • 原文地址:https://www.cnblogs.com/jj1106/p/11681922.html
Copyright © 2011-2022 走看看