欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Web开发】OGNL语言+文件上传下载

程序员文章站 2022-03-11 20:07:17
...

OGNL语言

OGNL语言是一种可以方便地操作对象属性的开源表达式语言,也是Struts2默认的表达式语言。它的优点有:
1.支持对象方法调用,例如xxx.doSomething()
2.支持类静态方法调用和值访问,格式为@[类全名(包括包路径)]@[方法名|值名]。例如,@aaa@qq.com(‘foo%s’,’bar’)或者@aaa@qq.com_NAME。
3.支持赋值操作和表达式串联,如price=100,disocunt=0.8,calculatePrice(price * discount),返回80
4.可以方便地访问OGNL上下文(OGNLContext)和ActionContext。
5.可以方便地操作集合对象。

1.”#”符号
(1)用于访问上下文,相当于ActionContext.getContext()
#parameters.id[0]相当于request.getParameter(“id”)
#request.username相当于request.getAttribute(“userName”)
#session.username相当于session.getAttribute(“userName”)
#application.username相当于application.getAttribute(“userName”)
#attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。
(2)用于过滤和投影集合,例如books.{?#this.price<100}。
(3)用于构造Map,例如#{‘book’:’23’,’book2’:’55’}

2.”%”的用法
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。

<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>

3.”$”的用法
1、用于在国际化资源文件中,引用OGNL表达式
2、在Struts 2配置文件中,引用OGNL表达式

 例如:
     <action name="AddPhoto" class="addPhoto">
        <interceptor-ref name="fileUploadStack" />           
        <result type="redirect">/myOGNL.action?id=${id}</result>
    </action>

文件上传

MyUpAction.java

public class MyUpAction extends ActionSupport{
    private File upload;
    private String uploadContentType;
    private String uploadFileName;
    private String savePath;
    /*省略get()和set()方法*/
    public String execute() throws Exception{
        String fileName=getSavePath()+"\\"+getUploadFileName();
        FileOutputStream fos=new FileOutputStream(fileName);
        FileInputStream fis=new FileInputStream(getUpload());
        byte []b=new byte[1024];
        int len=0;
        while((len=fis.read(b))>0){
            fos.write(b,0,len);
        }
        return SUCCESS;
    }
}

up.jsp

<s:form action="up" namespace="/user" method="post" 
enctype="multipart/form-data" theme="simple">
<s:file name="upload" cssStyle="width:300px;"></s:file>
<s:submit value="确定"/>
</s:form>

application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传

struts.xml
saveDir用于指定存放指定临时文件的文件夹,不配置会出现Unable to find ‘struts.multipart.saveDir’ property setting错误。参考了这篇文章
fileLoad为Struts2提供的文件上传拦截器
allowTypes:指定运行上传的文件类型
maximumSize:指定允许上传的文件大小,单位是字节。

<constant name="struts.multipart.saveDir" value="/tmp"/>
    <package name="user" extends="struts-default" namespace="/user">
        <action name="up" class="ch5.MyUpAction">
            <interceptor-ref name="fileUpload">
                <param name="allowedTypes">image/png,image/gif,image/jpg</param>
                <param name="maximumSize">90000000</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack"/>
            <param name="savePath">D:/pics/</param>
            <result name="input">/up.jsp</result>
            <result name="success">/success.jsp</result>
        </action>
    </package>

success.jsp

<h1>上传成功!</h1>
<s:property value="uploadFileName"/>
<br>
<img src="<s:property value="'D:/pics/'+uploadFileName"/>"/>

随便找的图片-_-|||
【Web开发】OGNL语言+文件上传下载

文件下载

MyDownload.java

public class MyDownload extends ActionSupport{
    private String inputPath;
    /* 省略get()和set()方法 */
    public InputStream getTargetFile() throws Exception{
        return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
    }
    public String execute()throws Exception{
        return SUCCESS;
    }
}

struts.xml

contentType:指定文件的下载类型。
inputName:指定下载文件的输入流入口,在action中实现getXXX()类
contentDisposition:指定文件下载的处理方式,默认为inline,即直接尝试打开,附件attachment为文件保存。

<package name="user" extends="struts-default" namespace="/user">
    <default-action-ref name="download"/>
    <action name="download" class="ch5.MyDownload">
        <param name="inputPath">\save\photo.jpg</param>
        <result name="success" type="stream">
            <param name="contentType">image/jpg</param>
            <param name="inputName">targetFile</param>
            <param name="contentDisposition">attachment;filename="photo.jpg"</param>
            <param name="bufferSize">2048</param>
        </result>
    </action>
</package>

download.jsp

<a href="/test5/user/download.action" >我要下载</a>

【Web开发】OGNL语言+文件上传下载