addAttributie和RedirectAttributes

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了addAttributie和RedirectAttributes相关的知识,希望对你有一定的参考价值。

参考技术A 1 .redirectAttributes.addAttributie("prama",value); 

addAttribute() essentially constructs  request parameters  out of your attributes and redirects to the desired page with the request parameters

这种方法相当于在重定向链接地址追加传递的参数

redirectAttributes.addAttributie("prama1",value1); 

redirectAttributes.addAttributie("prama2",value2);

 return:"redirect:/path/list"

以上重定向的方法等同于 return:"redirect:/path/list?prama1=value1&prama2=value2 " ,注意这种方法直接 将传递的参数暴露在链接地址上 ,非常的不安全,慎用。

2 .redirectAttributes.addFlashAttributie("prama",value); 

添加的属性放入flashmap中,session来维护这个flashmap

addFlashAttribute() actually stores the attributes in a  flashmap  (which is internally maintained in the users session and removed once the next redirected request gets fulfilled)

So the advantage of addFlashAttribute() will be that you can store pretty much any object in your  flash attribute  ( as it is not serialized into request params at all, but maintained as an object), whereas with addAttribute() since the object that you add gets transformed to a normal request param, you are pretty limited to the object types like String or primitives.

这种方法是隐藏了参数,链接地址上不直接暴露

flashmap是放到session中,重定向后再从session中移除,在重定向的页面是用 $prama 取数据的。如果是 重定向一个controller中是获取不到该prama属性值的。

        在重定向到的controller(action)怎么获取呢?

法1.利用Spring提供的标签@ModelAttribute("parma")

    public String test2(@ModelAttribute("parma") String str)

          System.out.println(str);    return "/test/hello";     

法2. :利用httpServletRequest

public String test2(HttpServletRequest request)



Map<String,?> map = RequestContextUtils.getInputFlashMap(request);

System.out.println(map.get("test").toString());

    return "/test/hello";

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

一、代码块

      在Java中,使用括起来的代码被称为代码块。根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块。

  • 局部代码块
    • 在方法中出现;限定变量生命周期,及早释放,提高内存利用率
  • 构造代码块 (初始化块)

    • 在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
  • 静态代码块

    • 在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。
    • 一般用于加载驱动

代码块的面试题
看程序写结果

class Student 
            static 
                System.out.println("Student 静态代码块");
            

            
                System.out.println("Student 构造代码块");
            

            public Student() 
                System.out.println("Student 构造方法");
            
        

        class Demo2_Student 
            static 
                System.out.println("Demo2_Student静态代码块");
            

            public static void main(String[] args) 
                System.out.println("我是main方法");

                Student s1 = new Student();
                Student s2 = new Student();
            
        

二、继承

      让类与类之间产生关系,子父类关系。

1.继承的好处

  • 提高了代码的复用性
  • 提高了代码的维护性
  • 让类与类之间产生了关系,是多态的前提

2.继承的弊端

  • 类的耦合性增强了。

开发的原则:高内聚,低耦合。
耦合:类与类的关系
内聚:就是自己完成某件事情的能力

3.继承的特点

  • Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)
    • 有些语言是支持多继承,格式:extends 类1,类2,…
  • Java支持多层继承(继承体系)

4.继承的注意事项和什么时候使用继承

  • 继承的注意事项
    • 子类只能继承父类所有非私有的成员(成员方法和成员变量)
    • 子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
    • 不要为了部分功能而去继承,比如不能让经理继承程序员
  • 什么时候使用继承
    • 继承其实体现的是一种关系:”is a”。

三、this和super

this:代表当前对象的引用,谁来调用我,我就代表谁
super:代表当前对象父类的引用

1.this和super的使用区别

  • 调用成员变量
    • this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
    • super.成员变量 调用父类的成员变量
  • 调用构造方法
    • this(…) 调用本类的构造方法
    • super(…) 调用父类的构造方法
  • 调用成员方法
    • this.成员方法 调用本类的成员方法,也可以调用父类的方法
    • super.成员方法 调用父类的成员方法

四、继承中构造方法的关系

      子类中所有的构造方法默认都会访问父类中空参数的构造方法
      因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。

每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。

      父类没有无参构造方法,子类可以用super或this解决。

继承中的面试题

 看程序写结果1
        class Fu
            public int num = 10;
            public Fu()
                System.out.println("fu");
            
        
        class Zi extends Fu
            public int num = 20;
            public Zi()
                System.out.println("zi");
            
            public void show()
                int num = 30;
                System.out.println(num);
                System.out.println(this.num);
                System.out.println(super.num);
            
        
        class Test1_Extends 
            public static void main(String[] args) 
                Zi z = new Zi();
                z.show();
            
        

        看程序写结果2
        class Fu 
            static 
                System.out.println("静态代码块Fu");
            

            
                System.out.println("构造代码块Fu");
            

            public Fu() 
                System.out.println("构造方法Fu");
            
        

        class Zi extends Fu 
            static 
                System.out.println("静态代码块Zi");
            

            
                System.out.println("构造代码块Zi");
            

            public Zi() 
                System.out.println("构造方法Zi");
            
        

        Zi z = new Zi(); 请执行结果。

五、重写和重载

重写:子父类出现了一模一样的方法(注意:返回值类型可以是子父类。

1.注意事项

  • 父类中私有方法不能被重写,因为父类私有方法子类根本就无法继承。
  • 子类重写父类方法时,访问权限不能更低,最好就一致。
  • 父类静态方法,子类也必须通过静态方法进行重写,其实这个算不上方法重写,但是现象确实如此

  • 子类重写父类方法的时候,最好声明一模一样。

面试题
方法重写的面试题

1.Override和Overload的区别?Overload能改变返回值类型吗?

  • overload可以改变返回值类型,只看参数列表
  • 方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的
  • 方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。

  • 子类对象调用方法的时候: 先找子类本身,再找父类。

六、final

1.final修饰特点

  • 修饰类,类不能被继承
  • 修饰变量,变量就变成了常量,只能被赋值一次
  • 修饰方法,方法不能被重写

2.final修饰局部变量

  • 基本类型,是值不能被改变
  • 引用类型,是地址值不能被改变,对象中的属性可以改变

3.final修饰变量的初始化时机

  • 显示初始化
public static final double PI = 3.14;
  • 在对象构造完毕前即可
class GeekDS 
    final double PI;
    public GeekDS() 
        PI = 3.1415926;
    

以上是关于addAttributie和RedirectAttributes的主要内容,如果未能解决你的问题,请参考以下文章

关于重定向RedirectAttributes的用法(转)

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final