- 浏览: 517254 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (278)
- java (41)
- 设计模式 (4)
- sql (10)
- webservice (2)
- spring (9)
- struts (6)
- struts2 (32)
- hibernate (27)
- Struts_hibernate_Spring整合 (4)
- Velocity (1)
- Servlet (9)
- JSP (6)
- javascript (19)
- jquery (10)
- ajax (4)
- html、xml (3)
- JDBC (2)
- JDK (6)
- mysql (2)
- oracle (11)
- SqlServer (1)
- DB2 (4)
- tool (7)
- linux (5)
- UML (1)
- eclipse (8)
- 执行文件 (1)
- 应用服务器 (4)
- 代码重构 (1)
- 日本語 (19)
- 交规 (1)
- office (9)
- firefox (1)
- net (1)
- 测试 (1)
- temp (6)
- 对日外包 (1)
- windows (1)
- 版本控制 (1)
- android (2)
- 项目管理 (1)
最新评论
一。动态方法调用
Struts1 提供了 DispatchAction , 从而允许一个Action内包含多个处理逻辑。
Struts2 也可以用 DMI(Dynamic Method Invocation)调用来处理这种请求。
login!regist.action
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>登录页面</title> <script type="text/javascript"> function regist() { //获取该页面中的第一个表单元素 targetForm = document.forms[0]; //动态修改目标表单的action属性 targetForm.action = "login!regist.action"; //提交表单 targetForm.submit(); } </script> </head> <body> <form action="login.action" method="post"> <table width="300" align="center"> <tr> <td>用户名:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>密 码:</td> <td><input type="text" name="password"/></td> </tr> <tr> <td><input type="submit" value="登录"/></td> <td><input type="button" value="注册" onclick="regist();"/></td> </tr> <table> </form> </body> </html>
import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ActionContext; public class LoginRegistAction extends ActionSupport { //封装用户请求参数的两个属性 private String username; private String password; //封装处理结果的tip属性 private String tip; //username属性对应的setter和getter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //password属性对应的getter和setter方法 public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //tip属性对应的setter和getter方法 public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } //Action包含的注册逻辑 public String regist() throws Exception { ActionContext.getContext() .getSession().put("user" , getUsername()); setTip("恭喜您," + getUsername() + ",您已经注册成功!"); return SUCCESS; } //Action包含的默认处理逻辑 public String execute() throws Exception { if (getUsername().equals("crazyit") && getPassword().equals("leegang") ) { ActionContext.getContext() .getSession().put("user",getUsername()); setTip("欢迎," + getUsername() + ",您已经登录成功!"); return SUCCESS; } else { return ERROR; } } }
上面2段代码所示:单击 “登录” 按钮时,系统将提交给对应Action的默认处理方法。当点击 “注册” 按钮时,系统将提交给 loginAction 的 regist 方法处理 。
注意 : 使用动态方法前 必须设置 Struts2 允许动态方法调用。 将 struts.enable.DynamicMethodInvocation 常量设置为 true 时,开启 ,否则就 关闭 。
二。为 action 元素指定 method属性
还是上面 一。 中的2个 button 的问题。struts2 还提供了 method="" 的解决方案。
<?xml version="1.0" encoding="GBK"?> <!-- 下面指定了Struts 2配置文件的DTD信息 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <!-- struts是配置文件的根元素 --> <struts> <!-- 配置一个package元素 --> <package name="lee" extends="struts-default"> <!-- 配置名为login的Action,该Action采用默认的execute方法处理用户请求 --> <action name="login" class="lee.LoginRegistAction"> <!-- 下面定义了三个Result映射 --> <result name="input">/login.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> <!-- 配置名为Regist的Action,该Action采用默认的regist方法处理用户请求 --> <action name="regist" class="lee.LoginRegistAction" method="regist"> <!-- 下面定义了三个Result映射 --> <result name="input">/login.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
js改成:
function regist() { //获取该页面中的第一个表单元素 targetForm = document.forms[0]; //动态修改目标表单的action属性 targetForm.action = "regist.action"; //提交表单 targetForm.submit(); }
上面定义了 login 和 regist 两个逻辑 Action 它们都对应 lee.LoginRegistAction。其中 login 的 Action 对应处理的是默认的 execute() 方法,而 regist 的 Action 对应的是 regist()方法。然后如上所示 修改 JSP 中 javascript 代码。
通过这种方法,就能完成 一。中一样的效果
三。使用通配符
上述 二。 中冗余代码太多,可以使用通配符
<?xml version="1.0" encoding="GBK"?> <!-- 指定Struts 2配置文件的DTD信息 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <!-- Struts 2配置文件的根元素 --> <struts> <!-- 配置一个package元素 --> <package name="lee" extends="struts-default"> <!-- 使用通配符配置了Action名,method属性是个动态值 --> <action name="*Action" class="lee.LoginRegistAction" method="{1}"> <!-- 定义了三个Result --> <result name="input">/login.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> <action name=""> <result name="success">.</result> </action> </package> </struts>
上述 *Action 定义了一系列的逻辑 Action ------- 只要用户请求的 URL 是 *Action.action 的模式,都可以通过该 Action类处理。
method属性使用了 表达式 {1},该表达式的值就是 name 属性值中第一个*的值。 例如: URL 为 loginAction.action ,则调用 lee.LoginRegistAction类的 regist()方法 。
LoginRegistAction 类代码:
import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ActionContext; public class LoginRegistAction extends ActionSupport { //封装用户请求参数的两个属性 private String username; private String password; //封装处理结果的属性 private String tip; //username属性的setter和getter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //password属性的setter和getter方法 public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //tip属性的setter和getter方法 public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } //处理用户注册的注册逻辑 public String regist() throws Exception { ActionContext.getContext().getSession() .put("user" , getUsername()); setTip("恭喜您," + getUsername() + ",您已经注册成功!"); return SUCCESS; } //处理用户登录的登录逻辑 public String login() throws Exception { if (getUsername().equals("crazyit") && getPassword().equals("leegang") ) { ActionContext.getContext().getSession() .put("user",getUsername()); setTip("欢迎," + getUsername() + ",您已经登录成功!"); return SUCCESS; } else { return ERROR; } } }
js代码:
function regist() { //获取该页面中的第一个表单元素 targetForm = document.forms[0]; //动态修改目标表单的action属性 targetForm.action = "registAction.action"; //提交表单 targetForm.submit(); }
如果有需要, Struts2 允许 在 class 属性和 method 属性中同时使用表达式。
如下:
<action name="*_*" method="{2}" class="actions.{1}">
如果有 URL 为 Book_save.action请求,因为匹配 *_* 模式,且第一个 * 的值为 Book,第二个 * 的值为 save,则意味着调用 Book 处理类的 save()方法来处理用户请求。
注意: 如果有 URL 为 abcAction.action 的请求,如果 struts.xml 文件中有名为 abcAction 的 Action,则一定由该 Action来处理用户请求;如果 struts.xml 中没有 abcAction 的 Action,则搜索 name 属性值匹配 abcAction 的 Action,例如: name 为 *Action 或 *,但是 *Action 并不会比 * 更优先匹配 abcAction 请求,而是先找到哪个 Action,就先由那个Acion来处理用户请求。因此,一般我们应该将名为 * 的Action匹配在最后,否则 Struts2 将使用该Action处理所有希望使用模式匹配的请求。
代码如下:
<?xml version="1.0" encoding="GBK"?> <!-- 指定Struts 2配置文件的DTD信息 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="lee" extends="struts-default"> <!-- 配置name为*Action的第二个Action --> <action name="*Action" class="lee.TwoAction"> <result name="success">/welcome.jsp</result> </action> <!-- 配置name为loginAction的第三个Action --> <action name="loginAction" class="lee.LoginAction"> <result name="input">/login.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> <!-- 配置name为*的第一个Action --> <action name="*" class="lee.FirstAction"> <result name="success">/welcome.jsp</result> </action> </package> </struts>
四。配置 Action 的默认处理类
Struts2 默认 ActionSupport 作为 Action 处理类,<action>中没有 class 属性 就默认使用 ActionSupport。
struts-default.xml 中有:
<package name="struts-default" abstract="true"> <default-class-ref class="com.opensymphony.xwork2.ActionSupport" /> </package >
Struts2 允许定义自己的默认 Action,只需在 struts.xml 中配置:
<default-class-ref name="simpleViewResultAction" /> <action name="simpleViewResultAction" class="lee.SimpleViewResultAction"> <result name="success">/welcome.jsp</result> </action>
<default-class-ref >中的 name (="simpleViewResultAction"
)指向容器中另一个有效的 Action (<action name="simpleViewResultAction"
>
)
发表评论
文章已被作者锁定,不允许评论。
-
Struts1 与 Struts2 的12点区别
2011-11-16 11:14 7381) 在Action实现类方面 ... -
Struts 2 的 Ajax 支持(四)
2011-03-14 16:21 17375.4 tabbedpanel 标签 ... -
Struts 2 的 Ajax 支持(三)
2011-02-11 13:18 24265.2 submit 和 a 标签 ... -
Struts 2 的 Ajax 支持(二)
2011-01-27 14:08 2391四、 基于 Dojo 的 pub-sub 事件模型 ... -
Struts 2 的 Ajax 支持(一)
2011-01-20 14:55 2482一、 Ajax 概述 ... -
Struts 2 的拦截器(三)
2011-01-20 13:09 2905六、 拦截器示例 : 实现权限控制 权限检 ... -
Struts 2 的拦截器(二)
2011-01-12 16:38 1624四、 开发自己的拦截器 Struts 2 ... -
Struts 2 的拦截器(一)
2010-12-31 16:53 2016一、 理解拦截器 ... -
Struts 2 的标签库(五)
2010-12-29 11:35 11366.8 select 标签 以下代码 都是基 ... -
Struts 2 的标签库(四)
2010-12-24 16:21 1639六、 表单标签 表单标签,分为 2 种 : f ... -
Struts 2 的标签库(三)
2010-12-20 14:15 1967四、 数据标签 数据标签主要 ... -
Struts 2 的标签库(二)
2010-12-15 16:21 2026三、 控制标签 Str ... -
Struts 2 的标签库(一)
2010-12-13 13:47 1358一、 Struts 2 标签库概述 ... -
Struts 2 的国际化(二)
2010-12-09 13:25 2254二、 Struts 2 的国际化入门 ... -
Struts 2 的国际化(一)
2010-12-06 22:44 1302一、 程序国际化简 ... -
Struts2 上传和下载文件(三)
2010-12-03 14:58 1790三、 同时上传多个 ... -
Struts2 上传和下载文件(二)
2010-11-29 13:37 1977二、 Struts 2 的文件上传 ... -
Struts2 上传和下载文件(一)
2010-11-17 22:28 2076一、 文件上传的原理 1. 表单元 ... -
struts2 输入校验 (四)
2010-11-15 22:43 1210六、 手动完成输入校验 对于一些特殊的检验 ... -
struts2 输入校验 (三)
2010-11-08 13:25 1715五、 内建校验器 S ...
相关推荐
#### 一、Struts2的核心配置文件 在Struts2框架中,有多个重要的配置文件用于控制应用的行为与结构,其中最核心的是`struts.xml`文件。此外还包括`web.xml`、`struts.properties`、`struts-default.xml`等。 - **...
在"Struts 2使用注解配置Action"中,我们不再需要在struts.xml中为每个Action类手动添加配置。相反,我们可以在Action类或者方法上直接使用注解来声明它们的功能。这样不仅提高了代码的可读性,还使得配置更加灵活。...
根据提供的文件信息,我们可以从《Struts 2实战 Struts2 in Action》这一书籍中提炼出与Struts 2框架相关的多个重要知识点。Struts 2是一个基于Java的开源Web应用框架,它继承了Struts 1的优点并进行了大量的改进和...
**一、Struts2配置文件概述** 在Struts2中,配置文件主要分为两个部分:`struts-default.xml`和用户自定义的配置文件,如`struts.xml`或`struts-config.xml`。这些XML文件定义了Action、结果类型、拦截器和包等元素...
总结,Struts2配置涉及多个方面,包括核心库的引入、配置文件的编写、Action、Result、Interceptor的定义以及与Spring的整合等。通过合理配置,可以构建出高效、灵活的Web应用。在实际项目中,应根据需求调整和优化...
作为一个基于Action和基于拦截器的框架,Struts2提供了丰富的功能,使得开发者能够构建可维护、可扩展的Web应用。下面我们将深入探讨Struts2的主要特性、工作原理以及如何在实际开发中运用。 1. **核心概念**: - ...
Struts2是一个流行的Java web框架,它用于构建和维护可扩展、模块化且易于管理的企业级应用程序。在处理用户请求时,Struts2允许开发者通过Action类来接收和处理参数,包括中文参数。当我们需要通过POST方法提交包含...
根据提供的信息,我们可以推断出这是一本关于Struts 2框架的书籍——《Struts 2实战 Struts 2 in action 的中文版》。本书主要介绍了Struts 2框架的相关概念、工作原理以及实际应用案例等内容。接下来,我们将根据...
配置文件在Struts2中起着至关重要的作用,它们定义了请求如何被映射到特定的Action,以及如何处理结果。了解Struts2配置文件的加载顺序对于优化应用性能和解决配置问题至关重要。 Struts2的配置主要分布在以下几个...
Struts2作为一款强大的MVC框架,其核心配置文件`struts.xml`在应用程序中扮演着至关重要的角色。本文将深入解析`struts.xml`中的Action配置,帮助开发者更好地理解和运用这一关键组件。 首先,Action配置是Struts2...
1. **使用通配符配置Action**: - 例子:`<action name="student*" method="{1}" class="com.example.StudentAction">` - 这里的`student*`是一个通配符模式,匹配所有以`student`开头的Action。 - `{1}`表示...
在这个文件中可以配置Action、拦截器、结果类型等。 - **示例配置**: ```xml <struts> <package name="default" namespace="/" extends="struts-default"> <action name="hello" class=...
- **Struts配置文件**:是Struts2的核心配置文件,通常位于`/WEB-INF/struts-config.xml`。 - 配置文件中定义了框架的主要行为,如Action映射、拦截器、结果类型等。 - 通过`struts-config.xml`文件,可以灵活地控制...
Struts2 框架中 Result 配置是一种非常重要的配置,它直接影响着应用程序的执行结果。Result 配置通常用于定义 Action 的执行结果,例如将结果.redirect 到一个新的 URL,或者将结果.render 到一个 JSP 页面。Struts...
Struts2的配置通常存储在一个名为`struts.xml`的XML文件中。这个文件遵循特定的DTD(文档类型定义),如`struts-2.0.dtd`,确保其结构的正确性。 2. **常量配置**: `<constant>`元素用于定义配置文件中的全局...
"Struts2 in Action" 是一本深入探讨Struts2框架的专业书籍,旨在帮助开发者掌握这一框架的核心概念和实践技巧。这本书的中文版不仅提供了理论知识,还附带有配套的源代码,方便读者进行实践操作,加深理解。 ...
7. **配置文件**:Struts2的配置主要通过`struts.xml`进行,它定义了Action、结果类型、拦截器栈等。此外,Spring的配置文件(如`applicationContext.xml`)则负责Bean的管理和依赖注入。 8. **过滤器配置**:在`...
`struts.xml` 文件是Struts2的核心配置文件之一,主要负责管理和定义应用程序中的Action映射以及相关的Result定义。具体来说,该文件包括以下几个关键部分: 1. **Action 映射**: - 指定每个Action的名称、执行的...
Struts2是一个强大的MVC框架,它通过提供配置文件来管理应用程序的行为,使得开发者能够灵活地定义Action、拦截器和结果映射。本文将深入探讨Struts2的配置文件,特别是`struts.xml`文件中的关键元素和属性。 在...