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

OGNL语言

OGNL语言是一种可以方便地操作对象属性的开源表达式语言,也是Struts2默认的表达式语言。它的优点有:
1.支持对象方法调用,例如xxx.doSomething()
2.支持类静态方法调用和值访问,格式为@[类全名(包括包路径)]@[方法名|值名]。例如,@java.lang.String@format(‘foo%s’,’bar’)或者@tutorial.MyConstant@APP_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"/>"/>

随便找的图片-_-|||
滑稽

文件下载

MyDownload.java

扫描二维码关注公众号,回复: 1491795 查看本文章
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>

download测试

猜你喜欢

转载自blog.csdn.net/tjj1998/article/details/80569783