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
时更是将get
和post
的的参数值全部添加到自身来
一般我们并不需要额外的参数,所以定义为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
:有true
和false
两个值。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发送异步请求
使用javascript
或JQuery
发送异步请求,在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);
});
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了