- 浏览: 237069 次
- 性别:
- 来自: 常州
文章分类
- 全部博客 (165)
- Java基础 (49)
- 开发工具 (3)
- Python基础 (1)
- Oracle基础 (9)
- Java 符号计算 (0)
- 计算机基本原理 (10)
- SQL (6)
- javascript (16)
- HTML (2)
- XML (4)
- 程序员之路 (7)
- JDBC (1)
- Unicode (0)
- 字符编码 (3)
- JSP基础 (2)
- Servlet&JSP (9)
- MySQL基础 (1)
- UML基础 (1)
- Hibernate (2)
- Java包 (1)
- Spring (1)
- Struts2 (9)
- 系统命令 (1)
- Tomcat (1)
- Windows (1)
- Android (1)
- C#基础 (14)
- HTML5 (1)
- .NET基础 (1)
- 数据库基础 (2)
- ASP.NET基础 (7)
- 开源Java (3)
- 趣味算法 (1)
- 面向对象思想 (1)
- 软件应用 (1)
- Web工程 (1)
- jquery (2)
- JPA (0)
- 设计模式 (0)
最新评论
-
静夜独窗:
JavaBean组件能说的具体一点吗,我感觉这样说理解的不清晰 ...
EL 表达式语言 -
静夜独窗:
在Java中,不同字符集编码的转换是通过Unicode作为中介 ...
JavaWeb中的乱码产生与解决方案
一. Action实现类
1. Action
Struts2的核心功能是action,对于开发人员来说,使用struts2框架,主要的编码工作就是编写Action类。
Struts2的Action类就是普通POJO。
Action类的属性通常是用来接收请求参数和返回页面数据的。
属性需要设置setXxx方法和getXxx方法,分别用来设置和获取属性的值。
最普通的Action类需要一个public String execute() throws Exception,该方法返回一个逻辑字符串。
为了规范用户开发Action类,Struts2框架提供了一个Action接口,该接口中提供了Action的通用规范模范。
该接口com.opensymphony.xwork2.Action的定义:
public interface Action{ public static final string SUCCESS="success"; public static final string NONE="none"; public static final string ERROR="error"; public static final string INPUT="input"; public static final string LOGIN="login"; public String execute() throws Exception; }
该接口定义的5个常量的意义:
SUCCESS | 表示动作执行成功,并应该把相应的结果视图显示给用户。 |
NONE | 表示动作执行,但不应该把任何结果视图显示给用户。 |
ERROR | 表示动作执行不成功,并应该把相应的报错视图显示给用户。 |
INPUT | 表示输入验证失败,并应该把用户输入的那个表单重新显示给用户。 |
LOGIN | 表示动作没有执行(用户没有登录),并应该把登录视图显示给用户。 |
当然,Struts2 Action类不一定要实现Action接口,也可以编写一个普通的Java类作为Action,只要该类提供一个返回String的无参的public方法,如下所示:
public String xxx()
在实际开发中,Action类很少直接实现Action接口,通常都是从com.opensymphony.xwork2.ActionSupport类继承。ActionSupport实现了Action接口和Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable的接口,提供了输入验证、错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的开发。
一下是ActionSupport类的部分内容:
public class ActionSupport implments Action,Validateable,ValidateableAware,TextProvider,LocaleProvider,Serializable{ public void addActionError(String anErrorMessage){} public void addActionMessage(String aMessage){} public void addFieldError(String fieldName,String errorMessage){} public void input(){} public void execute(){} public void validate(){} public void getText(String aTextName){} }
在struts2框架中每一个Action是一个工作单元。Action负责将一个请求对应到一个Action的处理上去,当一个Action类和一个请求相匹配,该Action类的处理方法就会被Struts2框架调用。
2. 间接访问Servlet API(与Servlet API解耦)(访问Map类型)
(1)非IoC方式(不常用)
Struts2框架中,Action与Servlet API相分离,这种低耦合Action不方便访问Session,ServletContext等对象。
Struts2框架提供ActionContext类。通过该类可以访问Servlet API。
ActionContext是Action的上下文对象。其中保持了action执行所需的一组对象,包括parameters,request,session,application和locale等。
ActionContext类定义了如下方法,用于获取HttpServlet,HttpSession和ServletContext对应的Map对象。
ActionContext类的常用方法:
方法名称 | 说明 |
static ActionContext getContext() | 获得当前线程的ActionContext对象。 |
Map getApplication() | 获取封装了ServletContext的Map对象。 |
Map getSession() |
获取封装了HttpSession的Map对象。 |
Map getParameters() | 返回一个包含所有HttpServletRequest参数信息的Map对象。类似于HttpServletRequest的getParameterMap()方法。 |
Object get(Object key) | 通过key来寻找当前ActionContext中的值。相当于getAttributes方法。 |
void put(Object key,Object value) | 向当前ActionContext对象中存入键值对信息。相当于setAttributes方法。 |
void setApplication(Map application) | 设置ServletContext的值。 |
void setSession(Map session) | 设置Session的值。 |
(2)IoC方式(最推荐使用该方法)
接口名称 | 说明 |
RequestAware |
实现该接口方法 void setRequest(java.util.Map map) Action中需要有一个private Map对象。
|
SessionAware |
实现该接口方法 void setSession(java.util.Map map) Action中需要有一个private Map对象。 |
ApplicationAware |
实现该接口方法 void setApplication(java.util.Map map) Action中需要有一个private Map对象。
|
3. 直接访问Servlet API(与Servlet API耦合)(访问真实类型)
(1)非IoC方式(不常用)
Struts2提供org.apache.struts2.ServletActionContext类来获得Servlet API。在ServletActionContext类中有以下静态方法,可以直接得到Response,ServletContext,Response对象:
public static HttpServletRequest getRequest()
public static ServletContext getServletContext()
public static HttpServletResponse getResponse()
通过ServletActionContext定义的常量和ActionContext的get方法也可以直接得到相应的Servlet对象。
ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST) 得到HttpServletRequest对象。
ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT) 得到ServletContext对象。
ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE) 得到HttpServletResponse对象。
(2)IoC方式(不常用)
通过IoC方式访问Servlet API,就必须在Action中实现相应的接口,这些接口是:
接口名称 | 说明 |
ServletContextAware |
实现该接口的Action可以直接访问ServletContext对象。 Action需要实现该接口的方法:void setServletContext(javax.servlet.ServletContext servletContext) Action中需要有一个private ServletContext对象。 |
ServletRequestAware |
实现该接口的Action可以直接访问HttpServletRequest对象。 Action需要实现该接口的方法:void setServletRequest(javax.servlet.HttpServletRequest srequest) Action中需要有一个private HttpServletRequest对象。 |
ServletResponseAware |
实现该接口的Action可以直接访问HttpServletResponse对象。 Action需要实现该接口的方法:void setServletResponse(javax.servlet.HttpServletResponse response) Action中需要有一个private HttpServletResponse对象。 |
SessionAware |
实现该接口的Action可以直接访问HttpSession对象。 Action需要实现该接口的方法:void setSession(java.util.Map map) Action中需要有一个private Map对象。 |
二. Action配置
1. 基本配置
开发Action类后,就需要配置action映射,以告诉struts2框架,针对某个URL的请求应该对应哪个Action类进行处理。Struts.xml中的每一个action元素就是一个action映射。
action完整的属性如表所示:
属性 |
是否必须 |
说明 |
name |
是 |
action的名字,匹配请求URI |
class |
否 |
Action类的完整类名 |
method |
否 |
执行Action时调用的方法 |
converter |
否 |
应用于action的类型转换器的完整类名 |
例:
<action name="login" class="com.xxx.action.LoginAction"> <result>/success.jsp</result> <result name="error">/error.jsp</result> </action>
说明:
(1)Action的name属性必需,其他属性可选。默认情况下在name属性不允许出现斜杠(/)的。
如果需要在名字中使用斜杠(/),则需要配置struts2的struts.enable.SlashesInActionNames属性,来打开这个功能。
例:<action name="com/manager" class="com.xxx.BookManager" />
在struts.xml文件配置片段:
<constant name="struts.enable.SlashesInActionNames" value="true" />
(2)在为action取名时,名字中尽量不要使用点号(.)(例如create.user)和连接字符(-)(例如:my-action),否则会出现一些莫名其妙的问题。
其实我们不用去记忆名字中不允许出现哪些字符,只要按照通常的命名习惯去为action取名就可以了,顶多在名字中使用一下下划线(_)(例如:my_action),这样是可以保证不会出现问题。
2. 使用method属性
在软件开发中,经常会用到CRUD操作,CRUD即create(创建)、Read/Retrieve(读取)、Update(更新)和Delete(删除)的首字母的缩写。例如:在一个用户管理系统中,对用户有四种操作:添加用户、浏览用户、编辑用户和删除用户,分别对应CRUD的四种操作。在具体实现时,为了节省action类的数量,通常是在一个action类中编写四个方法来实现CRUD操作。
public String loginUser() throws Exception{} //查询用户
public String addUser() throws Exception{} //添加用户
public String updateUser() throws Exception{} //修改用户
public String deleteUser() throws Exception{} // 删除用户
在执行action时,默认调用方法是execute()。
在配置action时,通过action元素的method属性来指定处理方法。所指定的方法必须遵循与execute方法相同的格式。
在struts.xml文件中,对同一个action类配置不同的别名,并使用method属性,如下所示:
<action name="reg" class="UserAction" method="addUser"> <result name="success" type="redirect">index.jsp</result> <result name="input">reg.jsp</result> </action> <action name="login" class="UserAction" method="loginUser"> <result name="success">index.jsp</result> <result name="input">reg.jsp</result> </action> <action name="update" class="UserAction" method="updateUser"> <result name="success">index.jsp</result> <result name="input">reg.jsp</result> </action> <action name="delete" class="UserAction" method="deleteUser"> <result name="success">index.jsp</result> <result name="input">reg.jsp</result> </action>
使用method属性的注意点
Struts2在根据action元素的method属性查找方法时有两种途径:
(1)查找与method属性值完全一致的方法
(2)查找doMethod()形式的方法。
例,
当请求reg时,struts2首先查找addUser()方法,如果找不到,则继续查找doAddUser() 方法。这种特性是从WebWork继承而来的,而WebWork提供这种特性,一方面是为了兼容旧版本WebWork遗留的功能,另一方面是因为一些方法别名的需要,例如,default是Java的关键字,不能作为方法名,你可以使用doDefault作为方法名,在配置时,可以使用method=“default”.
这种特性同样也适用于动态方法调用,例如,请求/users! addUser.action,struts2会依次查找addUser()和doAddUser()方法。
3. Action动态方法调用
动态方法调用(Dynamic Method Invocation,DMI)可以不要任何配置,而直接调用Action中的非execute()方法。
在<action>的action属性中使用感叹号( ! )来标识要调用的方法名,请求URI或action属性值的格式为:
Action名称!方法名称.action
或
Action名称!方法名称
例:配置了如下的Action
<action name=“users” class=“com.xxx.UserAction” >…..</action>
当请求/users!addUser.action时,将调用UserAction的addUser()方法;
当请求/users!updateUser.action时,将调用UserAction的updateUser()方法;
DMI的实现本质是,其实现代码扫描action名字中的“!”字符,如果找到,则“欺骗”框架来调用“!”字符后的方法。
虽然调用的是其它方法,但是它使用的仍然是execute方法的配置,包括验证。框架“相信”它正在调用的是Action类的execute()方法。
在struts2中使用DMI有两个要注意的问题:
首先,DMI可能会带来安全隐患,由于通过URL可以执行action中的任意方法,恶意的用户会利用这一特性来执行一些敏感的方法,即使你不想这些方法被执行。所以在确定使用DMI时,你应该确保Action中的方法都是普通、开放的方法;否则,你应该加上安全控制。
其次,DMI与通配符方法有所重叠。
由于上述两个原因,struts2提供了一个属性配置,用于关闭DMI。
struts.xml的配置片段:
<constant name="struts.enable.DynamicMethodInvocation" value="false">
method属性配置与动态方法调用的使用情况:
a. 如果同一个Action的不同方法使用的是相同的配置(同样的拦截器引用,同样的result映射),那么可以使用动态方法调用。
b. 如果不同的方法调用需要配置不同的拦截器引用、不同的result映射,那么可以使用action元素的method属性,为同一个Action配置多个别名。
4. Action 通配符映射
有时Action中方法的调用满足一定的规律。则可以适当使用通配符以减少配置代码。
例:
<action name="*Crud" class=“com.xxx.Crud" method="{1}">
则editCrud.Action的引用将调用edit方法,deleteCrud.Action的引用将调用delete 方法。
{1}表示匹配第一个*。
通配符即星号(*),用于匹配0个或多个字符。在配置action时,可以在action元素的name属性中使用星号(*)来匹配任意的字符。
通配符中几个特殊的标记,如下所述:
*:可以匹配0个或多个任意字符,但是不包括正斜杠”/”;
**:可以匹配0个或多个任意字符,包括正斜杠”/”在内
\:反斜杠,转义字符。
因为*不能匹配正斜杠,所以前面/editSubscription/add不会被匹配上。
在action mapping中,被通配符所匹配的值可以用符号{N}来访问,其中N是1到9的数,用来表示代替第N个被匹配上的值,说通俗点就是第N个*号所表示的内容。
例:
通配符表达式是/edit*/add*/confirm*,它匹配上了/editOrder/addItem/confirmResult。则
{1}就代表Order,{2}就代表Item,{3}就代表Result。
Struts2对通配符的检索规则:
如果配置文件中包含多种通配符的使用,Struts2按照如下规则检索Action。
(1)如果能够找到name属性值与请求的Action名完全一致的<action>时,则匹配该<action>元素,而不会匹配使用通配符的配置。
(2)如果没有找到完全一致的匹配时,则按照匹配文件的匹配顺序依次匹配。最先符合的<action>将会匹配。所以<action name="*">的形式放在最后面,以防止这种形式被最先匹配。
三. 默认Action
Struts2框架允许使用默认Action。
在struts.xml中配置:
<package name="default" extends="struts-default"> <default-action-ref name="DefaultAction" /> 指定默认Action的名称为DefaultAction <action name="defaultaction" class="DefaultAction"> 配置DefaultAction <result name="success">/default.jsp</result> </action> </package>
默认Action的作用:当用户请求找不到对应的<action>元素时,系统将调用默认Action来接收用户请求。
说明:若没有默认Action,则当请求不存在action时,struts2会出现错误。
应用:实现美化的404页面,在访问不存在请求时直接跳转到首页。等。
发表评论
-
Struts2的Ajax应用
2013-04-21 17:37 902一、基本原理 使用拦截器机制,对Action的成员变量做 ... -
文件的上传与下载
2012-08-28 22:56 1295一. 文件上传的原理 表单元素的enctype属性 enc ... -
Struts2标签
2012-08-26 01:40 1201一. Struts2标签概述 Struts2把所有的标签都定 ... -
Struts2异常处理
2012-08-25 23:48 1750传统异常处理方式 Java中的所有异常的根类是Thro ... -
注解配置Struts2 Action
2012-08-25 23:47 2836一. 基础配置 1. ParentPackage注解的 ... -
Struts2 Result基本配置
2012-08-25 23:46 1312一. Result配置概述 result代表了一个可能的输出 ... -
Struts2基本配置文件
2012-08-25 16:09 2141配置文件无需记忆,请尽量复制粘贴局部更改。 一.简述 ... -
整合Struts2 Spring Hibernate
2012-08-12 17:34 1165Struts2,Spring,Hibernate各自的职责 ...
相关推荐
5. `@ParentPackage`: 用于指定Action继承自哪个Struts 2配置包,可以复用其中的拦截器和其他配置。例如: ```java @ParentPackage("default") public class MyAction { // ... } ``` 6. 拦截器配置:Struts ...
Struts2框架中的Action是核心组件之一,它负责接收HTTP请求并进行业务逻辑处理,然后将控制转向相应的视图进行展示。在Struts2中,Action的...在实际应用中,应根据项目需求合理选择和配置Action,同时注意安全问题。
- **struts.xml**:这是Struts2框架的核心配置文件,定义了应用程序中的Action映射、结果类型以及拦截器等关键配置信息。它主要包含以下几个元素: - `package`:表示一个包,其中可以包含多个Action。 - `action`...
总之,`struts_xml`中的Action配置是Struts2应用的基石,通过它可以灵活地定义请求与业务逻辑的映射关系,以及后续的页面跳转和拦截器链,从而构建出高效、可维护的Web应用。深入了解和熟练掌握这部分知识对于提升...
在处理用户请求时,Struts2允许开发者通过Action类来接收和处理参数,包括中文参数。当我们需要通过POST方法提交包含中文字符的数据时,可能会遇到编码问题,因为HTTP请求默认使用的是ASCII编码,而中文字符需要UTF-...
《Struts 2实战 Struts2 in Action》这本书不仅介绍了Struts 2的基本概念和技术细节,更重要的是,它通过丰富的实战案例帮助读者深入理解框架的工作原理,并掌握了如何高效地利用Struts 2来解决实际问题。...
在Struts2的配置文件(通常为struts.xml或struts.properties)中,我们定义Action的映射规则,包括请求路径、方法调用以及结果视图等。默认情况下,一个Action类对应一个请求URL,但通过特定配置,可以让一个Action...
在实际开发中,理解并熟练掌握这些配置方法和配置文件,可以极大地提高Struts2应用的灵活性和可维护性。正确配置Action不仅可以简化代码结构,还能使应用更易于扩展和调试。同时,通过调整`struts.properties`,可以...
- **XML配置**:传统的Struts2配置通常在struts.xml文件中进行,定义Action、Result和Interceptor等元素。 - **注解配置**:Struts2也支持使用Java注解来简化配置,直接在Action类或方法上添加注解即可。 3. **...
### Struts2 Result 转向到 Action 的深入解析 #### 一、基本概念与应用场景 ...同时,了解 `redirect` 和 `redirect-action` 之间的区别对于正确配置 Struts2 应用至关重要,这有助于避免不必要的错误和性能问题。
2. **Struts.xml**: 这是Struts 2的配置文件,用于配置Action、拦截器等组件。 3. **Interceptors (拦截器)**: 拦截器用于处理Action执行前后的一系列操作,如验证、数据填充等。 #### 三、Action动态方法调用原理...
Struts2和Struts1是两个非常著名的Java Web框架,它们在处理请求时通常会在URL中显式地显示.action或.do后缀。然而,为了提供更友好的用户体验和增强安全性,有时我们需要隐藏这些扩展名。本篇文章将详细介绍如何在...
Struts2是一款强大的Java Web应用程序框架,用于构建和维护可扩展...总之,Struts2包和配置文件为你提供了构建高效、结构化的Web应用的工具和蓝图。通过合理的配置和使用,你可以创建出易于维护、扩展性强的应用程序。
根据提供的信息,我们可以推断出这是一本关于Struts 2框架的书籍——《Struts 2实战 Struts 2 in action 的中文版》。本书主要介绍了Struts 2框架的相关概念、工作原理以及实际应用案例等内容。接下来,我们将根据...
这篇博客“Struts2 ——2、各种Action写法和配置”着重讲解了在Struts2框架中如何创建和配置不同的Action,以便更好地理解和运用这个框架。 在Struts2中,Action是处理用户请求的核心组件,它负责业务逻辑的处理,...
这个压缩包“struts2所有包和配置文件”包含了Struts2框架运行所需的核心组件和配置文件。 首先,让我们详细了解一下`web.xml`。这是每个Java Web应用的标准部署描述符,用于配置应用程序的基本设置,比如Servlet、...
这是Struts2的核心配置文件,用于定义Action、结果页面和拦截器等。 3. **设置Struts2的Filter** - 在Web.xml文件中,我们需要配置Struts2的DispatcherServlet(通常称为StrutsPrepareAndExecuteFilter)。这将...
在 Struts2 框架中,Redirect 和 Redirect-action 是两个不同的 Result 配置类型。Redirect 配置用于重定向到一个新的 URL,而 Redirect-action 配置用于重定向到一个 Action。 Redirect-action 配置可以省略后缀名...
- 初始化参数通常包括`configuration`、`resources`等,用以指定Struts2运行所需的资源位置和配置。 ##### 2. **资源文件配置** - **MessageResources**:Struts2中用于管理国际化消息的接口。 - **...