学习笔记struts2_day02

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属性来指定跳转类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Struts 中,处理异常有两种方式:编程式异常处理和声明式异常处理。本篇笔记将讲解声明式异常处理。 声明式异常处理是指在 struts.xml 文件中通过配置来处理异常。这种方式可以让开发人员将重心放在业务逻辑的处理上,而不必关心异常的处理。 首先,我们需要在 struts.xml 文件中配置全局的异常处理器: ```xml <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="errorPage"/> </global-exception-mappings> ``` 这里我们配置了一个全局的异常处理器,它会处理所有的 java.lang.Exception 异常,并将结果返回到为 errorPage 的 result 中。 接下来,我们需要在 action 中声明需要处理的异常: ```xml <action name="test" class="com.example.TestAction"> <exception-mapping exception="java.lang.IllegalArgumentException" result="illegalArgument"/> <result name="success">/test.jsp</result> </action> ``` 在这个例子中,我们声明了 TestAction 类中处理 java.lang.IllegalArgumentException 异常,并将结果返回到为 illegalArgument 的 result 中。 最后,我们需要在 struts.xml 文件中定义这些 result: ```xml <result name="errorPage">/error.jsp</result> <result name="illegalArgument">/illegalArgument.jsp</result> ``` 这样,当 TestAction 类中抛出 java.lang.IllegalArgumentException 异常,就会返回到为 illegalArgument 的 result 中。 总之,声明式异常处理可以让我们更加专注于业务逻辑的处理,通过配置来处理异常,从而提高代码的可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值