struts2框架深入

一、获取值栈(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>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值