`
uule
  • 浏览: 6351729 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Struts2学习笔记!

阅读更多

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 源码剖析

 STRUTS2核心控制器:FilterDispatcher

FilterDispatcher处理流程

 

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

  • 大小: 45.7 KB
分享到:
评论

相关推荐

    struts2学习笔记!

    ### Struts2学习笔记 #### 一、Struts2配置文件详解 在深入理解Struts2框架之前,我们首先需要了解其核心配置文件——`struts.xml`。 **1. struts.xml配置** ```xml &lt;!DOCTYPE struts PUBLIC "-//Apache ...

    Struts2学习笔记

    根据给定的文件信息,以下是对Struts2学习笔记中涉及的关键知识点的详细解析: ### Struts2框架概览 #### MVC模式的理解与演进 Struts2是基于MVC(Model-View-Controller)模式设计的一种Java Web开发框架。在MVC...

    struts2学习笔记总结

    本笔记将全面总结Struts2的核心概念、主要功能以及实际开发中的应用。 一、Struts2概述 Struts2是Apache软件基金会下的一个开源项目,它继承了Struts1的优点并解决了其存在的问题,如性能和灵活性。Struts2的核心是...

    struts2学习笔记(完美总结)——转自OPEN经验库

    Struts2是一个强大的Java web应用程序开发框架,它遵循Model-View-Controller (MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用。本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与...

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

    张龙圣思园struts2学习笔记word

    张龙圣思园的Struts2学习笔记,无疑为Java开发者提供了一份宝贵的参考资料,它可能涵盖了Struts2的基础概念、核心组件、配置方式以及实战技巧。 首先,让我们深入了解Struts2的核心特性。Struts2是MVC(Model-View-...

    struts2学习笔记.doc

    ### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...

    struts2学习笔记(1)

    ### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...

    struts2学习笔记

    struts2学习笔记struts2学习笔记struts2学习笔记

    struts2学习笔记3数据类型转换

    struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换

    struts2学习笔记黑马程序员

    ### Struts2学习笔记之文件上传与Ajax开发 #### Struts2文件上传 **文件上传简介** 文件上传是Web应用中常见的功能之一,Struts2框架内置了对文件上传的支持,使得开发者能够轻松地实现这一功能。为了确保文件...

    struts2四天的学习笔记

    13. ** strut2四天笔记**:这份学习笔记可能涵盖了以上所有知识点,包括如何创建Action,配置struts.xml,使用OGNL表达式,处理异常,以及实践中的各种技巧和最佳实践。 在四天的学习过程中,你应该通过实践和理解...

    struts2 学习笔记 实战

    Struts2是一个强大的MVC(Model-View-Controller)框架,它在Java Web开发中扮演着重要的角色。本文将深入探讨Struts2的核心概念,包括Namespace、标签、Action以及它们在实际开发中的应用。 一、Namespace ...

    struts2学习笔记(详细文字)

    structs2很详细的学习笔记,structs2的建造,工作原理,例子,逐步讲解,纯文字的

    struts 2 学习笔记

    在Struts2中,学习笔记通常会涵盖以下几个关键概念: 1. **源代码查看和Javadoc**:开发者可以通过查看源代码来理解Struts2的工作原理,而Javadoc则提供了API文档,帮助理解类和方法的功能。 2. **包(Package)和...

Global site tag (gtag.js) - Google Analytics