struts2动态方法调用
在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免Action太多。
第一种方式:指定method属性
这种方式我们前面已经用到过,类似下面的配置就可以实现
<action name="chainAction" class="chapter2.action.Chapter2Action" method="chainAction">
<result name="chainAction" type="chain">redirect</result>
</action>
<action name="plainText" class="chapter2.action.Chapter2Action" method="plainText">
<result name="plainText" type="plainText">/WEB-INF/JspPage/chapter2/plaintext.jsp</result>
</action>
第二种方式:感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用.
用这种方式需要先开启一个开关
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 将此常量设置为true,这种方式才能使用,使用见示例
Action:
package chapter3.action;
public class Chapter3Action {
public String result1(){
return "result1";
}
public String result2(){
return "result2";
}
}
Jsp中访问方式
<body>
<a href="${basePath}/chapter3/chapter3Action!result1">result1</a><br>
<a href="${basePath}/chapter3/chapter3Action!result2">result2</a><br>
</body>
如果配置了后缀,必须这样写:
/chapter4/chapter4Action!create.action
XML中配置方式
<package name="chapter3" namespace="/chapter3" extends="struts-default">
<action name="chapter3Action" class="chapter3.action.Chapter3Action">
<result name="result1">/WEB-INF/JspPage/chapter3/result1.jsp</result>
<result name="result2">/WEB-INF/JspPage/chapter3/result2.jsp</result>
</action>
</package>
第三种方式:通配符方式(官网推荐使用)
首先得关闭开关
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
这一种方式是由第一种转变过来的,我们可以看到,第一种方式有很多重复的代码,那么我们可以进行变形,看下面的代码
<action name="chapter3_*" class="chapter3.action.Chapter3Action" method="{1}">
<result name="test">/…/test.jsp</result>
</action>
chapter3_*这里的*就是你呆会要匹配的字符串,即你在后面的请求中得这样写
http://...../ chapter3_create 或 http://...../ chapter3_update
注意,这时你action中必须有create和update方法与之匹配,甚至还可以这样匹配
<action name="chapter3_*" class="chapter3.action.Chapter3Action" method="{1}">
<result name="test">/…/{1}.jsp</result>
</action>
但是这时一定要有对应的JSP页面存在,并且相应的路径不能错,这就对我们的命名进行了强制性的规定,一定要规范.
课堂示例:
Action
public class Chapter4Action extends ActionSupport {
public String list(){
return "list";
}
public String create(){
return "create";
}
public String index(){
return "index";
}
}
XML:
<action name="chapter4_*" class="chapter4.action.Chapter4Action" method="{1}">
<result name="{1}">/WEB-INF/JspPage/chapter4/chapter4_{1}.jsp</result>
</action>
访问Servlet API
有时我们需要用到Request, Response, Session,Page, ServletContext这些我们以前常用的对象,那么在Struts2中怎么样使用到这些对象呢,通常有三种方式.
间接访问1
//向Session中放
ActionContext.getContext().getSession().put("wdpc", "Session中的WDPC");
//向request中放
ActionContext.getContext().put("wdpc","request中的WDPC");
//向application中放
ActionContext.getContext().getApplication().put("wdpc", "Application中的WDPC");
取值方式:
ActionContext.getContext().getSession().get("wdpc");
间接访问2
Struts2中提供了一个静态类,他里面的方法可以获取到我们的HttpServletResponse, HttpServletRequest, 然后呢就可以还原到我们以前的使用方式了.
直接访问
虽然Struts2提供了ActionContext来访问Servlet API,但是这种方式毕竟不能直接获取Servelt API实例,为了在Action中直接访问Servlet API,Struts2还提供了一系列接口
ServletContextAware 实现此接口后,可以取得ServletContext
ServletRequestAware 实现此接口后,可以取得HttpServletRequest
ServletResponseAware 实现此接口后,可以取得HttpServletResponse
SessionAware 实现此接口后,可以取得HttpSession,注意,这里有点特殊,取得的是一个Map<String,Object> session,拦截器负责将session中存储的键值进行解析,并一一对应.
所以我们通常的做法是:
public class BaseAction implements ServletResponseAware, ServletRequestAware,
SessionAware {
protected HttpServletResponse response;
protected HttpServletRequest request;
protected Map<String, Object> session;
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setSession(Map<String, Object> session) {
this.session = session;
}
public HttpServletResponse getResponse() {
return response;
}
public void setResponse(HttpServletResponse response) {
this.response = response;
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public Map<String, Object> getSession() {
return session;
}
}
为了让BaseAction能有验证的功能,并且不能被实例化,开发中我们会这样做:
public abstract class BaseAction extends ActionSupport implements
ServletResponseAware, ServletRequestAware, SessionAware
然后让我们每个模块的Action来继承这个BaseAction类,然后我们就可以在Action中直接使用Servelt的API了.
相关推荐
1. 动态方法调用(Dynamic Method Invocation,DMI):Struts2允许通过URL直接调用Action类的方法,使得路由更加灵活。 2. 框架组件:主要包括Action、Result、Interceptor等核心组件。Action是业务逻辑处理单元,...
以上是对Struts2框架基础知识点的总结,实际开发中还需要了解更多的高级特性,如自定义拦截器、动态方法调用、文件上传下载、异常处理策略等。通过这些知识,新手可以快速上手并熟练掌握Struts2框架的使用。
Action类通常包含了业务逻辑的处理方法,这些方法会被Struts2调用以响应用户的请求。Action类可以通过返回不同的字符串来决定后续的视图显示,如返回"success"、"error"等,这些字符串与配置文件中的Result相关联。 ...
总结来说,Struts2拦截器是实现业务逻辑增强和控制流程的重要组件,它基于Java的动态代理机制。通过在Action执行前后插入自定义代码,拦截器使得我们可以方便地进行如日志记录、权限验证等操作,而无需直接修改...
### Struts2初步使用总结 #### 一、Struts2原理概述 **1.1 为什么要用Struts2** 在探讨为何使用Struts2之前,我们先简要回顾一下Struts2的一些基本特点: - **模块化设计**:Struts2采用模块化的架构设计,使得...
Struts2提供了一些工具类和方法来辅助类型转换,比如`FieldError`用于记录转换失败的字段和错误信息,`ValueStack`提供了`convertValue`方法进行转换,以及`ActionContext`中的`getValueStack`方法获取当前栈顶的`...
Struts2的拦截器(Interceptor)机制是其强大功能的一部分,拦截器可以对Action调用前后进行拦截,实现如日志记录、权限检查、事务管理等功能。常见的拦截器有`params`(用于处理请求参数),`validation`(进行数据...
总结来说,"struts2动态树形目录"项目涵盖了Struts2框架的使用、数据库操作、前端展示以及动态交互等多个方面,是学习和实践Web开发中MVC模式和数据层次结构呈现的好例子。通过这个项目,开发者可以提升对Struts2的...
Struts2的核心特性之一就是其强大的拦截器机制,它们负责在Action执行前后进行一系列的处理,包括登录检查、日志记录、事务管理等。在Struts2中,我们可以通过自定义拦截器来扩展框架功能。例如,可以创建一个专门...
7. **动态方法访问**:Struts2允许动态地选择要调用的方法,无需在`struts.xml`中为每个方法单独配置。这增强了代码的灵活性,减少了配置工作。 8. **插件体系**:Struts2有一个丰富的插件生态系统,如Tiles插件...
- **动态方法调用**:Struts2允许在配置文件中指定调用Action的特定方法,而不是仅仅调用`execute`方法。这提供了更大的灵活性和可扩展性。 - **拦截器机制**:拦截器是Struts2的核心特性之一,它们可以被用来增强...
此外,它还支持动态方法调用,这意味着Action类可以有多个方法,而无需在配置文件中显式列出它们,只需确保请求的URL与方法名匹配即可。 在实际开发中,我们还可以使用拦截器(Interceptor)来增强Action方法的功能...
Struts2不仅继承了Struts1的优点,还引入了许多新的特性,如拦截器、动态方法调用、类型转换和数据验证等,使得开发更加灵活高效。 #### 二、Struts2运行机制解析 ##### 1. 客户端发起请求 当用户在浏览器中输入...
总结,Struts2作为Java web开发的主流框架之一,其核心技术包括Action、Interceptor、Value Stack、OGNL等,通过这些组件和机制,开发者能够高效地构建MVC应用,实现业务逻辑与表现层的分离,同时具备良好的扩展性...
### Struts2技术总结 #### 一、Struts2概述及特点 Struts2作为一款流行的Java Web开发框架,继承了Struts1的优点并进行了大量的改进与创新,使其成为了一个非常值得学习的目标。Struts2相比Struts1,最大的优势...
4. **Interceptor configuration**: 拦截器是Struts2中的关键组件,用于在Action方法调用前后执行额外的逻辑。拦截器有许多用途,如验证、属性填充、安全控制、日志记录和性能监控。你可以定义自己的拦截器,或者...
Action类对应一个具体的业务逻辑,其中的execute()方法会被Struts2调用。当用户提交表单时,Struts2会根据配置的ActionMapping将请求转发到相应的execute()方法。在该方法中,我们获取表单参数,调用UserDAO的insert...