Struts2数据封装、拦截器、标签基础



Struts2执行过程:



Struts2每次访问action时默认执行execute方法。

struts2配置标签:

package    区别不同的action。        

                name:唯一标识的包名。

                extends:继承其他包,可以直接使用继承包的资源。

                abstract:(ture/false) 包是否为抽象包,抽象包不能写入action标签。

                namespace:命名空间,默认值为“/”,如果改为“/a”,则jsp跳转action名需要改为“/a/action_name”。

action        控制跳转。

                name:请求地址名,不同命名空间可以重复name名,相同命名空间下不能重复。

                class:action对应的实现类路径。

                method:对应实现类中具体执行哪个方法。默认值为execute。

result        同时配置全局和局部result,最终结果以局部result为准。

                name:方法返回值

                type:配置如何到路径中(转发或者重定向),默认转发操作。

                            redirectAction 重定向到action,一个方法跳(重定向)到另一个action方法。

                            chain              链,一个方法跳(转发)到另一个action方法。

global-results    全局的结果返回,在package里,action外。所有的action都共用的一套result。

                  

constant    常量配置 name-value形式。 

                

分模块开发:

可以引入单独配置Struts的xml文件

<include file="xx.xx.xx"></include>     值为配置文件路径。


实现action的三种编写方式:

①普通类,不继承,不实现

②实现action接口,接口中有方法和常量可以直接使用 

③创建继承类,继承方法ActionSupport(建议使用)该继承方法也实现action接口


访问action的方法:

①用method属性实现,值为action的方法名(适用于方法较少的action) 

②使用通配符(常用)

name属性里的 * 星号。

*表示匹配任意内容 


method值表示取第一个*星号的值。 (固定的表达式结构{x})。  

result标签不用通配符。

③动态访问(不常用)


action里的方法返回值类型必须是String类型,若没有返回值(返回值为“none”),result标签不需要配置。


四大作用域:    操作域对象

request(常用):

 
 
  1.        HttpServletRequest request = ServletActionContext.getRequest();
  2.        request.setAttribute("name",”value");

response:

 
 
  1.        HttpServletResponse response = ServletActionContext.getResponse();

session:

 
 
  1.        HttpSession session = request.getSession();

application:

 
 
  1.        ServletContext application = ServletActionContext.getServletContext();

Struts实现拦截器:     implements Interceptor 继承自xwork2。

映射拦截器,arg.invoke();

Struts.xml配置文件中声明拦截器:

interceptors拦截器标签在package里,action外.    可定义多个拦截器

    Interceptor单个拦截器   name属性(拦截器名称)  class属性(拦截器路径)

action方法映射拦截器:

action标签内<interceptor-ref name="声明的拦截器名称"></nterceptor-ref>

配置自定义拦截器后,默认拦截器会失效,需在拦截器后加入<interceptor-ref name="basicStack"></nterceptor-ref>里面有exception等拦截。

配置全局的一个package里所有action使用相同的拦截器:

<default-interceptor-ref    name="声明的拦截器名称"></default-interceptor-ref>

配置action里面某些方法不进行拦截: 

在<interceptor-ref></interceptor-ref>标签内加个param标签,name属性值:excludeMethods,值为action不拦截的方法名称如login方法。 多个方法的话用逗号隔开。

  
  
  1. <interceptor-ref>
  2.    <param name="excludeMethods">login</param>
  3. </interceptor-ref>

拦截器底层原理:

第一种 aop原理 面向切面的横向编程 不修改源代码,添加扩展功能

第二种 责任链模式     属于java设计模式的一种,类似于过滤链——一个请求可有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器

执行默认器的过程使用aop思想,用配置文件的方式进行操作不修改源代码,执行很多拦截器时会使用责任链模式   


过滤器和拦截器的区别:

过滤器:理论上可以过滤任意内容,比如html,jsp,servlet,图片路径

拦截器:只可以拦截action



Action中获取表单数据:

①使用ActionContext类获取

完全解耦合的一种方法  

 
 
  1.    //1.获取ActionContext对象
  2.    ActionContext  context = ActionContext.getContext();
  3.    //2.调用方法得到表单数据
  4.    //key是表单输入项name属性值,value是输入的值
  5.    Map<String,Object>  map = context.getParameters();
  6.    Set<String> keys = map.keySet();
  7.    for(String key:keys){
  8.            //根据key得到value    obj就是value值
  9.            //数组形式,因为输入项中有可能有复选框情况
  10.            Object[] obj = (Object[]) map.get(key);
  11.    }

②使用ServletActionContext类获取request对象 (常用)

包含很多静态方法

 
 
  1.    //1.使用ServletActionContext获取request对象
  2.    HttpServletRequest request = ServletActionContext.getRequest();
  3.    //2.调用request里面的方法得到结果
  4.    String name = request.getParameter("name名");

③实现接口注入方式,获取request对象


Struts2封装数据到实体类对象:

原始方式繁琐不适合过多对象(但是功能有效)⬇️


①属性封装

    在action中声明变量和生成对应的set和get方法,在action的方法中就可以直接获取属性的值。

    注意:该方式只是获取表单数据到属性里,不能把数据直接封装到实体类对象里。

②模型驱动封装(重点)——可以直接把数据封装到实体类对象里面    

    1.action实现接口 ModelDriven(泛型)模型驱动    泛型是实体类的名称

    2.创建实体类对象

    3.实现接口里面的方法    getModel()方法

       把创建的对象返回

    4.在action的方法中执行操作

注意:属性封装和模型驱动封装不能同时使用,同时使用只会执行模型驱动封装

③表达式封装                ——可以把表单数据封装到实体类对象里面 

    1.在action里面声明实体类private User user

    2.在action里面生成实体类对象(tUser)和变量(username)的set和get方法

    3.在表单输入项的name属性值里面写表达式形式    

       表单形式:<Input type="text" name="user.username">  user是声明实体类的对象名   username是实体类变量名 

模型驱动封装与表达式封装的不同点:

        模型驱动封装只能封装一个实体类数据(因为使用的泛型,里面只能声明一个实体类对象),而表达式封装可以封装多个实体类对象数据(可以在action声明多个实体类,并生成相应的set和get方法,但要注意表单输入项的表达式写法,对象名要与变量名相对应)。

        

Struts2封装数据到集合里面 

封装数据到list集合

        步骤类似表达式封装,先声明有泛型(实体类对象)的list,再生成set和get方法(不需要变量的set和get方法),然后注意表达式形式。

        表单形式:<Input type="text" name="list[0].username">        list[0]:表示list集合里的第一个user对象

封装数据到map集合

        步骤同list结合。只是声明的map的泛型中有两个,一个类型,一个对象名(Map<String,User>)

        表单形式:<Input type="text" name="map['one'].username">  设置key值map['key值']    设置value值(就是变量名)           



使用Struts2标签

1.在jsp中引入标签库

<%@ taglib uri="/struts-tags" prefix="s"%>

2.使用标签

<s:property value=""/>

3.修改外观样式,在Struts配置中

<constant name="struts.ui.theme"  value="simple"></constant>

Struts2标签库

s:property:     和ognl表达式在jsp页面中获取值栈数据

s:iterator:         获取值栈list集合数据,表示list集合

s:debug:          查看值栈结构和数据    

表单标签:


strtus2表单标签(默认会放到表格中)  form可以设置主题方式    里面有theme="simple"可以单行显示。



演示:


校验器

action方法继承ActionSupport类,重写validate方法。

<s:fielderror filename="username"></s:fielderror>


国际化

1.在src下创建文件global_en_US.properties,global_zh_CN.properties

2.struts配置中指定国际化文件的名字,使用<constant>常量标签 name值是“struts.custom.i18n.resources”  value值是"global"

3.页面中引用国际化<s:text name="tttle"></s:text>      name值都在国际化属性文件中配置

4.切换语言跳转链接    href=“t?request_locate=en_US”    t是在Struts配置文件中配置的action。使用jsp不能直接跳转









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值