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>里面.