<include file="">
|struts.enable.DynamicMethod.Invocation=true
<param name="Namespace">/n2</param> <param name="ActionName">math</param>
使用
<package name="D3" extends="struts-default" namespace="/n3">
//**声明类型**
<result-types>
<result-type name="newresult" class="com.result.result"></result-type>
</result-types>
//使用
<action name="cop">
<result name="success" type="newresult"></result>
</action>
</package>
封装请求参数
<param name="name">游客</param>
模型类中添加List或者Map集合
private List<Customer> customers = new ArrayList<Customer>();
private Map<String, Customer> customers1 = new HashMap<String, Customer>();
jsp页面中:
List:
<input type="text" name="customers[0].username"/>
Map:
<input type="text" name="customers1['c1'].username"/>
StrutsTypeConverter
,重写convertFromString()
和 convertToString()
这两个方法birthday=com.item.MyDateConverter(转换器类)
xwork-conversion.properties
,所有动作都可以用java.util.Date=com.itheima.convertors.MyDateConverter
内容为需要转换的类型和对应的类类名.properties
, 内容为invalid.fieldvalue.birthday=输入错误
<result name="input">/regist.jsp</result>
结果视图addFieldError("name", "请输入用户名");
addFieldError("m.name", "请输入用户名");
@SkipValidation
public void validateDemo1
后面是指定方法的名字.<field name="m.name">
中的name要和表单名(jsp/name)一致 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<validators>
<validator name="strongpassword" class="com.itheima.validators.StrongPasswordValidator"/>
</validators>
定义简单拦截器如下图所示
public class Demo1Interceptor extends AbstractInterceptor {
//返回值:最终目标的返回值。就是一个结果逻辑视图。对应struts.xml中的result
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("拦截前");
String rtValue = invocation.invoke();//放行 ,下面执行的方法会有返回值,然后将这个返回值返回
System.out.println("拦截后");
return rtValue;
}
}
<interceptors><interceptor name="" class=""/></interceptors>
来声明拦截器<interceptor-ref name=""></interceptor-ref>
来使用拦截器(使用了自定义拦截器,则默认拦截器失效)FileUtils.copyFile(file1, target);
方法, file1: file文件域对象 target: 目标文件(创建的文件)fileupload.properties
文件struts.messages.upload.error.SizeLimitExceededException
和 struts.messages.error.file.extension.not.allowed
等,可以用{1}来设置系统返回值<result type="Stream">
Xml配置文件结果视图类型为Stream<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- 调用任意对象的任意方法 -->
<s:property value="'abcdefg'.length()"/>
<hr/>
<!-- 访问静态变量 -->
<s:property value="@java.lang.Integer@MAX_VALUE"/>
<hr/>
<!-- 访问静态方法 配置参数:<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> xml中-->
<s:property value="@java.lang.Math@abs(-100)"/>
<s:property value="[1].month">
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="'name'"/>
//将value输出,使用ognl表达式都需要在struts2的标签内才可以<s:set value="'value'" var="v1" scope="session"></s:set>
存放数据,如果没有指定scope, 默认放到contextMap和request中<s:property value="'<hr/>'" escapeHtml="true"/><br/>
是否转译<s:push value="'value3'"></s:push>
将对象压入valuestack栈中,标签结束后弹栈,则操作必须在结束标签之前进行<s:bean name="java.util.Date" var="now"></s:bean>
给一个对象去一个名字,并且放到contextMap中<s:action name="HelloWorldAction" executeResult="true"/>
action指向一个动作,将动作结果包含进来,类似于EL标签的include<s:iterator value="#request" var="s">
forEach,将当前遍历的元素存储到contextMap中,key就是var指定的值 m=Map.Entry,如果没有指定var,会将当前元素放到valuestack中<s:radio list="{'man','faman'}" name="username"></s:radio>
如果contextMap中有key和下面连个标签的name相同,则会自动遍历内容,选中对应的选项<s:if test="#grade=='A'"> </if> <s:elseif test="#grade=='B'"></s:elseif>
if-else标签<s:url action="demo2" var="u1"> <a href="${u1 }">点我</a>
url标签和a标签传递参数是用<s:param name="username" value="'你也好'">
来传递<s:a action="demo1"></s:a>
<interceptor-ref name="token"></interceptor-ref>
//需要结果视图,如果重复提交会转向结果视图<interceptor-ref name="tokenSession"></interceptor-ref>
//不需要结果视图,点多次提交会等待