Struts原理简介:http://blog.csdn.net/wfdmd/article/details/367675
struts1:
全局forward是都可以访问的,但是当需要使用forward时,strues自动安就近原则来选择。当局部也有定义时,就按照局部的来转。
Struts(草稿)
http://fatedgar.iteye.com/blog/1489255
Struts1.x教程:配置文件总结
http://jc-dreaming.iteye.com/blog/963784
struts1.X配置文件详解
http://www.cnblogs.com/Fskjb/archive/2010/07/04/1771001.html
struts-config.xml 参数解释
http://woshixushigang.iteye.com/blog/1153768
ActionForward是做什么的?
http://hi.baidu.com/baiduba/item/c0446ee1506a8d18585dd8ff
Struts中的URL传递的问题(forward标签的redirect属性)
http://www.binghe.org/2010/10/struts-forward-and-redirect/
=======================================================================
Struts 2 框架大致可以分为 3 个部分:核心控制器 FilterDispatcher 、业务控制器 Action 和用户实现的业务逻辑组件。核心控制器 FilterDispatcher 是 Struts 2 框架的基础 ,包含了框架内部的控制流程和处理机制。业务控制器 Action 和业务逻辑组件是需要用户来自己实现的。用户在开发 Action 和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器 FilterDispatcher 来使用。
Struts 2 基本简要流程如下:
1 、客户端浏览器发出 HTTP 请求。
2 、根据 web.xml 配置,该请求被 FilterDispatcher 接收。
3 、根据 struts.xml 配置,找到需要调用的 Action 类和方法, 并通过 IoC 方式,将值注入给 Aciton 。
4 、 Action 调用业务逻辑组件处理业务逻辑 ,这一步包含表单验证。
5 、 Action 执行完毕,根据 struts.xml 中的配置找到对应的返回结果 result ,并跳转到相应页面。
6 、返回 HTTP 响应到客户端浏览器。
<!--struts1.x 中 !--> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> ... </servlet> <!--Struts2.X 中 !--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
FilterDispatcher处理流程
在Struts 2中,最重要的一个类是org.apache.struts2.dispatcher.FilterDispatcher,用户通过浏览器提交一个(HttpServletRequest)请求后,请求被在web.xml中定义的过滤器FilterDispatcher拦截,在FilterDispatcher中主要经过大概3层过滤器的处理,分别是ActionContext CleanUp、其他过滤器(Othter Filters、SiteMesh等)、FilterDispatcher。
在FilterDispatcher过滤器中首先询问ActionMapper是否需要调用某个Action来处理请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy,ActionProxy通过配置文件struts.xml找到需要调用的Action类,然后ActionProxy创建一个ActionInvocation实例并调用该Action,但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor,等Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。
StrutsPrepareAndExecuteFilter
FilterDispatcher是早期struts2的过滤器,后期的都用StrutsPrepareAndExecuteFilter了,如 2.1.6、2.1.8。StrutsPrepareAndExecuteFilter名字已经很能说明问题了,prepare与execute,前者表示准备,可以说是指filter中的init方法,即配制的导入;后者表示进行过滤,指doFilter方法,即将request请求,转发给对应的 action去处理。
在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml文件完成初始化操作,struts2读取到的struts.xml的内容后,以javabean形式放在内存中,以后 struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件。
我们知道如果我们自己定义过滤器的话, 是要放在strtus2的过滤器之前的, 如果放在struts2过滤器之后,你自己的过滤器对action的过滤作用就废了,不会有效!除非你是访问jsp/html!
那我现在有需求, 我必须使用Action的环境,而又想在执行action之前拿filter做一些事, 用FilterDispatcher是做不到的.!
那么StrutsPrepareAndExecuteFilter可以把他拆分成StrutsPrepareFilter和StrutsExecuteFilter,可以在这两个过滤器之间加上我们自己的过滤器.!
给你打个比喻, 现在有病人要做手术, 现在struts2要做两件事, 搭病床(环境),执行手术.! 那么打麻药的工作呢.? 不可能要病人站着打吧, 所以必须有病床的环境,打完麻药之后再动手术.! 这个比喻非常形象了.!
探究Struts2运行机制:StrutsPrepareAndExecuteFilter 源码剖析
1.form提交如果用的是struts2的标签写的可以不带.action
在package中不加namespace属性就不用在login.action前加任何东西,否则需要在login.action前加上你的namespace
2.绝对路径是以斜杠(/)开头,相对于当前web项目的上下文路径 ,相对路径不以斜杠(/)开头,相当于当前执行的action路径。
3.Struts2还提供了一些命名对象,这些对象没有保存在值栈中,而是保存在ActionContext中,因此访问这些对象需要使用“#”标记。这些命名对象都是Map类型,如下:
parameters
例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")。
request
用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.get力Attribute ("userName")。
session
用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")。
application:#application.userName或者#application['userName']
attr:用于按page-request-session-application顺序访问其属性
4.%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值
<s:set name="foobar" value="#{'foo1':'bar','foo2':'bar2'}" />
不使用%:<s:url value="#foobar['foo1']" /></p>
结果: #foobar['foo1']
使用%:<s:url value="%{#foobar['foo1']}" /></p>
或: <s:url value="%{#foobar.foo1}" />
结果:bar
5.详见:
http://www.blogjava.net/max/archive/2006/12/06/85925.html
所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor 。除此之外,大家可能更喜欢继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor 。
import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class AuthorizationInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation ai) throws Exception { Map session = ai.getInvocationContext().getSession(); String role = (String) session.get( " ROLE " ); if ( null != role) { Object o = ai.getAction(); if (o instanceof RoleAware) { RoleAware action = (RoleAware) o; action.setRole(role); } return ai.invoke(); } else { return Action.LOGIN; } } }
6.文件上传:
详细见:http://tmsoft.lsxy.com/index.php?load=read&id=514
multipart/form-data:
这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
Struts2并未提供自己的请求解析器,也就是Struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts2在原有的上传解析器基础上做了进一步封装,简化了文件上传的代码实现,取消了不同上传框架上的编程差异,更进一步简化了文件上传。
Struts2默认使用的是Jakarta的Common-FileUpload框架 来上传文件,因此,要在web应用中增加两个Jar文件:commons- fileupload-1.2.jar和commons-io-1.3.1.jar。如果要改成其它的文件上传框架,可以修改struts.multipart.parser常量的值为cos/pell,默认值是jakata。并在classpath中增加相应上传组件的类库。
<s:form action="fileUpload" method="post" enctype="multipart/form-data"> <s:file name="doc" label="File"/> <s:submit/> <s:form>
private File image; / /上传文件域对象 private String imageFileName; / /文件名 private String imageContentType; ...get.set方法 @Override public String execute() throws Exception { String path=ServletActionContext.getServletContext().getRealPath("/upload"); if(image!=null){ File uploadPath=new File(new File(path),imageFileName); FileUtils.copyFile(image,uploadPath); ActionContext.getContext().put("message", "上传成功"); }else{ ActionContext.getContext().put("message", "上传失败"); } return "success"; }
此外,可以在struts.xml中配置上传文件的大小
<constant name="struts.multipart.maxSize" value="10701096"/> //最大上传配置成10M
默认的上传大小为2M
限制文件上传类型(max单位为K):
<action name="upload" class="com.struts2.UploadAction"> <result name="success">/success.jsp</result> <result name="input">/error.jsp</result> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/pjpeg</param> <!-- 上传文件的最大值,超过2M,这里就失去了作用 --> <param name="maximumSize">2000000</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action>
获取文件后缀:
int type = fileName.lastIndexOf("."); //返回指定字符在此字符串中最后一次出现处的索引 String index= fileName.substring(type); //subString(int beginIndex)
在success.jsp页中通过<s:property>获得文件的属性:
<s:property value="imageFileName"/> <s:property value="imageContentType"/>
//自己封装的一个把源文件对象复制成目标文件对象
private void copy(File src, File dec) { InputStream in = null; OutputStream out = null; in = new BufferedInputStream(new FileInputStream(src)); out = new BufferedOutputStream(new FileOutputStream(dec)); byte[] buff = new byte[1024]; while (in.read(buff) > 0)//文件是01字节码,read读到文件末尾返回-1,没读到末尾返回1 { out.write(buff); } }
思维拓展:如果要上传的文件非常大,如上传的是电影,好几百M ,用web上传一般是不可能难上传成功的,这时候要安装一个插件,类似于应用程序socket ,通过网络通讯上传。
文件下载:
http://hi.baidu.com/annleecn/blog/item/e14165074a2c117d0308816e.html
http://wenku.baidu.com/view/69b07c38376baf1ffc4fad78.html
判断文件是否是允许上传文件:
public static boolean isAllowUp(String logoFileName) { String allowTYpe = "gif,jpg,bmp,swf"; if (!logoFileName.trim().equals("") && logoFileName.length() > 0) { String ex = logoFileName.substring(logoFileName.lastIndexOf(".") + 1, logoFileName.length()); return allowTYpe.toString().indexOf(ex) >= 0; } else { return false; } }
1
相关推荐
### Struts2学习笔记 #### 一、Struts2配置文件详解 在深入理解Struts2框架之前,我们首先需要了解其核心配置文件——`struts.xml`。 **1. struts.xml配置** ```xml <!DOCTYPE struts PUBLIC "-//Apache ...
根据给定的文件信息,以下是对Struts2学习笔记中涉及的关键知识点的详细解析: ### Struts2框架概览 #### MVC模式的理解与演进 Struts2是基于MVC(Model-View-Controller)模式设计的一种Java Web开发框架。在MVC...
本笔记将全面总结Struts2的核心概念、主要功能以及实际开发中的应用。 一、Struts2概述 Struts2是Apache软件基金会下的一个开源项目,它继承了Struts1的优点并解决了其存在的问题,如性能和灵活性。Struts2的核心是...
Struts2是一个强大的Java web应用程序开发框架,它遵循Model-View-Controller (MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用。本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与...
### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...
张龙圣思园的Struts2学习笔记,无疑为Java开发者提供了一份宝贵的参考资料,它可能涵盖了Struts2的基础概念、核心组件、配置方式以及实战技巧。 首先,让我们深入了解Struts2的核心特性。Struts2是MVC(Model-View-...
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...
struts2学习笔记struts2学习笔记struts2学习笔记
struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换
### Struts2学习笔记之文件上传与Ajax开发 #### Struts2文件上传 **文件上传简介** 文件上传是Web应用中常见的功能之一,Struts2框架内置了对文件上传的支持,使得开发者能够轻松地实现这一功能。为了确保文件...
13. ** strut2四天笔记**:这份学习笔记可能涵盖了以上所有知识点,包括如何创建Action,配置struts.xml,使用OGNL表达式,处理异常,以及实践中的各种技巧和最佳实践。 在四天的学习过程中,你应该通过实践和理解...
Struts2是一个强大的MVC(Model-View-Controller)框架,它在Java Web开发中扮演着重要的角色。本文将深入探讨Struts2的核心概念,包括Namespace、标签、Action以及它们在实际开发中的应用。 一、Namespace ...
structs2很详细的学习笔记,structs2的建造,工作原理,例子,逐步讲解,纯文字的
在Struts2中,学习笔记通常会涵盖以下几个关键概念: 1. **源代码查看和Javadoc**:开发者可以通过查看源代码来理解Struts2的工作原理,而Javadoc则提供了API文档,帮助理解类和方法的功能。 2. **包(Package)和...