您的位置:首页 > 编程语言 > Java开发

学习笔记struts2_day02

2017-11-06 23:08 239 查看
Struts2第二天

Action使用Servlet相关API

 (Action是对Servlet的封装,实现了与Servlet相关的API的解耦,简化开发。但有时又需要使用我们首席的Servlet API。

1.通过ActionContext类调用Servlet API

  ActionContext.getContext.get("request"):返回值是Map,需要强转,相当于一个解耦之后的HttpServletRequest

  ActionContext.getSession.getSession():返回值是Map,相当于解耦之后的HttpSession

  ActionContext. getApplication():返回值是Map,相当于解耦之后的ServletContext

  ActionContext.getParameter():返回值是Map,存储的是所有的参数信息。键是参数名,值是具体参数值,类型是数据类型

2.通过试想***Aware接口调用ServletAPI

  Action类实现RequestAware接口,框架会把HttpServletRequest对象解耦成Map,注入到Action类中

  Action类实现SessionAware接口,框架会把HttpSession对象解耦成Map,注入到Action类中

  Action类实现ApplicationAware接口,框架会把ServletContext对象解耦成Map,注入到Action类中

  Action类试想ParameterAware接口,框架会把请求中所有的参数信息封装成M安排,注入到Action类中

3.通过ServletActionContext类调用Servlet API

  ServletActionContext.getRequest():获取HttpServletRequest对象

  ServletActionContext.getResponse():获取HttpServletResponse对象

  ServletActionContex.getRequest().getSession:获取HttpSession对象

  ServletActionContex.getServletContext():获取ServletContext对象

请求参数的接收(重点)

请求参数接收的方式有三种,分为两大类:属性驱动和模型驱动。

1.属性驱动方式接收

1.1简单属性驱动方式接收

   编写登录页面(发送参数要有名字)

   在Action类中定义属性提供属性对应的setter方法

   注意

      属性的名字要与参数名一样

      属性对象的setter方法名字不能写错(属性名username==方法名setUsername)

  原理

     拦截器(params)拦截用户请求,调用Action类里属性的setter方法,把参数值设置到对应的属性里面去

  优势:当参数比较少的时候,采用这种方式接收简单

  弊端:当参数比较多的时候,Action类里定义很多个属性集stter方法,不便于向业务层传递参数,比较麻烦。

1.2对象属性驱动方式接收

   编写页面,注意:参数名:user.username(对象名.属性名)

   封装实体类User(属性名要和参数名对应,提供属性对应的set方法)

   在Action类里提供对象属性user,提供属性对象的setter方法和getter方法,注意方法的名字

  原理:

     请求被拦截器拦截,对参数名(user.username)进行截取,寻找Action里对应的属性名,调用get**方法

     获取到对象,如果对象为null,则调用实体类里的默认的构造方法实例,在调用对象属性的set**方法把对象设置

     进去,再把参数值通过对象的set**方法吧参数值设置到对象里。当第二次设置参数是,调用get**方法获取对象

     但此时对象不为null,调用对象的set方法把参数值设置到对象里。

  优势:把参数封装到Action的对象属性里,Ation类没必要提供很多的简单属性及set方法,代码量少;向业务层传递参数可以直接传递对象,方便。

 

  弊端:需要在页面中,参数名前面加上对象名,写起来有点麻烦。

2.模型驱动方式接收

   编写页面login3.jsp注意:参数名前不需要加对象名

   封装实体类,同对象属性驱动方式。

   在Action类中提供对象属性并实例化,让Action类实现ModelDriven<实体类>接口,重写getModel方法,返回对象属性。

   原理:

   拦截器拦截请求(modelDriven,params),判断该Action是否实现了ModelDriven接口,如果实现了ModelDriven接口,调用getModel方法,获取对象,把参数封装到对象的属性里去(调用对象的set***方法)。

  优势:

   当参数比较多时,会自动封装到对象属性里,传递参数也简单;

   页面上参数名字的书写简单,不需要写成“对象名.属性名”形式。

 3.多种接收方式优先级的问题

  结论:先采用模型驱动方式接收,再采用属性驱动方式接收

  原因:与值栈相关,模型对象在栈顶,在当前Action的实例前,注入参数时,优先找到的是模型对象。

4.封装集合数据

4.1封装到List

4.2封装到Map

result结果集的配置

1.<result>标签

作用:配置结果集,指定跳转到那个页面

name属性:结果集的名字,与Action方法的返回值对应,一个Action节点可以对应多个结果集

2.全局结果集和局部结果集

Struts结果集按照作用范围不用,分为两种:局部结果集和全局结果集

局部结果集:只针对某个Action有效

全局结果集:针对某个包个所有的action都有效

3.结果集类型

在struts2-core.jar包中的sturts-default文件中,可以查看Struts2所有的结果集类型

常用的结果集类型有:

  dispatcher:转发到一个页面,地址栏不会发生变化。result节点属性的默认值就是dispatcher。

  redirect:重定向到一个页面,地址栏发生变化。

  chain:转发到另一个action,地址栏不会发生变化,数据不会丢失。

  redirectAction:重定向到另一个action,地址栏会发生变化,请求中的数据也会丢失

  stream:以流的形式响应一个请求,文件下载是会用到。 

  在struts2.xml中,通过result节点的type属性来指定跳转类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: