struts2

来源:互联网 发布:ubuntu pyqt5 找不到 编辑:程序博客网 时间:2024/06/14 14:03

1.webwork是struts2的前身,struts2脱离了servlet.

2.struts2的MVC的组成部分:
  M:属性驱动,模型驱动
  V:13种,例如:jsp,freemarker
  C:核心控制器(FilterDispather),业务控制器(Action代理、Action)

3.如果在struts.xml加了namespace="/abc",在访问的时候就必须加abc,例如:http://localhost:8080/工程名/abc/action

4.引用资源文件有三种方式:
 (1).在struts.properties里面加上:struts.custom.i18n.resources=资源文件名例如(messageResource)
 (2).在struts.xml里面加上:<constant name="struts.custom.i18n.resources" value="资源文件名" />
 (3).在web.xml里面加上:
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  <init-param>
   <param-name>struts.custom.i18n.resources</param-name>
   <param-value>messageResource</param-value>
  </init-param>
    </filter>
 
 
5.如果action里面没有配置class,它就会调用ActionSupport里面的execute(),也就是说永远返回成功页面.

6.获得request,session对象等方法ActionContext.getContext().方法,就可以得到相对应的对象,放到页面上可以用put方法.
  例如:request.put("名称","值");,在页面上可以这样取,${名称}、${requestScope.名称}意思就是在request范围里面拿.
  如果是session可以用,${sessionScope.名称},也可以用${名称}

7.页面上取cookie里面的值,${cookie.名字.value},如果没出来就刷新.

8.动态的调用方法:
 (1).可以在发送请求的时候加上,例如:action="login!add.action",login就是你的action名字,add就是方法名。
    这里需要注意:如果你struts.xml里面配置了匿名空间,那么在发送请求的时候就要把form里面也加上namespace="struts.xml配置的".
 (2).可以在struts.xml里面,把action配置一个method,例如:method="add",它就会去调用add方法.
 
9.通配调用方法:
  (1).在struts.xml里面配置action <action name="*Action" class="com.LoginAction" method="{1}">,在发送请求的时候
    就可以这样,例如:<s:form action="addAction" >,它就会去调用里面的add方法。如果是queryAction,它就会去调用query方法.
 为什么会去掉add方法呢?因为你的请求是addAction,它会把Action前面的截取,然后放到method,所以调的时候就调用了add.
  (2).通配调用优先级:
    1.例如:<action name="*Action" class="com.LoginAction" method="{1}">/<action>
         <action name="addAction" class="com.AddAction" method="add">/<action>
    {1}代表的是第一个*号的值.
    如果你struts.xml里面配置了这两个action,假如你发送请求的时候,是这样:<s:form action="addAction" ></form>
 这样的话它会去调addAction,也就是说会去调用com.AddAction这个类里面的add方法.
 
 2.例如:<action name="*" class="com.LoginAction" method="{1}">/<action>
         <action name="*Action" class="com.AddAction" method="{1}">/<action>
  如果你struts.xml里面是这样配置的话,它就会去按你配置的顺序调用,例如:你发送的请求是这样:
  <s:form action="addAction" ></form>它就会去调用com.LoginAction里面的方法.
 
  (3).通配类和方法:
     1.<action name="*_*" class="com.{1}" method="{2}"></action>例如你的请求是这样:
  <s:form action="LoginAction_add" ></s:form>,它就会去调用com.LoginAction里面的add方法.
 
10.当struts.xml里面配置了全局的result,当有局部的和全局的重名时,返回结果会先找局部,然后找全局的。

11.在struts.xml里面也可以用${}来取值,例如:
    页面上有:<s:textfield name="pageName" label="页面"/>
    <action name="*_*" class="com.{1}" method="{2}">
  <result name="success">/${pageName}.jsp</result>
 </action>
 那么这里取到的${pageName}值,就是页面上输入的值,必须要在action类里面配置pageName这个字段.
 
12.在struts.xml里面配置<result name="success">/success.jsp</result>,如果result没有指定type默认是dispatcher。
 
13.<s:date name="birthday" format="yyyy-MM-dd" />用来定义显示日期.

14.当action里面是一个对象的时候,struts2也可以封装起来,例如:在页面上
   <s:textfield name="user.name" label="姓名" />
   取的时候可以这样<s:property value="user.birthday" />
   注意:这里action里面的对象必须要有get,set方法,对象里面的属性也必须要有get,set方法.
  
  
15.转换器:
  (1).局部转换:
     局部转换资源文件命名是action类名-conversion.properties,且这个文件一定要和action在同一级目录,
  里面的内容是:属性名=包名.类名,属性名是你要转换的属性名称,后面是转换器.
  (2).全局转换:
    全局转换资源文件命名xwork-conversion.properties,里面的内容是:包名.类名=包名.类名
 前面那个是你要转换的类,后面是你转换器。这个文件必须得放到src目录下.
 
16.属性驱动:action类里面的属性,必须提供get,set方法,那么struts2就会把相对应的值放到该属性里面.

17.模型驱动:这个action类必须实现ModelDriven接口,并实现里面的的getModel()方法,在里面直接返回Bean对象,
   例如action里面有个字段是User user,只需在getModel里面返回user即可,它就会自动把值set到User对象的属性里面.
  
18.代理:
  (1).静态代理:
  (2).动态代理: 
 
19.拦截器:
 1.单个拦截器声明定义:
  A.继承AbstractInterceptor类:
   (1).自定义拦截器需要继承AbstractInterceptor,然后实现intercept方法,这个方法有一个参数,直接用这个参数调用
  invoke方法,这个就等于调用了真实方法,可以在调用之前做你自己想做的事情。
   (2).配置:在struts.xml里面配置拦截器,在package下面加上
      <interceptors>
   <interceptor name="名称"class="包名.类名" /> //name就是你这个拦截器的名字,class就是拦截器的处理类.
   </interceptors>
   (3).使用:在你的struts.xml的action里面加上<interceptor-ref name="拦截器名称"/>,这个name是你要引用的拦截器名字.
     这里需要提醒的是:如果你action里面指定了拦截器,那么struts2本身的拦截器就没有用到了,如果还需要用struts2本身的
  拦截器,那么就要加上<interceptor-ref name="defaultStack" />,这个是struts2默认的拦截器.
   (4).把值传到拦截器里面:
     如果你的拦截器里面配置了属性,也可以从外面传值过去,例如:拦截器里面配置了一个message属性,并且有set方法,
  在配置的时候也可以传值过去,
  <interceptor name="loginInterceptor"
   class="com.lxitedu.interceptor.LoginInterceptor">
   <param name="message">hello world this</param>
 </interceptor>
 这样这个值就传过去了,还可以在调用的时候传过去
 <interceptor-ref name="loginInterceptor">
  <param name="message">hello world this</param>
 </interceptor-ref>.
  B.继承MethodFilterInterceptor类:
    (1).自定义拦截器需要继承MethodFilterInterceptor,然后实现doIntercept方法,这个方法有一个参数,直接用这个参数调用
  invoke方法,这个就等于调用了真实方法,可以在调用之前做你自己想做的事情。
 (2).配置:在struts.xml里面配置拦截器,在package下面加:
    <interceptor name="拦截器名字" class="拦截器的包名.类名">
   <param name="excludeMethods">add</param> <!-- 不需要拦截的方法,这里name="excludeMethods"是struts2指定的-->
   <param name="includeMethods">execute</param><!-- 指定拦截的方法,这里name="includeMethods"是struts2指定的-->
    </interceptor>
 (3).引用和继承AbstractInterceptor类是一样的.
  2.拦截器栈:
   (1).拦截器栈实际上就是把多个拦截器,和在一起,就形成了栈,在引用时只需要引用该栈就可以了。
      引用栈就等于引用了栈里面的所有拦截器.
   (2).声明:在你的struts.xml文件配置,在package下面加上:
      <interceptors>
         <interceptor-stack name="拦截器栈名字">
           <interceptor-ref name="拦截器1名字"/>
           <interceptor-ref name="拦截器2名字"/>
           <interceptor-ref name="defaultStack"/><!--strut2默认拦截器 ! -->
         </interceptor-stack>
      <interceptors>
   (3).引用:在struts.xml里面的action中加上:<interceptor-ref name="拦截器栈名字"/>
  
 3.如果想配置的拦截器对整个包都有效,而不是只对单个action有效则需指定该包默认的拦截器配置。
   在该包结束的地方做如下配置 <default-interceptor-ref name="拦截器栈名字或者拦截器名字"/></package>
   在指定了该包的默认拦截器或者拦截器栈后,只要是该包下的action都使用该包的默认拦截器或者拦截器栈,
   而如果在action里特别指定了使用某个拦截器,包的默认拦截器或者拦截器栈将失效,此时我们需要显示指定。
 
20.%{getText('you key')},这样也可以取资源文件的内容.

21.如果在页面上加上了<s:head />这个标签,如果你验证失败后提示信息就会变为红色。

22.<s:datetimepicker name="birthday" language="zh_CN" type="date" displayFormat="yyyy-MM-dd" />来显示下拉的日期,
   让用户选择.
 
23.国际化i18n拦截器拦截request_locale参数,根据参数里面的值来,设置WW_TRANS_I18N_LOCALE的值,
   然后页面上会根据WW_TRANS_I18N_LOCALE的值,来取资源文件里面的内容.
 
24.Struts2内建拦截器的简要介绍:
 (1).alias:实现在不同请求中相似参数别名的转换。
 (2).autowiring:这是个自动装配的拦截器,主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring
    容器中的Bean。
 (3).chain:构建一个Action链,使当前Action可以访问前一个Action的属性。
 (4).conversionError:这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action
     的FieldError错误。
 (5).createSession:该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中。
 (6).debugging:当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息。
 (7).execAndWait:后台执行Action,负责将等待画面发送给用户。
 (8).exception:这个拦截器负责处理异常,它将异常映射为结果。
 (9).fileUpload:这个拦截器主要用于文件上传,它负责解析表单中文件域的内容。
 (10).i18n:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。
 (11).logger:这是一个负责日志记录的拦截器,主要是输出Action的名字。
 (12).vmodel-driven:这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的
    结果堆入ValueStack中。
 (13).scoped-model-driven:如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,
    并将通过setModel方法将该Model传给Action实例。
 (14).params:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
 (15).prepare:如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。
 (16).static-params:这个拦截器负责将xml中标签下标签中的参数传入action。
 (17).scope:这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。
 (18).servlet-config:如果某个Action需要直接访问Servlet API,就是通过这个拦截器实现的。
    注意:尽量避免在Action中直接访问Servlet API,这样会导致Action与Servlet的高耦合。
 (19).roles:这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者
    取得合适的授权后,才可以调用被该拦截器拦截的Action。
 (20).timer:这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。
 (21).token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。
 (22).token-session:这个拦截器的作用与前一个基本类似,只是它把token保存在HttpSession中。
 (23).validation:通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。
 (24).workflow:这个拦截器负责调用Action类中的validate方法,如果校验失败,则返回input的逻辑视图。
   大部分时候,开发者无需手动控制这些拦截器,因为struts-default.xml文件中已经配置了这些拦截器,只要我们定义的包
   继承了系统的struts-default包,就可以直接使用这些拦截器。当然,Struts2的拦截器机制并不是来自于Struts1,而是来自于webWork。

25.校验:
 (1).字段校验:
    例如:<field name="id">
  <field-validator type="required">
   <message key="validation.student.id" />
  </field-validator>
  <field-validator type="int">
   <param name="min">1</param>
   <param name="max">10000</param>
   <message key="validation.student.id.length" />
  </field-validator>
 </field>
 (2).非字段校验:
    例如:<validator type="int">
  <param name="fieldName">id</param>
  <param name="trim">true</param>
  <param name="min">1</param>
  <param name="max">100</param>
  <message key="validation.student.id" />
 </validator>

 
26.<s:action name="register" executeResult="true" ignoreContextParams="true"/>,这个标签是调用action,
   name是action名字,executeResult="true"的话,就是说允许action返回值在页面显示,false就是不允许,
   ignoreContextParams允许传参给acting,false就是不允许.

27.attr 用于按request > session > application顺序访问其属性(attribute)#attr.userName相当于按顺序在以上
   三个范围(scope)内读取userName属性,直到找到为止.
  
28.#request.userName相当于request.getAttribute("userName")也相当于$(requestScope.userName)同理,session也是一样.

29.#request.userName=#request['userName']=request.getAttribute("userName")=$(requestScope.userName)以此类推.

30.直接输出list里面的全部人员
  <s:iterator value="list名称">
   <s:property value="name" />
   <s:property value="age" />
  </s:iterator>
  有条件输出list,{}里面的内容是一个表达式,list属性名.该表达式返回的依然是一个list,表示输出年龄大于40的人员
    <s:iterator value="list名称.{?#this.age>40}">
      <li><s:property value="name" />
   <s:property value="age" /></li>
    </s:iterator>

31.<meta http-equiv="refresh" content="5" URL=http://www.openbook.com.cn"> ,5秒后自动跳转到指定页面。

struts2标签:
  种类:用户界面,非用户界面,ajax支持标签
  1.用户界面:表单,非表单
  2.非用户界面:控制,数据
 (1).<s:bean name="包名.类名" id="p" />,<s:bean>标签可以设置JavaBean的值,也可以取值,如果在<s:bean>标签里面
    取值的话可以用<s:property value="属性"/>,如果在<s:bean>外面取的话,就要用#号才能取。原理:在里面取的话
 他的值是放在值栈里面的,如果它碰到了</s:bean>它就会把这个值扔出这个值栈里面,然后根据ID把值放到stackContext里面
 如果用#加id就可以到stackContext里面把值取出来了。
 (2).<s:set name="变量名" value="值" scope="session" />,name就是变量名,value就是变量值,scope是存放的位置。
 (3).<s:iterator value="集合" id="merge" status="st" ></s:iterator>,如果里面是字符串的话,可以<s:property value="merge"/>
   输出值,或者是直接<s:property/>也可以取.
  
32.Struts2默认提供了四种主题:
  Simple    主题:最简单的主题
  XHTML     主题:默认主题,使用常用的HTML技巧
  CSS XHTML 主题: 使用CSS实现的XHTML主题
  AJAX      主题:基于XHTML主题,但是同工了AJAX功能
 
33.利用<s:div>来调用action,例如:
  <s:url id="myAction" value="login.action"/>
  <s:div theme="ajax" href="%{myAction}"></s:div>
  如果这样的话,当解析到<s:div>它就会去调用想对应的action,然后把action的返回值,返回到<s:div>里面.