struts.xml
<interceptors> //定义一个文件上传的拦截器,该是从struts-default.xml中copy来改的
<interceptor-stack name="upFIleStack">
<interceptor-ref name="exception" />
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<interceptor-ref name="i18n" />
<interceptor-ref name="prepare" />
<interceptor-ref name="chain" />
<interceptor-ref name="debugging" />
<interceptor-ref name="scopedModelDriven" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="fileUpload"> 这里的总文件大小还受default.properties中的限制
<param name="maximumSize">10240</param><!-- 单位是 byte,这里总文件大小也就是10kb了-->
<param name="allowedTypes">image/jpeg,image/gif,image/png</param>
</interceptor-ref>
<interceptor-ref name="checkbox" />
<interceptor-ref name="multiselect" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="actionMappingParams" />
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError" />
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="testAction">
<result>/WEB-INF/jsp/struts2/index.jsp</result>
</action>
<action name="fileUpload"
class="com.chenjun.eshop.staffManage.action.UpFile">
<interceptor-ref name="upFIleStack" /><!-- 引用上面定义的拦截器 -->
<result>/WEB-INF/jsp/struts2/result.jsp</result>
<result name="input">/WEB-INF/jsp/struts2/index.jsp</result>
</action>
为什么上面的testAction没有class,也没有method也能得到result页面呢,那是因为它执行的class是struts-default.xml中定义的 <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />,也就会执行它里面默认的execute方法了,返回success,result默认就是success,所以能够得到该页面,
<interceptors> //定义一个文件上传的拦截器,该是从struts-default.xml中copy来改的
<interceptor-stack name="upFIleStack">
<interceptor-ref name="exception" />
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<interceptor-ref name="i18n" />
<interceptor-ref name="prepare" />
<interceptor-ref name="chain" />
<interceptor-ref name="debugging" />
<interceptor-ref name="scopedModelDriven" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="fileUpload"> 这里的总文件大小还受default.properties中的限制
<param name="maximumSize">10240</param><!-- 单位是 byte,这里总文件大小也就是10kb了-->
<param name="allowedTypes">image/jpeg,image/gif,image/png</param>
</interceptor-ref>
<interceptor-ref name="checkbox" />
<interceptor-ref name="multiselect" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="actionMappingParams" />
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError" />
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="testAction">
<result>/WEB-INF/jsp/struts2/index.jsp</result>
</action>
<action name="fileUpload"
class="com.chenjun.eshop.staffManage.action.UpFile">
<interceptor-ref name="upFIleStack" /><!-- 引用上面定义的拦截器 -->
<result>/WEB-INF/jsp/struts2/result.jsp</result>
<result name="input">/WEB-INF/jsp/struts2/index.jsp</result>
</action>
可以发现struts-default.xml里面还有一段<default-interceptor-ref name="defaultStack"/>,也就是说所有的action都会经过这个拦截器。
为什么jsp标签能够访问action的属性值,集合的值,map的值,还是因此在struts-default.xml中有
<bean type="ognl.PropertyAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Iterator" class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Enumeration" class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.List" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Set" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
上面说的就是ognl能够访问的action的属性值类型,这个文件里面还定义了许多拦截器,常量等其他东西,可以研究研究。
<bean type="ognl.PropertyAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Iterator" class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Enumeration" class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.List" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Set" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
<bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
除了上面一个文件,struts还有一个文件default.properties专门用来定义一些常量的,这些常量也是可以直接在struts.xml中来定义的,这样struts.xml中定义的就会覆盖default.properties中同名的了,像struts.objectFactory.spring.autoWire = name等,这个文件也可以研究下
上传action
public class UpFile extends ActionSupport
{
private File <span style="color:#FF0000;">attachFile</span>; //对应页面的file控件名称
private String <span style="color:#FF0000;">attachFile</span><span style="color:#CC0000;">ContentType</span>; //在attachFile后面加上ContentType,用来接收文件类型
private String <span style="color:#FF0000;">attachFile</span><span style="color:#CC0000;">FileName</span>; //在attachFile后面加上FileName,用来接收文件名
public String getAttachFileContentType()
{
return attachFileContentType;
}
public void setAttachFileContentType(String attachFileContentType)
{
this.attachFileContentType = attachFileContentType;
}
public String getAttachFileFileName()
{
return attachFileFileName;
}
public void setAttachFileFileName(String attachFileFileName)
{
this.attachFileFileName = attachFileFileName;
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
public File getAttachFile()
{
return attachFile;
}
public void setAttachFile(File attachFile)
{
this.attachFile = attachFile;
}
}
上传jsp
public class UpFile extends ActionSupport
{
private File <span style="color:#FF0000;">attachFile</span>; //对应页面的file控件名称
private String <span style="color:#FF0000;">attachFile</span><span style="color:#CC0000;">ContentType</span>; //在attachFile后面加上ContentType,用来接收文件类型
private String <span style="color:#FF0000;">attachFile</span><span style="color:#CC0000;">FileName</span>; //在attachFile后面加上FileName,用来接收文件名
public String getAttachFileContentType()
{
return attachFileContentType;
}
public void setAttachFileContentType(String attachFileContentType)
{
this.attachFileContentType = attachFileContentType;
}
public String getAttachFileFileName()
{
return attachFileFileName;
}
public void setAttachFileFileName(String attachFileFileName)
{
this.attachFileFileName = attachFileFileName;
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
public File getAttachFile()
{
return attachFile;
}
public void setAttachFile(File attachFile)
{
this.attachFile = attachFile;
}
}
<body>
<s:form action="fileUpload" method="<span style="color:#FF0000;">post</span>" enctype="<span style="color:#FF0000;">multipart/form-data</span>"> post,multipart/form-data是文件上传必须这样写的
<s:file name="<span style="color:#FF0000;">attachFile</span>" label="附件" />
<s:submit />
</s:form>
</body>
<body>
<s:form action="fileUpload" method="<span style="color:#FF0000;">post</span>" enctype="<span style="color:#FF0000;">multipart/form-data</span>"> post,multipart/form-data是文件上传必须这样写的
<s:file name="<span style="color:#FF0000;">attachFile</span>" label="附件" />
<s:submit />
</s:form>
</body>