1、2018/11/5,1,梅花香自苦寒来!,2018/11/5,2,| 海 有 | 壁 无 |一份耕耘。 | 纳 容 | 立 欲 |一分收获。| 百 乃 | 千 则 |岂能事事如意,但求无愧于心。| 川 大 | 仞 刚 |把微笑留给世界,让世界因你微笑!,3,温故而知新!,4,第1章 Struts2框架技术入门,1.1 Struts2基础知识 1.2 Struts2的核心组件 1.3 基于Struts2的登录系统实例,5,1.1 Struts2基础知识,1.1.1 Struts2的由来与发展 1.1.2 Struts2软件包的下载和配置 1.1.3 MVC设计模式 1.1.4 Struts2的工
2、作原理,6,7,8,第1章 Struts2框架技术入门,1.1 Struts2基础知识 1.2 Struts2的核心组件 1.3 基于Struts2的登录系统实例,9,1.2 Struts2的核心组件,1.2.1 Struts2的控制器组件 1.2.2 Struts2的模型组件 1.2.3 Struts2的视图组件,10,第1章 Struts2框架技术入门,1.1 Struts2基础知识 1.2 Struts2的核心组件 1.3 基于Struts2的登录系统实例,11,1.3 基于Struts2的登录系统实例,1.3.1 使用NetBeans7开发项目 1.3.2 使用MyEclipse9开发
3、项目 1.3.3 使用Eclipse开发项目,12,第2章 Struts2核心组件详解,13,第2章 Struts2核心组件详解,2.1 Struts2的struts.xml配置文件 2.2 Struts2的核心控制器FilterDispatcher 2.3 Struts2的业务控制器Action 2.4 Struts2的OGNL表达式 2.5 Struts2的标签库,14,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1
4、.7 Action配置 2.1.8 结果配置 2.1.9 拦截器配置,15,2.1.1 struts.xml配置文件结构,Struts2的核心配置文件是struts.xml,struts.xml具有重要的作用,所有用户请求被Struts2核心控制器FilterDispatcher拦截,然后业务控制器代理通过配置管理类查询配置文件struts.xml中由哪个也Action处理。 Struts2框架有两种配置文件:struts.xml和struts.properties,一般建议使用struts.xml。,16,【例2-1】struts.xml配置文件的基本结构(struts.xml),17,/l
5、ogin/login.jsp/login/success.jsp,18,2007年发布Struts2.0,Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并,全新的Struts2框架。其全新的Struts2的体系结构与Struts1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。因此Struts2和Struts 1有着太大的变化,但是相对于 WebWork,Struts2只有
6、很小的变化。,19,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1.7 Action配置 2.1.8 结果配置 2.1.9 拦截器配置,20,Struts2框架是一个具有高度可扩展性的Java Web框架,其许多核心组件不是以直接编码的方式写在代码中,而是通过配置文件以IoC(控制反转)容器来管理这些组件。Struts2可以通过配置方式管理其核心组件,从而允许开发者很方便的扩展这些核心组件。当需要扩展这些组件的时候,把自
7、定义的组件实现类在Struts2的IoC容器中配置即可。,2.1.2 Bean配置,21,Bean配置在struts.xml中的配置格式如下:元素的常用属性有: name:指定Bean实例化对象名字,对于相同类型的多个Bean,其对应的name属性值不能相同,该项是可选项。 class:指定Bean实例的实现类,即对应的类,该项是必选项。 type:指定Bean实例实现的Struts2规范,该规范通常是通过某个接口来体现的,因此该属性的值通常是一个Struts2接口。如果配置Bean作为框架的一个核心组件来使用,就应该指定该属性,该项是可选项。 scope:指定Bean的作用域,该项是可选项。
8、 optional:指定该Bean是否是一个可选Bean,该项是可选项。 static:指定允许不创建Bean,而是让Bean接受框架常量,这时值设为true。但是当指定了type属性时,该属性不能设为true。,22,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1.7 Action配置 2.1.8 结果配置 2.1.9 拦截器配置,23,Struts2加载常量的顺序是:struts.xml、struts.propert
9、ies和web.xml,如果在这3个文件中对某个变量有重复配置的,后一个文件中配置的常量值会覆盖后面文件中的同名常量值。所以常量配置可以在不同的文件进行配置。 一般习惯在struts.xml中配置Struts2的属性,而不是在struts.properties文件配置Struts2的属性;之所以保留使用struts.properties文件配置Struts2属性的方式,主要是为了保持与WebWork框架的向后兼容性。,2.1.3 常量配置,24,常量配置在struts.xml中的配置格式如下:元素的常用属性有: name:指定常量(属性)的名字。 value:指定常量的值。,25,例如,在st
10、ruts.xml文件中,配置国际化资源文件名和字符集的编码方式为“gb2312”,代码如下:对应的配置在struts.properties文件中的配置代码如下: struts.custom.i18n.resources=messageResource struts.custom.i18n.encoding=gb2312,26,对应的配置在web.xml文件中的配置代码如下:struts2org.apache.struts2.dispatcher.FilterDispatcherstruts.custom.i18n.resourcesmessageResourcestruts.custom.i1
11、8n.encodinggb2312,27,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1.7 Action配置 2.1.8 结果配置 2.1.9 拦截器配置,28,2.1.4 包含配置,在企业开发一个项目的时候,都是采用模块开发的方式,一个项目由多个模块,每个模块项目组或者某些程序员来开发,每个程序员都可以使用自己的配置文件,然后把各个模块集成在一起。Struts2的配置文件struts.xml提供了元素能够把其他程序员
12、开发的配置文件包含过来,但是被包含的每个配置文件必须和struts.xml格式一样。元素可以和元素交替出现,Struts2框架将按照顺序加载配置文件。 包含配置在struts.xml中的配置格式如下:元素的常用属性有: flie:指定文件名,必选项。,29,包含配置避免开发复杂项目时配置struts.xml过于庞大,导致读取配置文件速度较慢,同时有利于模块化开发。,30,例如,下载的Struts2实例都放在图1-4(请参考1.1.2)“apps”文件夹中,其中有一个struts2-portlet.war例子,解压后找到struts.xml,如图2-1所示,对应的struts.xml代码如【例2
13、-2】所示。,31,【例2-2】实例struts2-portlet.war的配置文件(struts.xml),32,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1.7 Action配置 2.1.8 结果配置 2.1.9 拦截器配置,33,在Struts2框架中,通过包配置来管理Action和拦截器的。在包中可以配置多个Action和拦截器。在struts.xml配置文件中包的配置是通过元素来配置的。 包含配置在strut
14、s.xml中的配置格式如下: 元素的常用属性有: name:指定包名,是其他包继承的时候使用的属性,必选项。 extends:指定要继承的包名,可选项。 namespace:定义包的名称空间,可选项。 abstract:指定该包是否是一个抽象包,如果该包是抽象包,包中不能定义action。,2.1.5 包配置,34,配置包时必须指定name属性,只有指定了这个属性后此包才可以被引用,extends属性用来指定该包继承于其他的包,其值必须是另外一个包的名字。通过继承,子包可以继承父包配置的Action和拦截器。上述代码定义的包名是zzf,继承的包是struts-default,struts-de
15、fault包是Struts2框架的默认包。,35,【例2-3】包的配置(struts.xml) /login/login.jsp/login/success.jsp,36,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1.7 Action配置 2.1.8 结果配置 2.1.9 拦截器配置,37,在Java语言中为了避免同名的Java类的冲突,可以使用包。例如,两个Login.java文件存在同一个包中是不允许的,但是如果在
16、两个包中是可以的。同样Struts2的配置中,也存在同名的Action命名问题。 命名空间配置在struts.xml中的配置格式如下: ,2.1.6 命名空间配置,38,【例2-4】名称空间配置(struts.xml) /login/login.jsp/login/success.jsp/manager/login.jsp/manager/success.jsp,39,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1.7
17、Action配置 2.1.8 结果配置 2.1.9 拦截器配置,40,Struts2中Action类的配置能够让Struts2知道Action的存在,并可以通过调用该Action来处理用户请求。Struts2使用包来组织和管理Action。 Action配置在struts.xml中的配置格式如下: 元素的常用属性有: name:指定客户端发送请求的地址映射名称,必选项。 class:指定Action对应的实现类,可选项(参考2.3.1)。 method:指定Action类中处理方法名,如get或post方法,可选项。 converter:指定Action类型转换器的完整类名,可选项。,2.1.
18、7 Action配置,41,【例2-5】Action配置(struts.xml) /login/login.jsp/login/success.jsp,42,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1.7 Action配置 2.1.8 结果配置 2.1.9 拦截器配置,43,2.1.8 结果配置,元素用来为Action的处理结果指定一个或者多个视图,配置Struts2中逻辑视图和物理视图之间的映射关系。 结果配置在s
19、truts.xml中的配置格式如下: 元素的常用属性有: name :指定Action返回的逻辑视图,必选项。 type:指定结果类型是定向到其他文件,该文件可以是JSP文件或者Action类,可选项。,44,2.1 Struts2的struts.xml配置文件,2.1.1 struts.xml配置文件结构 2.1.2 Bean配置 2.1.3 常量配置 2.1.4 包含配置 2.1.5 包配置 2.1.6 命名空间配置 2.1.7 Action配置 2.1.8 结果配置 2.1.9 拦截器配置,45,拦截器的作用就是执行Action处理用户请求之前或者之后,执行拦截器来进行某些拦截操作。例如
20、,用户请求删除某些数据时,拦截器判断用户是否有权删除,如果有权限,就通过Action删除,如果没有权限将不执行Action操作。,2.1.9 拦截器配置,46,拦截器在struts.xml中的配置格式如下:.元素常用属性有: name:指定拦截器的名字,该名字用于在其他地方引用该拦截器。 class:指定拦截器类所在的路径名称。,47,第2章 Struts2核心组件详解,2.1 Struts2的struts.xml配置文件 2.2 Struts2的核心控制器FilterDispatcher 2.3 Struts2的业务控制器Action 2.4 Struts2的OGNL表达式 2.5 Stru
21、ts2的标签库,48,2.2 Struts2的核心控制器FilterDispatcher,FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。 Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务控制器组件,例如,对于login.action请求,Struts2调用名为login的Action来处理该请求。 Struts2应用中的Action都
22、被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。 Struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理,因为用户实现的业务控制器并没有与ServletAPI耦合,显然无法处理用户请求。而Struts2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action的execute()方法来处理用户请求。,
23、49,第2章 Struts2核心组件详解,2.1 Struts2的struts.xml配置文件 2.2 Struts2的核心控制器FilterDispatcher 2.3 Struts2的业务控制器Action 2.4 Struts2的OGNL表达式 2.5 Struts2的标签库,50,2.3 Struts2的业务控制器Action,2.3.1 Action接口和ActionSupport类 2.3.2 Action实现类 2.3.3 Action访问ActionContext 2.3.4 Action直接访问Servlet API 2.3.5 Action中的动态方法调用,51,2.3.1
24、 Action接口和ActionSupport类,为了能够开发出更加规范的Action类,Struts2提供了Action接口,该接口定义了Struts2中Action类中应该使用的规范。如【例2-6】所示。 【例2-6】Struts2类库中的Action接口(Action.java) public interface Action /声明常量public static final String SUCCESS = “success“;public static final String NONE = “none“;public static final String ERROR = “err
25、or“;public static final String INPUT = “input“;public static final String LOGIN = “login“;/声明方法public String execute() throws Exception; ,52,另外,Struts2为Action接口提供一个实现类ActionSupport 。 ActionSupport类是一个默认的Action实现类,该类提供了许多默认的方法,如获取国际化信息的方法、数据验证的方法、默认处理用户请求的方法等。ActionSupport类是Struts2默认的Action处理类,如果编写业务
26、控制器类时继承了ActionSupport类,则大大简化业务控制器类的开发。 在开发Web项目时可以直接使用ActionSupport类作为业务控制器。在struts.xml中配置Action时,如果没有指定class属性(即没有提供用户的Action),系统自动使用ActionSupport类作为业务控制器Action。,53,2.3 Struts2的业务控制器Action,2.3.1 Action接口和ActionSupport类 2.3.2 Action实现类 2.3.3 Action访问ActionContext 2.3.4 Action直接访问Servlet API 2.3.5 Ac
27、tion中的动态方法调用,54,2.3.2 Action实现类,Struts2中的Action就是一个普通的Java类(POJO),该类不要求继承任何Struts2的父类,或者实现任何Struts2的接口,但是为了简化开发可以继承ActionSupport类。Action类通常包含一个execute()普通方法,该方法并没有任何参数,只是返回类型是字符串类型。Struts2中的Action是如果获取用户HTTP请求中的参数值?下面以【例2-8】来说明获取数据的过程。代码如【例2-8】所示,该例可参考1.3.1【例1-6】,是在其基础上进行改进了一部分功能,即增加了继承ActionSupport
28、类。,55,【例2-8】登录Action(LoginAction.java) package ch02Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupportprivate String userName;private String password;/setter和getter方法,56,public String execute() throws Exce
29、ptionif(getUserName().equals(“QQ“) ,57,2.3 Struts2的业务控制器Action,2.3.1 Action接口和ActionSupport类 2.3.2 Action实现类 2.3.3 Action访问ActionContext 2.3.4 Action直接访问Servlet API 2.3.5 Action中的动态方法调用,58,2.3.3 Action访问ActionContext,Struts2中的Action与Servlet API完全分离,实现了Action与Servlet API的非耦合性,也是对Struts1中的Action最大的改进。
30、虽然Struts2框架中的Action已经与Servlet API分离,但是在实现业务逻辑处理时,经常需要访问Servlet中的一些对象,如request、session和application等对象。Struts2框架中提供ActionContext类,在Action中可以通过该类获取Servlet中的参数。 在Web应用中,需要访问的Servlet API就是HttpServlet、HttpSession和ServletContext,这3个类包含了JSP内置对象中所对应的request、session和application对象。 ActionContext类是一个Action执行的上下
31、文,Action执行期间所用到的对象都保存在ActionContext中,如客户端提交的参数、session会话信息等。而且ActionContext是一个局部线程,每个线程中的ActionContext内容都是唯一的,所以不用担心Action的线程安全问题。,59,创建ActionContext实例如下: ActionContext ac=ActionContext.getContext(); ActionContext类中的常用方法如下: Object get(Object key):在ActionContext中查找key的值。 Map getApplication():返回一个appl
32、ication级别的Map对象。 static ActionContext getContext():获取当前线程的ActionContext对象。 Map getParameter():返回一个Map类型的所有HttpServletRequest参数。 Map getSession():返回Map类型的HttpSession值。 void put(Object key,Object value):向当前ActionContext存入值。 void setApplication(Map application):设置application对象的上下文。 void setSession(Map
33、session):设置session的值,参数为一个Map对象。,60,为了演示Struts2框架中Action是如何通过ActionContext类访问Servlet API的,下面通过登录系统来介绍。本实例通过登录业务逻辑,分别将用户名保存在application和session中,最后通过JSP页面输出用户信息。下面是项目的开发步骤。,61,1.项目介绍 该项目有登录页面(login1.jsp),代码如【例2-9】所示,其中使用了Struts2标签库中的标签,Struts2中的标签库的用法将在2.5中介绍;登录页面对应的业务控制器LoginAction1类,代码如【例2-11】所示,该A
34、ction继承了ActionSt类;如果登录成功(用户名、密码正确)到success1.jsp页面,页面代码如【例2-10】所示,该页面中也使用了Struts2的标签库;如果登录失败(用户名或者密码不正确)重新回到登录页面(login1.jsp)。其中还需要配置web.xml,代码和1.3.1中【例1-3】相同;配置struts.xml配置文件,如【例2-12】所示。登录系统的文件结构如图2-2所示。,62,图2-2登录系统的文件结构图,63,2.在web.xml中配置核心控制器FilterDispatcher 参照1.3.1中的【例1-3】。,64,3.编写视图组件(JSP页面) 登录页面如
35、图2-3所示。代码如【例2-9】所示。登录成功页面,如【例2-10】所示。,65,图2-3登录页面,66,【例2-9】登录页面(login1.jsp),67,68,【例2-10】登录成功页面(success1.jsp)获取application中的信息:欢迎获取session中的信息:欢迎,69,4.编写业务控制器Action 业务控制器LoginAction1是处理login1.jsp页面的,代码如【例2-11】所示。 【例2-11】登录页面对应的业务控制器(LoginAction1.java) package loginaction; import com.opensymphony.xwo
36、rk2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction1 extends ActionSupportprivate String userName;private String password;,70,public String getUserName()return userName;public void setUserName(String name)this.userName=name;public String getPassword()return pass
37、word;public void setPassword(String password)this.password = password;,71,public String execute() throws Exceptionif(getUserName().equals(“QQ“) ,72,5.修改struts.xml配置Action 修改struts.xml配置文件,如【例2-12】所示。 【例2-12】在struts.xml中配置Action(struts.xml)/login1.jsp/success1.jsp,73,6.项目部署和运行 运行后如图2-3所示,在输入用户名“QQ”和密
38、码“123”后,点击“登录”,运行效果如图2-4所示。,74,图2-4登录成功页面,75,2.3 Struts2的业务控制器Action,2.3.1 Action接口和ActionSupport类 2.3.2 Action实现类 2.3.3 Action访问ActionContext 2.3.4 Action直接访问Servlet API 2.3.5 Action中的动态方法调用,76,2.3.4 Action直接访问Servlet API,Struts2中直接访问Servlet API有IoC方式和非IoC方式。 IoC方式是访问Servlet API,Action必须实现一些接口。 非Io
39、C方式访问Servlet API是使用Struts2提供的辅助类来访问Servlet API,在Action直接访问Servlet API中提供的辅助类是ServletActionContext。 IoC(Inversion of Control)即控制反转。在Java项目开发中,IoC主要解决组件之间的依赖关系,降低模块之间的耦合度。IoC就是将设计好的类交给系统去控制,而不是在自己内部控制,这称为控制反转。通俗的解释是“站着别动,我去找你”。,77,1.IoC方式 在Struts2框架中,可以通过IoC方式将Servlet对象注入到Action中,需要在Action中实现以下接口: org
40、.apache.struts2.util.ServletContextAware:实现该接口的Action可以直接访问ServletContext对象,该接口中有void setServletContext(ServletContext servletContext)方法。 org.apache.struts2.interceptor.ServletRequestAware:实现该接口的Action可以直接访问HttpServletRequest对象,该接口有void setServletRequest(HttpServletRequest ruquest)。 org.apache.strut
41、s2.interceptor.ServletResponseAware:实现该接口的Action可以直接访问HttpServletResponse对象,该接口有void setServleResponse (HttpServletResponse response)。 org.apache.struts2.interceptor.SessionAware:实现该接口的Action可以直接访问HttpSession对象,该接口有void setSession(Map map)方法。,78,IoC方式访问Servlet API的登录系统业务控制器代码如【例2-13】所示。 【例2-13】IoC访问
42、方式的Action(IoCAction.java) package iocaction; import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.interceptor.ServletRequestAware; public class IoCAction extends ActionSupport implements ServletRe
43、questAwareprivate String userName;private String password;private HttpServletRequest request;,79,public String getUserName()return userName;public void setUserName(String name)this.userName=name;public String getPassword()return password;public void setPassword(String password)this.password = passwo
44、rd;,80,/必须实现该方法,该方法是接口中的方法public void setServletRequest(HttpServletRequest hsr) request=hsr; public String execute() throws Exceptionif(getUserName().equals(“QQ“) ,81,2.非IoC方式 在非IoC方式中,Struts2提供ServletActionContext类获得Servlet API。该类中的常用方法有: static getRequest():获取Web应用程序的HttpServletRequest对象。 static g
45、etResponse():获取Web应用程序的HttpServletResponse对象。 static getPageContext():获取Web应用程序的PageContext对象。 static getServletContext():获取Web应用程序的ServletContext对象。,82,非IoC方式访问Servlet API的登录系统业务控制器代码如【例2-14】所示。 【例2-14】非IoC访问方式的Action(NoIoCAction.java) package iocaction; import com.opensymphony.xwork2.ActionSupport
46、; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; public class NoIoCAction extends ActionSupportprivate String userName;private String password;,83,public String getUserName()return userName;public void setUserName(
47、String name)this.userName=name;public String getPassword()return password;public void setPassword(String password)this.password = password;,84,public String execute() throws Exceptionif(getUserName().equals(“QQ“) ,85,2.3 Struts2的业务控制器Action,2.3.1 Action接口和ActionSupport类 2.3.2 Action实现类 2.3.3 Action访
48、问ActionContext 2.3.4 Action直接访问Servlet API 2.3.5 Action中的动态方法调用,86,2.3.5 Action中的动态方法调用,在实际应用中,一个Action中可以完成一组紧密相关的业务操作,例如与一件商品相关的基本操作有增加商品、删除商品、修改商品和查看商品。 通过将增加商品、删除商品、修改商品和查看商品这些业务相关的操作合并到一个Action中,从而减少了Struts2框架中的Action数量,减少重复编码,使应用更加便于维护。 Struts2提供两种方式实现动态方法的调用:不指定method属性和指定method属性。,87,1.不指定me
49、thod属性 Struts2中所谓的不指定method属性是指,表单元素的action属性并不是直接等于某个Action的名字,且form表单不需要指定method属性。不指定method属性格式如下:或者在struts.xml中只需配置该Action,而不必配置每个方法。 不指定method属性在struts.xml中配置格式如下:/*.jsp/*.jsp ,88,2.指定method属性 Struts2中所谓的指定method属性是指,每个表单都有method属性,属性值指向在Action中定义的方法名。指定method属性格式如下:指定method属性需要在struts.xml中配置Action中的每个方法,而且每个Action配置中都要指定method属性,该属性值和表单属性值一致。 指定method属性在struts.xml中配置格式如下:/*.jsp/*.jsp ,89,本实例使用不指定method方式调用在Action中实现登录和注册业务逻辑。下面是项目的开发步骤。 1.项目介绍 Action中动态方法调用实例的文件结构如图2-5所示。,90,2.在web.xml中配置核心控制器FilterDispatcher 参照1.3.1中的【例1-3】。,