`
uule
  • 浏览: 6310419 次
  • 性别: 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学习笔记!因为还没有全部学完,所以分部分分享!主要内容:struts.xml配置,web.xml配置 Action要点!全局类型转换,部分类型转换,类型转换文件 类型装换错误的处理问题局部使用,把中文汉字转换为编码 struts2对...

    struts2学习笔记总结

    struts2学习笔记总结

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

    struts2学习笔记,非本人所写,但有学习的价值,总结的很好,分享一个!

    Struts2学习笔记

    Struts2学习笔记,介绍了struts2的基础部分

    struts2 学习重点笔记

    这是学习struts2时记得重点笔记,包括了一些原理,ognl语句的编写,以及如何设置拦截器等等一些基本知识,起到复习和巩固的作用

    struts2学习笔记

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

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

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

    struts2学习笔记.doc

    本人学习struts2的笔记,希望大家可以多多学习以后共同交流

    struts2学习笔记(1)

    1. struts2框架的引入 1)把struts2的相关jar包导入到项目中去 2)把struts2框架的配置文件struts.xml复制粘贴到项目中的src下面(同时也可以把log4j.properties放到src下) 在这里我们主要是要的这个struts.xml文件...

    struts2 学习笔记 实战

    namespace :对应与项目名称后面的"/"(例如Struts2_0100_Introduction后面的"/") (http://localhost:8080/Struts2_0100_Introduction/) 四、 标签 是用来解决重名的问题,例如当系统的前台和后台都有一个action...

    struts2学习笔记(详细文字)

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

    struts2四天的学习笔记

    struts2四天的学习笔记。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    struts2学习笔记黑马程序员

    个人收藏,纯属备份作用,做个记录,方便需要时候查看

    Struts+spring+hibernate学习笔记! - Struts原理与实践 - JavaEye知识库.files

    Struts+spring+hibernate学习笔记! - Struts原理与实践

Global site tag (gtag.js) - Google Analytics