struts2 自学笔记(2)

Struts2 的结构

还是先看一个图:

这是 struts2 的结构图,我们可以看到, HttpServletRequest 请求到达后首先经过 ActionMapper ,然后经过 FilterDispatcher ,如果还有其他的 Filter ,一次经过,最后到达一个叫 ActionProxy 的地方,这个时候通过 ConfigurationManager 读取配置文件 struts.xml, 然后到达 ActionInvocation ,开始经过一个个的 Interceptor ,最后达到 Action 进行处理后返回结果。

 

初次咋看过程还挺复杂的,其实学习到一定程度之后感觉其实挺简单的,毕竟底层的很多细节我们不必关心,我们关心的只是请求达到我我们要接到请求进行处理,然后返回结果。

Struts2 详解

入门实例:

知道这些后,我们就可以开始来编写第一个 struts2 了。

开发 struts2 应用程序的步骤:

1, 建立工程,导入 struts2 的包

2, 编写 JSP 页面

3, 编写 Action

4, 编写 struts.xml 配置文件

5, 编写 web.xml 文件

下面是一个入门实例(实例一):

注:本教程所有实例原码都已上传到 CSDN ,需要的朋友可以去下载:

原码下载地址:

1, 建立工程,导入包:

导入 struts2 需要的包:复制到项目的 WebRoot/WEB_INF/lib 目录下

2, 编写 JSP 页面。

index.jsp

< body >

  < form action = "userAction" >

   用户名: < input type = "text" name = "username" />

      < input type = "submit" value = " 提交 " />

   </ form >

  </ body >

result.jsp:

< body >

    你的用户名: ${requestScope.username}

</ body >

3, 编写 Action UserAction

package com.gufengxiachen.struts2_1.action;

 

import com.opensymphony.xwork2.ActionSupport;

 

public class UserAction extends ActionSupport{

   private String username ;

  

   public String getUsername() {

      return username ;

   }

 

   public void setUsername(String username) {

      this . username = username;

   }

 

   @Override

   public String execute() throws Exception {

     

      return “success” ;

   }

 

}

4,  编写 struts.xml 文件

<? xml version = "1.0" encoding = "utf-8" ?>

<! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd" >

 

< struts >

   < package name = "struts2_1" extends = "struts-default" >

      < action name = "userAction" class = "com.gufengxiachen.struts2_1.action.UserAction" >

        < result name = "success" > /result.jsp </ result >       

      </ action >

   </ package >

</ struts >

5, 编写 web.xml 文件:

<? xml version = "1.0" encoding = "UTF-8" ?>

< web-app version = "2.5"

   xmlns = "http://java.sun.com/xml/ns/javaee"

   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee

   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >

  < welcome-file-list >

    < welcome-file > index.jsp </ welcome-file >

  </ welcome-file-list >

 

  < filter >

  < filter-name > struts2 </ filter-name >

  < filter-class > org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter </ filter-class >

  </ filter >

 

 

  < filter-mapping >

  < filter-name > struts2 </ filter-name >

  < url-pattern > /* </ url-pattern >

  </ filter-mapping >

 

</ web-app >

至此,第一个 struts2 项目已完成,可以部署运行了,当然这个项目非常简单,是一个入门级的项目,但任何大的项目都是从它身上扩展的,所以说弄清楚它的原理是非常重要的。

下面我们来分析这个项目的运行过程。

首先,用户在 index.jsp 页面填写用户名后提交表单,表单提交到什么地方呢?看到 <form action=”userAction”> ,就知道表单提交到 userAction.action

.action 可以省略, struts2 默认会加上后缀 .action 。在哪找到这个 Action

呢?它回去 web.xml 文件中找相关的配置,结果发现有个过滤器 StrutsPrepareAndExecuteFilter( 这个过滤器是 struts2 的过滤器,必须加上,不然就不是一个 struts2 项目,它的作用就是将请求交给 struts2 处理 ) ,然后经过一系列的处理(这里处理的内容很多,后面会详细介绍)最后在 struts.xml 文件中找到了 Action 的配置,接着将请求交给 UserAction 来处理,我们可以看到 UserAction 继承了 ActionSupport 类,实现了 execute 方法,该方法必须返回一个字符串,在这个方法中我们出来的很简单,就单单返回了一个字符串 ”success” ,还应该注意到这个 Action 有个属性 username ,并提供了 get/set 方法,我们好像根本没有看到从页面取参数的方法,哪它是如何取到参数的呢,正是这个 username 属性和它的 get/set 方法的用处,这里有一点要注意, setXXX 方法后的 XXX 必须和参数名相同除了第一个字母大写。这样才能取到参数。 execute 方法是 Action 的处理方法,当我们返回一个 success 字符串时,它就会去 struts.xml 文件相应的 Action 配置中寻找 name success result 标签,找到后返回它所指示的页面,本例中即 result.jsp 。在 result.jsp 中我们只是通过 EL 表达式取到返回的值。

上面即是这个实例的大致( struts2 内部还有很多处理)处理过程,是不是感觉也不是很难呢?

我们来总结一下 struts2 的大致处理过程:

页面 form 表单数据提交到一个 action struts2 的过滤( org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter )拦截请求,查找 struts.xml 文件里的 action 元素, action 元素的 name 属性值和 form 表单提交的 action 对应,则实例化 action 元素的 class 属性值对应的类,并且将 form 表单提交的值通过 setXxx ()方法设置到 class 类属性。

之后调用 action 类的 execute 方法,该方法必须返回一个字符串!根据返回的字符串在 action 元素的子元素 result name 属性 name 对应的值,如果匹配,则返回 result 元素值所指定的页面。


通常 每个 action 类都要 com.opensynphony.xwork2.ActionSupport

 

猜你喜欢

转载自wustrive-2008.iteye.com/blog/1057318