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

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

2017-09-11 10:20 417 查看


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文件

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

实现action的三种编写方式:

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

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

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

访问action的方法:

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

②使用通配符(常用)

name属性里的*星号。

*表示匹配任意内容 



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

result标签不用通配符。

③动态访问(不常用)

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

四大作用域:  操作域对象

request(常用):
    HttpServletRequestrequest=ServletActionContext.getRequest();


    request.setAttribute("name",”value");


response:
    HttpServletResponseresponse=ServletActionContext.getResponse();


session:
    HttpSessionsession=request.getSession();


application:
    ServletContextapplication=ServletActionContext.getServletContext();


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

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

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

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

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

action方法映射拦截器:

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

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

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

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

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

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

<interceptor-ref>


  <paramname="excludeMethods">login</param>


</interceptor-ref>


拦截器底层原理:

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

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

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



过滤器和拦截器的区别:

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

拦截器:只可以拦截action

Action中获取表单数据:

①使用ActionContext类获取

完全解耦合的一种方法 
  //1.获取ActionContext对象


  ActionContext context=ActionContext.getContext();


  //2.调用方法得到表单数据


  //key是表单输入项name属性值,value是输入的值


  Map<String,Object> map=context.getParameters();


  Set<String>keys=map.keySet();


  for(Stringkey:keys){


      //根据key得到value  obj就是value值


      //数组形式,因为输入项中有可能有复选框情况


      Object[]obj=(Object[])map.get(key);


  }


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

包含很多静态方法
  //1.使用ServletActionContext获取request对象


  HttpServletRequestrequest=ServletActionContext.getRequest();


  //2.调用request里面的方法得到结果


  Stringname=request.getParameter("name名");


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

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

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



①属性封装

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

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

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

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

    2.创建实体类对象

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

    把创建的对象返回

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

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

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

    1.在action里面声明实体类privateUseruser

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

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

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

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

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

       

Struts2封装数据到集合里面 

封装数据到list集合

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

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

封装数据到map集合

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

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

使用Struts2标签

1.在jsp中引入标签库

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

2.使用标签

<s:propertyvalue=""/>

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

<constantname="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:fielderrorfilename="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:textname="tttle"></s:text>   name值都在国际化属性文件中配置

4.切换语言跳转链接    href=“t?request_locate=en_US”  t是在Struts配置文件中配置的action。使用jsp不能直接跳转
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: