struts2之url标签,文件上传下载和对ajax支持

1 url标签简介

<s:url>标签一般和超链接 <a>一起使用,用于带多个参数

<%@ taglib prefix="s" uri="/struts-tags"%> 
<a href=" 
<s:url action=""> 
   <s:param name=" " value=""></s:param>  
   <s:param name=" " value=""></s:param>  
   <s:param name=" " value=""></s:param>  
</s:url>" 

<s:url>生成一个url地址,可以通过url标签制定的<s:param>子元素向URL地址发送请求参数

<%@ taglib prefix="s" uri="/struts-tags"%> 
<s:url action=""> 指定请求地址 
<s:param name="" value=""></s:param> 指定参数 
</s:url> 

例子:

<%@ taglib prefix="s" uri="/struts-tags"%> 
<!--action是action的名字,为url添加参数使用param标签--> 
 <s:url var="urlName" action="mainPage">  
          <s:param name="id" value="123"/>  
</s:url>  
 
<!--使用上面定义的url-->  
<s:a href="%{urlName}">测试连接</s:a>  

该方法在生成的页面源码中生成如下代码  

<a href="/NetBookShop_081029/mainPage?id=123">测试连接</a>

1.1 includeParams属性

最重要的属性includeParams,该属性有三个值:none get all,默认值为get
属性值为get时,该url会将访问其所在jsp的的请求的所有get方法的参数添加到自身来
属性值为all时更是将getpost的的参数值全部添加到自身来
一般我们并不需要额外的参数,所以定义为none

<%@ taglib prefix="s" uri="/struts-tags"%> 
<s:url var="url" action="mainPage" includeParams="none">  
            <s:param name="id" value="123"/>  
    </s:url> 

1.2 includeContext属性

includeContext:有truefalse两个值。url中是否包含上下文,也就是在url中的项目名
这个一般不用改,让它自动包含,否则会定位到服务器的根目录下

<%@ taglib prefix="s" uri="/struts-tags"%> 
   <s:url var="url" action="mainPage" includeContext="false">  
      <s:param name="id" value="123"/>  
   </s:url>  

生成的url就下面的样子了
<a href="/mainPage?id=123">url</a>  

注意:在普通的html中使用/会定位到服务器的根目录,而在struts的标签里使用/会自动添加上下文,所以不用麻烦的指定项目名

1.3 Method属性

method用于指定执行action的方法,这个等同于action="mainPage!ok"

<%@ taglib prefix="s" uri="/struts-tags"%> 
       <s:url var="url" action="mainPage" method="ok">  
           <s:param name="id" value="123"/>  
       </s:url>  

1.4 namespace属性

namespace属性指定命名空间后,生成的url会使用相对路径,具体的看结果

<%@ taglib prefix="s" uri="/struts-tags"%> 
<s:url var="url" action="mainPage" namespace="user">  
    <s:param name="id" value="123"/>  
</s:url>

结果如下  
<a href="user/mainPage?id=123">url</a> 

2 文件上传和下载

2.1 文件上传

文件上传的步骤(利用fileUpload的拦截器完成的)

2.1.1 编写上传页面

<body>
  	<form action="" method="post" enctype="multipart/form-data">
  		文件:<input type="file" name="myfile"/><br>
  		<input type="submit" value="上传">
  	</form>
  </body>

2.1.2 编写处理上传的业务逻辑action

如果要获取上传文件的名称: 上传文件的属性名+ FileName
如果要获取上传文件的文件类型: 上传文件的属性名+ ContentType

import java.io.File;
import org.apache.commons.io.FileUtils;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
	private File myfile;//接受上传的文件
	private String myfileFileName;//上传文件的属性+FileName获取上传文件的名称,并绑定到该属性上
	private String myfileContentType;//上传文件的属性+ContentType获取上传文件的类型,并绑定到该属性上
	public File getMyfile() {
		return myfile;
	}
	public void setMyfile(File myfile) {
		this.myfile = myfile;
	}
	public String getMyfileFileName() {
		return myfileFileName;
	}
	public void setMyfileFileName(String myfileFileName) {
		this.myfileFileName = myfileFileName;
	}
	public String getMyfileContentType() {
		return myfileContentType;
	}
	public void setMyfileContentType(String myfileContentType) {
		this.myfileContentType = myfileContentType;
	}
	@Override
	public String execute() throws Exception {
		System.out.println(myfileFileName+"---"+myfileContentType);
		File uploadDir = new File("D:/upload");
		//如果上传文件的保存目录不存在,则创建该目录
		if(!uploadDir.exists())
			uploadDir.mkdirs();//创建目录
		//上传
		FileUtils.copyFile(myfile, new File(uploadDir,myfileFileName));
		return this.SUCCESS;
	}
}

2.1.3 配置struts.xml

<struts>
	<!--struts.multipart.maxSize定义允许上传的最大字节数,默认为2M  -->
	<constant name="struts.multipart.maxSize" value="209715200"></constant>
	<package name="upload" extends="struts-default">
		<action name="upload" class="cn.test.action.UploadAction">
			<!-- 如果result的name属性缺省,则默认值为success -->
			<result>/success.jsp</result>
		</action>
	</package>
</struts>

2.2 文件下载

文件下载:利用stream结果视图完成文件的下载

2.2.1 编写下载页面

<body>
	<a href="download.action?fileName=myblog.sql">下载--->myblog.sql</a>  	
	<a href="download.action?fileName=aopalliance.jar">下载--->aopalliance.jar</a>  	
  </body>

2.2.2 编写处理下载的业务逻辑Action

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 利用stream结果视图完成下载
 */
public class DownloadAction extends ActionSupport {
	private String fileName;//获取要下载的文件名称
	private InputStream inputStream;//输入流(将要下载的问题转换为输入流,结合stream结果视图完成下载操作)
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	
	public InputStream getInputStream() {
		return inputStream;
	}
	public void setInputStream(InputStream inputStream) {
		this.inputStream = inputStream;
	}
	@Override
	public String execute() throws Exception {
		File file = new File("D:/upload",fileName);//将要下载的文件转为File对象
		inputStream = new FileInputStream(file);//转换为输入流
		return this.SUCCESS;
	}
}

2.2.3 配置struts.xml

<action name="download" 
	class="cn.test.action.DownloadAction">
	<result name="success" type="stream">
	<!--回调action中getInputStream()方法获取文件流的数据,命名应该为流的属性名称 -->
	<param name="inputName">inputStream</param>
	<!-- 设置文件下载的类型 application/octet-stream对下载类型不做限制 -->
	<param name="contentType">application/octet-stream</param>
	<!-- attachment;以附件的方式保存,  filename="下载文件保存的名称" ${属性名}可以获取action中属性的值 -->
	<param name="contentDisposition">attachment;filename=${fileName}</param>
	</result>
</action>

3 struts2对ajax支持

3.1 使用javascript发送异步请求

使用javascriptJQuery发送异步请求,在action中使用response对象输出结果。(将业务逻辑action当做servlet来使用)。
需求:实现用户是否可用的校验

3.1.1 编写请求页面,使用jquery发送异步请求

用户名:<input type="text" name="userName" id="userName"/><span id="msg"></span>
	//用户名校验
    $("#userName").blur(function(){
    	var userName = $(this).val();//获取输入的用户名
    	$.get("check.action?userName="+userName,function(data){
    	//alert(data);
    	$("#msg").html(data);
    	});
    });

3.1.2 编写业务逻辑action

编写业务逻辑action,在业务逻辑action查询用户名是否存在,并使用out对象向客服端输出结果

import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.opensymphony.xwork2.ActionSupport;
public class CheckAction extends ActionSupport implements ServletResponseAware{
	private String userName;
	private HttpServletResponse response;
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	@Override
	public String execute() throws Exception {
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		//根据用户输入的用户名到数据库中查找是否存在
		if("admin".equals(userName)){
			out.print("<font color='red'>用户名已存在!</font>");
		}else{
			out.print("<font color='green'>用户名可用!</font>");
		}
		return this.NONE;
	}
	@Override
	public void setServletResponse(HttpServletResponse arg0) {
		this.response=arg0;
	}
}

3.1.3 配置struts.xml

<package name="ajaxDemo" extends="struts-default">
		<action name="check" class="cn.test.action.CheckAction">
		</action>
	</package>

3.2 使用struts2-json-plugin插件

使用struts2-json-plugin插件将java对象与json对象相互转换
在项目中添加struts2-json-plugin-xxx.jar文件,在该jar文件有一个struts-plugin.xml配置文件,内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <package name="json-default" extends="struts-default">
        <result-types>
            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
            <result-type name="jsonActionRedirect" class="org.apache.struts2.json.JSONActionRedirectResult"/>
        </result-types>
        <interceptors>
            <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
            <interceptor name="jsonValidation" class="org.apache.struts2.json.JSONValidationInterceptor"/>
            <!-- Sample JSON validation stack -->
            <interceptor-stack name="jsonValidationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel</param>
                </interceptor-ref>
                <interceptor-ref name="jsonValidation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>
        </interceptors>
    </package>
</struts>

3.2.1 编写业务逻辑Action

编写业务逻辑Action,在业务逻辑action中查询用户信息

public class ListAction extends ActionSupport{
	private List<Userinfo> list ;
	
	public List<Userinfo> getList() {
		return list;
	}
	public void setList(List<Userinfo> list) {
		this.list = list;
	}
	@Override
	public String execute() throws Exception {
		//从数据库中查询用户信息
		list =  new ArrayList<Userinfo>();
		for(int i=1;i<5;i++){
			Userinfo user = new Userinfo();
			user.setUserId(i);
			user.setUserName("zhangsan"+i);
			user.setUserPass("zhangsan"+i);
			list.add(user);
		}
		return "list";
	}
}

3.2.2 配置struts.xml,package需要继承json-default包

<package name="ajaxDemo2" extends="json-default">
		<action name="list" class="cn.test.action.ListAction">
			<result name="list" type="json">
				<param name="root">list</param>
			</result>
		</action>
	</package>

3.2.3 编写展示页面

<input type="button" value="加载用户信息" id="loadBtn"/>
  	<table align="center" border="1" id="userTbl">
  		<thead>
  			<tr>
  				<th>用户编号</th>
  				<th>用户名称</th>
  				<th>用户密码</th>
  			</tr>
  		</thead>
  		<tbody>
  		
  		</tbody>
  	</table>
	//加载用户信息
    		$("#loadBtn").click(function(){
    			$.post("list.action",function(data){
    				var content="";
    				for(var i=0;i<data.length;i++){
    					 var user = data[i];  
    					 //alert(user.userId+"---"+user.userName+"---"+user.userPass);
    					 content+="<tr><td>"+user.userId+"</td><td>"+user.userName+"</td><td>"+user.userPass+"</td></tr>";
    				}
    				//alert(content);
    				$("#userTbl > tbody").html(content);
    			});
    		});
posted @ 2021-09-21 20:12  上善若泪  阅读(72)  评论(0编辑  收藏  举报