一、获取值栈(2种)
从请求中获取值栈
第二种方式,推荐使用
OgnlAction.java
package com.test.ognl;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class OgnlAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String username="123";
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String og() {
// 从请求中获取值栈
HttpServletRequest request=ServletActionContext.getRequest();
ValueStack vs=(ValueStack)request.getAttribute("struts.valueStack");
System.out.println(vs);
ValueStack vs1=(ValueStack)request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
System.out.println(vs1);
// 第二种方式,推荐使用
ValueStack valueStack=ActionContext.getContext().getValueStack();
System.out.println(valueStack);
return SUCCESS;
}
}
struts_ognl.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="ognl_pg" namespace="/" extends="struts-default">
<action name="ognl" class="com.test.ognl.OgnlAction" method="og">
<result name="success">
/index.jsp
</result>
</action>
</package>
<!-- localhost:8080/txkt/ognl.action -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>
struts.xml
<include file="com/test/ognl/struts_ognl.xml" />
新建index.jsp空白页
启动服务器
浏览器输入:
localhost:8080/txkt/ognl.action
二、引入struts2标签库
<%@taglib uri="/struts-tags" prefix="s" %>
三、分析值栈内部结构
struts.xml设置开发模式
<constant name="struts.devMode" value="true"/>
在题一的基础上,新建index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<s:property value="username"/>
<s:debug></s:debug>
</body>
</html>
浏览器输入:
localhost:8080/txkt/ognl.action
四、root和context的使用
1、使用root实现数据的传递
一般将单个对象放入root中,值就在栈顶
1)添加数据
(无属性名添加)
值栈对象.getRoot().add(0,"内容");
ValueStack valueStack;
valueStack=ActionContext.getContext().getValueStack();
CompoundRoot root = valueStack.getRoot();
root.add(0, "内容1");
值栈对象.getRoot().push("内容");
ValueStack valueStack;
valueStack=ActionContext.getContext().getValueStack();
CompoundRoot root = valueStack.getRoot();
root.push("内容1");
(有属性名添加)
值栈对象.set("key","value");
ValueStack valueStack;
valueStack=ActionContext.getContext().getValueStack();
valueStack.set("key1", "内容1");
2)JSP获取值栈中root的数据
(无属性名获取)
<%@taglib uri="/struts-tags" prefix="s" %>
<s:property value="[0].top"/>
<s:property value="key1"/>
(有属性名获取)
<%@taglib uri="/struts-tags" prefix="s" %>
<s:property value="key1"/>
2、使用context实现数据的传递
把数据放入context中。
1)添加
方式一:值栈对象.getContext.put(String key,Object value);
ValueStack valueStack;
valueStack=ActionContext.getContext().getValueStack();
valueStack.getContext().put("key2", "内容2");
方式二:ActionContext对象.put(String key,Object value);
ValueStack valueStack;
valueStack=ActionContext.getContext().getValueStack();
ActionContext context = ActionContext.getContext();
context.put("key3", "内容3");
2)JSP获取context中的数据
数据获取采用<s:property value="#age"/>
取数据的时候,不加#表示从root中查找,加#表示从context中查找。
<s:property value="#key2"/>
<s:property value="#key3"/>
五、数据标签的使用
data.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>数据标签</h1>
<%
request.setAttribute("pro", "<b>这是内容</b>");
request.setAttribute("paraml", "zs");
%>
<!-- request存放在context中,键为request -->
<!-- escapeHtml为false,html代码可以实现,默认为true -->
<s:property value="#request.pro" default="默认内容" escapeHtml="false" />
<br>
<s:property value="#request.pro1" default="默认内容" />
<br>
<!-- 超链接路径,一般是后台配置 -->
<a href="/txkt/ognl.action">固定写法</a>
<br>
<!-- 不带参数的写法 -->
<s:a namespace="/" action="ognl">struts2用法(不带参数)</s:a>
<br>
<!-- 带参数的写法 -->
<s:a namespace="/" action="ognl">struts2用法(带参数)1
<!-- 注意点,参数如果是非数字,默认是ognl表达式的值 -->
<s:param name="user" value="%{zs}"></s:param>
</s:a>
<br>
<s:a namespace="/" action="ognl">struts2用法(带参数)2
<!-- 注意点,参数如果是非数字,默认是ognl表达式的值 -->
<s:param name="user" value="#request.pro"></s:param>
</s:a>
<br>
<s:url namespace="/user" action="sts" />
<br>
<!-- /txkt/user/sts.action -->
<a href='<s:url namespace="/" action="ognl"/>'>使用url的超链接1</a>
<br>
<s:url namespace="/" action="ognl" var="myurl">
<s:param name="pwd" value="123"></s:param>
</s:url>
<a href='<s:property value="myurl"/>'>使用url的超链接2</a>
</body>
</html>
六、控制标签的使用
control.jsp
<%@page import="com.test.param.User"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>控制标签</title>
</head>
<body>
<h1>控制标签</h1>
<%
request.setAttribute("score", 80);
// 普通集合
ArrayList<String> list = new ArrayList<String>();
list.add("001");
list.add("002");
list.add("003");
list.add("004");
request.setAttribute("list_str", list);
// 对象集合
ArrayList<User> list2 = new ArrayList<User>();
User u = new User();
u.setSname("limi");
u.setAge(15);
u.setSid(123);
list2.add(u);
request.setAttribute("user", list2);
%>
<!-- if判断 -->
<s:if test="#request.score >= 90">
优
</s:if>
<s:elseif test="#request.score >= 80">
良
</s:elseif>
<s:else>
不及格
</s:else>
<br>
<!-- iterator循环 -->
<s:iterator value="#request.list_str" var="str">
<s:property value="#str" />
</s:iterator>
<br>
<s:iterator begin="0" end="10" step="2" var="num">
<s:property value="#num" />
</s:iterator>
<br>
<s:iterator value="#request.user" var="user">
<s:property value="#user.sid" />
<s:property value="#user.sname" />
<s:property value="#user.age" />
</s:iterator>
<br>
<s:iterator value="#request.user" var="user">
<s:property value="sid" />
<s:property value="sname" />
<s:property value="age" />
</s:iterator>
<s:debug></s:debug>
</body>
</html>
七、文件上传(简单)
注意:
上传的本地文件路径:
C:\Users\Administrator\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\txkt
upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<!--上传的本地文件路径: C:\Users\Administrator\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\txkt -->
<form action="<%=request.getContextPath()%>/upload.action" method="post" enctype="multipart/form-data">
<input type="text" name="userName" value="zs">
<input type="file" name="logo">
<input type="submit" value="文件上传">
</form>
</body>
</html>
FileUploadAction.java
package com.test.file;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
// 普通表单
private String userName;
// 上传的文件
private File logo;
// 文件映射规则,表单文件的name+FileName
private String logoFileName;
// MIME类型规则,表单文件的name+ContentType
private String logoContentType;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public File getLogo() {
return logo;
}
public void setLogo(File logo) {
this.logo = logo;
}
public String getLogoFileName() {
return logoFileName;
}
public void setLogoFileName(String logoFileName) {
this.logoFileName = logoFileName;
}
public String getLogoContentType() {
return logoContentType;
}
public void setLogoContentType(String logoContentType) {
this.logoContentType = logoContentType;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
// 获取项目部署的磁盘的绝对路径
String realPath = ServletActionContext.getServletContext().getRealPath("/");
System.out.println(realPath);
File file = new File(realPath,logoFileName);
FileUtils.copyFile(logo, file);
// System.out.println(userName);
// System.out.println(logo);
// System.out.println(logoFileName);
// System.out.println(logoContentType);
return NONE;
}
}
struts_file.xml
?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 全局大小 -->
<constant name="struts.multipart.maxSize" value="1024000"></constant>
<package name="file_pg" namespace="/" extends="struts-default">
<action name="upload" class="com.test.file.FileUploadAction">
<!-- 局部拦截 -->
<interceptor-ref name="defaultStack">
<!-- 上传文件最大容量 -->
<param name="fileUpload.maximumSize">10240</param>
<!-- 上传文件类型 -->
<param name="fileUpload.allowedTypes">image/jpeg,application/msword</param>
<!-- 上传文件后缀名字 -->
<param name="fileUpload.allowedExtensions">.jpg,.doc</param>
</interceptor-ref>
<result name="input">/upload.jsp</result>
</action>
</package>
<!-- localhost:8080/txkt/upload.action -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>
struts.xml
七、文件上传(优化)
upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<s:debug></s:debug>
<!--上传的本地文件路径: C:\Users\Administrator\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\txkt -->
<form action="<%=request.getContextPath()%>/upload.action" method="post" enctype="multipart/form-data">
<input type="text" name="userName" value="zs">
<input type="file" name="logo">
<input type="submit" value="文件上传">
</form>
<!--输出错误信息-->
${fieldErrors}
</body>
</html>
FileUploadAction.java
package com.test.file;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
// 普通表单
private String userName;
// 上传的文件
private File logo;
// 文件映射规则,表单文件的name+FileName
private String logoFileName;
// MIME类型规则,表单文件的name+ContentType
private String logoContentType;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public File getLogo() {
return logo;
}
public void setLogo(File logo) {
this.logo = logo;
}
public String getLogoFileName() {
return logoFileName;
}
public void setLogoFileName(String logoFileName) {
this.logoFileName = logoFileName;
}
public String getLogoContentType() {
return logoContentType;
}
public void setLogoContentType(String logoContentType) {
this.logoContentType = logoContentType;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
// 获取项目部署的磁盘的绝对路径
String realPath = ServletActionContext.getServletContext().getRealPath("/");
// 指定目录创建文件
File file = new File(realPath, logoFileName);
// 复制到指定目录的文件
FileUtils.copyFile(logo, file);
// 删除临时文件
logo.delete();
// System.out.println(realPath);
// System.out.println(userName);
// System.out.println(logo);
// System.out.println(logoFileName);
// System.out.println(logoContentType);
return INPUT;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"/>
<!-- 全局大小 -->
<constant name="struts.multipart.maxSize" value="1024000"></constant>
<package name="file_pg" namespace="/" extends="struts-default">
<action name="upload" class="com.test.file.FileUploadAction">
<!-- 局部拦截 -->
<interceptor-ref name="defaultStack">
<!-- 上传文件最大容量 -->
<param name="fileUpload.maximumSize">10240</param>
<!-- 上传文件类型 -->
<param name="fileUpload.allowedTypes">image/jpeg,application/msword</param>
<!-- 上传文件后缀名字 -->
<param name="fileUpload.allowedExtensions">.jpg,.doc</param>
</interceptor-ref>
<result name="input">/upload.jsp</result>
</action>
</package>
<!-- localhost:8080/txkt/upload.action -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>
文件信息国际化:略
八、文件下载
download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<s:a namespace="/" action="download">文件下载1
<s:param name="fileName" value="%{'file1.jpg'}" />
</s:a>
<s:a namespace="/" action="download">文件下载2
<s:param name="fileName" value="%{'file2.jpg'}" />
</s:a>
<a
href="<%=request.getContextPath()%>/download.action?fileName=file3.jpg">文件下载3</a>
</body>
</html>
FileDownloadAction.java
package com.test.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileDownloadAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private String fileName;
private File file;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public InputStream getInputStream() throws FileNotFoundException {
return new FileInputStream(file);
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
// 获取下载文件的绝对路径
String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/download");
System.out.println(realPath + "\\" + fileName + "文件开始下载");
file = new File(realPath, fileName);
return SUCCESS;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 全局大小 -->
<constant name="struts.multipart.maxSize" value="1024000"></constant>
<package name="file_pg" namespace="/" extends="struts-default">
<action name="upload" class="com.test.file.FileUploadAction">
<!-- 局部拦截 -->
<interceptor-ref name="defaultStack">
<!-- 上传文件最大容量 -->
<param name="fileUpload.maximumSize">10240</param>
<!-- 上传文件类型 -->
<param name="fileUpload.allowedTypes">image/jpeg,application/msword</param>
<!-- 上传文件后缀名字 -->
<param name="fileUpload.allowedExtensions">.jpg,.doc</param>
</interceptor-ref>
<result name="input">/upload.jsp</result>
</action>
<action name="download"
class="com.test.file.FileDownloadAction">
<!-- 下载操作 -->
<result name="success" type="stream">
<!-- 允许下载的文件类型,指定为所有二进制文件类型,去tomcat的web.xml里面搜索 -->
<param name="contentType">application/octet-stream</param>
<!-- 对应就是Action中的方法,返回流的属性,实际就是getinputStream() -->
<param name="inputName">inputStream</param>
<!-- 下载头,包括:浏览器显示的文件名 -->
<param name="contentDisposition">attachment;filename=${fileName}.jpg</param>
<!-- 缓冲区大小设置 -->
<param name="bufferSize">1024</param>
</result>
</action>
</package>
<!-- localhost:8080/txkt/download.action -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>