Struts2运行流程、上传下载

Struts2运行流程:


jsp请求页面->过滤器->代理Actionproxy(读取struts.xml配置信息)->产生一个ActionInvocation执行对象->action(在操作action过程,可能有拦截器在这个action前,后和过程中操行)->返回页面


Struts2框架组成部分:
1.ActionMapper
在HTTP请求和action调用请求间提供了一个映射,用来判断请求的URL是否有对应的action调用,如果有,则返回一个ActionMapping,否则返回null。
2.ActionProxy
在框架执行过程中的代理对象,通过该对象获取配置,封装拦截器、result等代码。
3.ActionInvocation
Action执行对象,被ActionProxy持有。它持有拦截器,action实例,结果映射和ActionContext。
4.ActionContext
action执行的上下文,每一个上下文都提供了一个action调用所需的一组对象,包含了大量执行器的运行环境信息。每个线程都具有独立的ActionContext,所以是线程安全的。
5.Result
action执行之后的结果,支持多种不同类型的结果输出。


拦截器和过滤器的区别:
1、拦截器不依赖Servlet容器,而过滤器依赖Servlet容器
2、拦截器只对Action请求起作用,而过滤器对所有请求起作用
3、拦截器可以访问Action上下文、值栈中的数据,而过滤器不能
4、拦截器主要用在Action的方法执行前后调用一些其他操作,对Action进行过滤操作,而过滤器主要面向web中的信息过滤处理,对requeset,response进行过滤(如,设置编码方式,用户登录过滤器,非法字符过滤器)


拦截器注解:@Before,@After,@BeforeResult
@Before:
标注Action类中的方法,在Action方法执行前被调用
如果标注的方法有返回值,并且不为null,那么他的返回值将作为Action的结果代码
@After:
标注Action类中的方法,在Result之后被调用,如果标注的方法有返回值,将被忽略
@BeforeResult:
标注Action类中的方法,在Action方法执行后,Result执行前被调用(替代PreResultListener实现)如果标注的方法有返回值,将被忽略


实例:
<interceptors>
<interceptor name="annotationInterceptor" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"/>
<interceptor name="timer" class="interceptor.TimerInterceptor"></interceptor>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="annotationInterceptor"></interceptor-ref>
<interceptor-ref name="timer">
<param name="includeMethods">find*</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>


<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>




struts2实现上传下载


在建立表单时,必须指定enctype="multipart/form-date"
例:
<form action="upload.action" method="post" enctype="multipart/form-date">
  <input type="file" name="img"/>
  <input type="submit" value="提交"/>
</form>
上传文件的时候不能通过ServletRequest接口的getParameter()方法来读取上传的内容,而需要调用ServletRequest接口的getInputStream()来获得输入流,然后从输入流中读取传送的内容,再对文件上传格式进行分析,取出上传文件的内容和表单文件中其他字段的值。


文件选择域:
<input type="file" name="pic"/>
在action中,必须定义这三个,格式如下:
File pic;//上传文件的file对象
String picFileName;//上传文件名
String picContentType;//上传文件的内容类型(MIME类型)


获得上传目录
ServletActionContext.getServletContext().getRealPath("/");
生成上传文件名(UUID)
UUID.randomUUID().toString().replaceAll("-","");
写入上传文件
FileUtils.copyFile(pic,file);


Struts2下载


1、下载方法
public String download(){
products = productsService.get(products.getPid());
return "download";
}
2、返回文件的流对象
public InputStream getInputStream(){
return ServletActionContext.getServletContext().getResourceAsStream("/" + uploadDir + "/" + products.getPic());
}
3、提供get方法为fileName参数提供下载名
public String getFileName(){
String ex = "";
if(products.getPic().indexOf(".")!= -1){
ex = products.getPic().substring(products.getPic().lastIndexOf("."));
}

return products.getPname()+ex;
}
下载的struts.xml配置:
<result name="download" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="contentDisposition">attachment;filename*=utf-8'zh_cn'${fileName}</param>
<param name="bufferSize">8192</param>
</result>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值