关于Struts2文件上传与自定义拦截器的完整攻略
文件上传
环境配置
在使用Struts2进行文件上传之前,需要进行相关的环境配置。首先需要在struts.xml
文件中配置org.apache.struts2.dispatcher.multipart.MultiPartRequest
类型的解析器:
<constant name="struts.multipart.parser" value="jakarta-stream" />
同时,需要将common-fileupload
和commons-io
这两个依赖包添加到pom.xml
文件中:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
实现文件上传功能
实现文件上传的方法很简单,只需要在表单中添加<input type="file" name="file"/>
元素,并在Action类中添加对应的属性即可。例如:
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="上传文件"/>
</form>
public class UploadAction extends ActionSupport {
private File file;
private String fileContentType;
private String fileFileName;
// 省略get和set方法
public String execute() throws Exception {
// 构建上传文件保存路径
String savePath = ServletActionContext.getServletContext().getRealPath("/") + "upload/";
File saveDir = new File(savePath);
if (!saveDir.exists()) {
saveDir.mkdir();
}
File destFile = new File(savePath + File.separator + fileFileName);
// 将上传的文件保存到服务器端
FileUtils.copyFile(file, destFile);
return SUCCESS;
}
}
在上述代码中,file
属性保存了上传的文件,fileContentType
保存了文件的类型,fileFileName
保存了文件的原始名称。通过FileUtils.copyFile
方法将文件保存到服务器端。
自定义拦截器
实现拦截器
自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor
接口,并重写init
、intercept
和destroy
三个方法。例如:
public class MyInterceptor implements Interceptor {
@Override
public void init() {
// 初始化拦截器
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 在Action执行前执行的代码
ActionContext context = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
String username = (String) request.getSession().getAttribute("username");
if (StringUtils.isBlank(username)) {
return "login";
}
String result = invocation.invoke();
// 在Action执行后执行的代码
return result;
}
@Override
public void destroy() {
// 销毁拦截器
}
}
在上述代码中,init
方法用于初始化拦截器,intercept
方法用于在Action执行前和执行后执行拦截器代码,destroy
方法用于销毁拦截器。
配置拦截器
自定义拦截器需要在struts.xml
文件中配置。例如:
<interceptors>
<interceptor name="myInterceptor" class="com.example.MyInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="myInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
在上述代码中,将自定义的拦截器MyInterceptor
配置为拦截器栈的第一个拦截器,并将默认的拦截器栈设置为该拦截器栈。
示例
下面是一个使用自定义拦截器的示例。在发送请求时,如果没有登录,会被拦截器重定向到login
页面:
public class HelloAction extends ActionSupport {
public String execute() throws Exception {
return SUCCESS;
}
}
public class LoginAction extends ActionSupport {
private String username;
private String password;
// 省略get和set方法
public String execute() throws Exception {
if ("admin".equals(username) && "123456".equals(password)) {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.setAttribute("username", username);
return SUCCESS;
} else {
return ERROR;
}
}
}
<action name="hello" class="com.example.HelloAction">
<result>/hello.jsp</result>
<interceptor-ref name="defaultStack"/>
</action>
<action name="login" class="com.example.LoginAction">
<result name="success">/hello.jsp</result>
<result name="error">/login.jsp</result>
<interceptor-ref name="defaultStack"/>
</action>
在以上代码中,HelloAction
和LoginAction
都配置了默认的拦截器栈,即myInterceptor
和默认的拦截器栈。在访问hello
页面时,如果没有登录,会被拦截器重定向到login
页面。在登录后会将用户名存入HttpSession
中,下次请求会话中存在username
属性时,则通过拦截器,执行Action方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Struts2文件上传与自定义拦截器 - Python技术站