文件下载
1.写action类
package com.gyf.web.action; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction3 extends ActionSupport { private InputStream is; public InputStream getInputStream() { return is; } public String download() throws FileNotFoundException{ String path = "C:/Users/Yuan/Desktop/9.png"; //给输入流赋值 is = new FileInputStream(path); return SUCCESS; } }
2.配置struts.xml
查看源码发现要以流的方式返回给客户端需要配置3个参数

<action name="download" class="com.gyf.web.action.DownloadAction" method="download"> <!--以流的形式返回给客户端 --> <result name="success" type="stream"> <param name="inputName">is</param><!--输入流名称 --> <param name="contentType">application/octet-stream</param><!--设置响应头 --> <param name="contentDisposition">attachment;filename=9.png</param><!--设置响应头 --> </result> </action>

上面那张图流写is根本调用不了getInputStream的方法要把is变量名更改为inputStream才可以。
下载完成

struts的OGNL
OGNL是Object Graphic Navigation Language的缩写
他是一个单独的开源项目,Struts2框架使用OGNL作为默认的表达式语言
OGNL是struts2整合的一个开源项目,所以在Struts2中,要想使用OGNL表达式,必须使用struts2标签库
OGNL相当于EL表达式,从作用于取数据
OGNL的功能
访问对象方法,静态属性,静态方法,封装List数据,封装Map数据
<!-- OGNL表达式 首先:要在jsp页面导入<%@ taglib uri="/struts-tags" prefix="s" %>> --> <!-- 表示从作用于取值,加上单引号表示字符串 --> <s:property value="java-struts2"/> <!-- 表示获取字符串的长度 --> <s:property value="'java-struts2'.length()"/> <!-- 访问静态属性,需要在strtus上配置允许静态方法访问 --> int的最大值<s:property value="@java.lang.Integer@MAX_VALUE"/> 随机数<s:property value="@java.lang.Math@random()"/> <!-- 封装List数据,数组 --> <%-- <s:radio list="{'男','女'}" name="gender" label="性别"></s:radio> --%> <!-- 封装Map数据,用#{'key''value'} --> <s:radio list="#{'male':'男','female':'女'}" name="gender" label="性别"></s:radio>
往contextMap存数据

struts的iterator遍历
在action类中提供了get 方法,就会把属性存放到值栈
1.创建action类
package com.gyf.web.action; import java.util.ArrayList; import java.util.List; import com.gyf.web.model.Student; import com.opensymphony.xwork2.ActionSupport; public class Demo03Action3 extends ActionSupport{ //action提供属性,并提供get方法,这个属性就会被存在值栈 private List<Student> stuList; public String list() { //JSP一般从值栈取数据 //创建对象 stuList = new ArrayList<Student>(); //往集合添加数据 stuList.add(new Student("迪丽热巴",18,"北京")); stuList.add(new Student("刘亦菲",19,"上海")); stuList.add(new Student("佟丽娅",20,"深圳")); stuList.add(new Student("古娜力扎",21,"广州")); stuList.add(new Student("关之琳",21,"香港")); return SUCCESS; } public List<Student> getStuList() { return stuList; } }
2.数据在jsp页面中使用遍历把数据取出,
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <s:debug></s:debug> <body> <table border="1"> <tr> <td>名字</td> <td>年龄</td> <td>城市</td> </tr> <!--使用struts的遍历标签 value :写值栈的变量名 var:遍历的变量名,存放到ContextMap --> <s:iterator value="stuList" var="stu"><!--值栈中的数据不用加上#可以取 --> <tr> <td><s:property value="#stu.name"/></td><!--ContextMap的数据要加上#取 --> <td><s:property value="#stu.age"/></td> <td><s:property value="#stu.city"/></td> </tr> </s:iterator> </table> </body> </html>

OGNL投影:是指可以给定过滤条件
OGNL表达式加条件
1 > .?#过滤所有符合条件的集合
2 > .^#过滤第一个符合条件的集合
3 > .$# 过滤最后一个符合条件的集合
Struts的set标签
set标签
往作用于存数据
value:ֵ
var:变量名
scope:作用域
<!-- s:set标签 往作用于存数据 value:值 var:变量名 scope:作用域 --> <s:set value="'迪丽热巴'" var = "username1" scope="application"/> <s:set value="'古娜力扎'" var = "username2" scope="session"/> <s:set value="'刘亦菲'" var = "username3" scope="request"/> <s:set value="'佟丽娅'" var = "username4" scope="action"/> <!-- 取值 --> <s:property value="#application.username1"/> <s:property value="#session.username2"/> <s:property value="#request.username3"/> <s:property value="#action.username4"/>