struts2标签调用方法中action的方法调用

其中超链接标记里面的href属性值是action名字,即在struts.xml文件里action的name属性。
(4).接下来新建三个jsp页面,改编码为utf-8,当点击用户登录的时候,通过action来转发到User_login.jsp页面,当点击添加用户时,通过action转发到User_add.jsp页面,当点击删除用户时,通过action转发到User_delete.jsp页面,代码分别如下:
User_login.jsp页面:
User_add.jsp页面:
添加用户成功
User_delete.jsp页面:
删除用户成功
(5).接下来我们就可以配置struts.xml文件,打开struts.xml文件,修改后代码如下:
其中的修改用户链接和查询用户链接中的href属性的值为action+!+method,如果我们的action的name属性为userupdate的话,方法为update的话,可以写成http://blog.csdn.net/u/article/details/userupdate!update,然后我们可以不用再struts.xml文件配置method属性。
(3).接下来新建2个页面,编码改成utf-8,当用户点击修改用户超链接时,跳转到User_update.jsp页面,当用户点击查询用户链接时,跳转到User_find.jsp页面,代码分别如下:
User_update.jsp页面:
修改用户成功
User_find.jsp页面:
查询用户成功
(4).接下来打开struts.xml文件,进行修改,其中必须要在struts.xml文件中加入下列这行:
该属性设置Struts 2是否支持动态方法调用,如果没有这一行要加上去,要不然会报错误,如果你加上这一行,但是你把value值改成false,也会报错!
struts.xml文件:
/User_login.jsp
/User_add.jsp
/User_delete.jsp
/User_update.jsp
/User_find.jsp
这里介绍最后面两个action,name为action名称,class为包下的 UserAction类,不用指定method方法,在index.jsp下定义的后两个超链接中,通过action名称加上感叹号,再加上UserAction下定义的方法名,就可以通过action请求跳转到相应的页面。
(5).接着重新部署下,开启Tomcat服务器,运行效果如下:
点击修改用户超链接和查询用户超链接,如下图所示:
跳转时地址栏后面变成了上图的红色文本。
3.接下来来总结一下:
(1).Action执行的时候并不一定要执行execute方法。
(2).可以在配置文件中配置Action的时候用method=来指定执行哪个方法,也可以在url地址中动态指定(动态方法调用DMI)(推荐),而前者会产生太多的action,所以不推荐使用。
以上内容仅供大家参考学习,我也是借鉴老师的知识所学的,写得不好,请见谅,如有错误,请指出,谢谢!
Struts 2中访问Servlet API的几种方法小结
在Struts 2框架中,Action与Servlet API相分离,使得Action无法访问Servlet API,将不能使用session、application等。为了解决这个问题,Struts 2提供了如下几种方法:1、使用ActionContextAction运行期间所用到的数据都保存在ActionContext中,例如session、客户端提交的参数等,ActionContext是Action的一个上下文对象。ActionContext&actionContext&=&ActionContext.getContext();通过如上方法创建actionContext对象,然后使用actionContext对象提供的一些方法来实现相应的功能。例如,调用getSession()方法可以获得HttpSession对象。但是,这种方法只能使用少部分的Servlet API。2、实现相应的aware接口在Action中实现如下的一些接口:org.apache.struts2.util.ServletContextAware:实现该接口的Action可以访问ServletContext对象。org.apache.struts2.interceptor.ServletRequestAware:实现该接口的Action可以访问ServletRequest对象。org.apache.struts2.interceptor.ServletResponseAware:实现该接口的Action可以访问ServletResponse对象。org.apache.struts2.interceptor.SessionAware:实现该接口的Action可以访问HttpSession对象。看下面的例子:package&
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpS
import&org.apache.struts2.interceptor.ServletRequestA
import&com.opensymphony.xwork2.ActionS
public&class&LoginAction&extends&ActionSupport&implements&ServletRequestAware{
private&String&
//&定义request对象
private&HttpServletRequest&
public&String&getName()&{
public&void&setName(String&name)&{
this.name&=&
public&String&execute()&throws&Exception&{
HttpSession&session&=&request.getSession();
session.setAttribute(&user&,&this.name);
return&SUCCESS;
//&继承并实现该方法
public&void&setServletRequest(HttpServletRequest&request)&{
this.request&=&
}可以实现其中的某一个接口,也可以使用全部的接口。这种方法弊端是实现起来比较麻烦,既要实现接口,还要实现接口里的set方法。3、使用ServletActionContextServletActionContet提供了一系列的静态方法,可以获得HttpServletRequest、HttpServletResponse等等,看下面的例子:package&
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpS
import&org.apache.struts2.ServletActionC
import&com.opensymphony.xwork2.ActionS
public&class&LoginAction&extends&ActionSupport&{
private&String&
public&String&getName()&{
public&void&setName(String&name)&{
this.name&=&
public&String&execute()&throws&Exception&{
HttpServletRequest&request&=&ServletActionContext.getRequest();
HttpSession&session&=&request.getSession();
session.setAttribute(&user&,&this.name);
return&SUCCESS;
}以上的三种访问Servlet的方式,由于第一种只能获取到request对象,不能获取到response;第二种,使用起来过于麻烦,而且必须要实现接口,耦合性大;第三种最为简单,代码量又少,这也是推荐使用的方法。10:41 提问
struts2中action中的方法无故被提交两次
import java.io.UnsupportedEncodingE
import javax.servlet.http.HttpServletR
import org.apache.struts2.ServletActionC
import com.hsp.book.domain.B
import com.hsp.book.service.BookS
import com.hsp.paper.PageM
import com.opensymphony.xwork2.ActionS
import com.opensymphony.xwork2.ModelD
public class BookAction extends ActionSupport implements ModelDriven{
private HttpServletRequest request=ServletActionContext.getRequest();
private BookService bookService=new BookService();
private Book book=new Book();
private PageModel pageM
private int pageNo=1; //这里给pageNo一个默认值
private int pageSize=4;
public int getPageNo() {
return pageNo;
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
public Book getBook() {
public void setBook(Book book) {
this.book =
public PageModel getPageModel() {
return pageM
public void setPageModel(PageModel pageModel) {
this.pageModel = pageM
public Book getModel() {
System.out.println("haha");
* 按book的id查询
public String
//int requestId=Integer.parseInt(request.getParameter("id"));
book=bookService.load(book.getId()); //值传递了一个id过
book=bookService.load(2); //值传递了一个id过
System.out.println("按照书的id进行查找");
System.out.println(book.getId());
System.out.println(book.getImage_b());
return "desc";
struts.xml
&action name="bookAction_*" class="com.hsp.book.web.action.BookAction" method="{1}"&
&result name="list"&/jsps/book/list.jsp&/result&
&result name="desc"&/jsps/book/desc.jsp&/result&
&/package&
jsp的链接代码:
${book.bname}
最后的结果是action中的load()被调用两次。
其他相似问题
相关参考资料struts2中action及其配置详解
映射中可以指定 result types
、异常处理器( exception handlers
)及拦截器,但是,只有 Action
属性是必需指定的,其他属性也可以在 package
范围内进行定义,供该 package
下配置的所有 Action
引用。如:
&!--&Action配置&一个Action可以被多次映射(只要action配置中的name不同)
&&&&&&&name:action名称
&&&&&&&class:&对应的类的路径
&&&&&&&method:&调用Action中的方法名
--&&action&name="hello"&class="com.kay.struts2.Action.LoginAction"&&!--&引用拦截器
&&&&&&&name:拦截器名称或拦截器栈名称
&&&&&&&&interceptor-ref&name="timer"&&/interceptor-ref&
&&&&&&&&!--&节点配置
&&&&&&&&&&&&&&&name&:&result名称&和Action中返回的值相同
&&&&&&&&&&&&&&&type&:&result类型&不写则选用superpackage的type&struts-default.xml中的默认为dispatcher
&&&&&&&&--&
&&&&&&&&&result&name="success"&type="dispatcher"&/talk.jsp&/result&
&&&&&&&&&!--&参数设置&
&&&&&&&&&&&&&&
name:对应Action中的get/set方法&
&&&&&&&&&--&
&&&&&&&&&param&name="url"&&/param&&/action&
应用中, action
属性用于匹配通过浏览器发送的请求地址或链接的一部分。框架将取主机地址、应用名称和扩展名之间的部分和
属性进行匹配,如:一个请求http://www.planetstruts.org/struts2-mailreader/Welcome.do将映射到
name属性为
在一个应用里边,通常通过在标签中指定 action
来链接到相应的 action
,然后由框架自动追加 action
的扩展名和其它需要的内容。
注意:如果在你的
中包含有斜线(如: &action
name="admin/home" class="tutorial.Admin"/&
),你需要在 struts.xml
中进行如下配置: &constant
name="struts.enable.SlashesInActionNames"
value="true"/&
,但是,启用该配置也会产生一些副作用,具体详情可参考 https://issues.apache.org/struts/browse/WW-1383
上的讨论。
警告:谨慎使用在
名称中包含点 (eg:create.user)
、斜线 (create/user)
和横线 (create-user)
的情况,虽然 action
的名称定义非常灵活,但是,当在 action
中使用点、斜线或横线时,应该谨慎。有时候,当点符号没有明显的副作用时,横线符号将会导致为某一个标签或主题(
)生成 javascript
时的问题。因此,尽量使用软件工程中规范的或者带下划线的命名,如: createUser
或者 my_action
严重提示:Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action。
缺省的处理类入口方法是在 Action
接口中进行定义的, Action
接口代码如下:
packagecom.opensymphony.xwork2;
public interface Action{
public abstract String execute() throws E
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";
该接口的实现是可选的,如果编写的 action
没有实现该接口,框架将自动从 action
中通过反射去查找 execute
通常,开发人员习惯在一个 action
中创建多个入口方法,例如,在一个具有数据访问功能的 action
中,开发人员想分别实现添加、查询、更新和删除四个入口方法,入口方法可以通过 action
配置中的 method
属性来进行指定,如:
&action name="delete"
class= "example.CrudAction" method= "delete"
如果在一个 action
中没有 execute
方法,也没有其它方法在配置文件中进行配置,框架将抛出异常。
大多数情况下,一组 action
映射拥有通用的模式,如:所有的 edit actions
可能都是以 edit
开头,并且在 action
类中的入口方法也被命名为edit。delete actions
也将可能具有相同的模式,且在 action
类中的入口方法名被命名为 delete
这里,并非需要为每一个存在这种模式(或共性)的 action
类进行单独的映射配置,而是可直接通过通配符映射只需配置一次即可。代码如下:
&action name= "*Crud"
class= "example.Crud" method= "{1}" &
在这里,当在应用中将 action
指定为“ editCrud
”时,将调用 editCrud Action
处理类实例中的 edit
方法。同样,“ deleteCrud
”将调用 deleteCrud Action
处理类实例中的 delete
另外一种方法是通过 action
的后缀来匹配方法名,并且通过感叹号、下划线或者其它特殊字符将其进行分开。
"action=Crud_input"
"action=Crud_delete"
下面的代码片断演示了在 action
名称的最后使用星号通配符的示例:
&action name= "Crud_*"
class= "example.Crud" method= "{1}" &
从框架的角度看,通配符方式使用与常规的、静态映射同样的属性,创建了一个新的虚拟的映射配置。结果,你能够通过替换通配符来作为校验、类型转换及
message resource
文件,正象他作为 action
Crud_input-validation.xml
Crud_delete-conversion.xml
下面的代码片段演示了通配符默认配置示例:
name=”*”&
&result&{1}.jsp&/result&
如果没有配置相应Action
会默认该配置。例如:addUser.action会返回到addUser.jsp页面
在 WebWork2
中,可以使用感叹号(!)来指定要执行(或调用)非 execute
方法,但是还没有一个真正的术语该种方式的定义。在 s2
的讨论中,我们定义了“动态方法调用”这个术语来描述 webwork/s2
对感叹号的使用。
动态方法调用( DMI
)通过在 action
名称和要调用的 Action
方法之间添加一个感叹号进行分割,以表示调用 action
中指定的方法(非 exeucte
方法)。如:“ Category
! create.action
”,表示调用 Category Action
中定义的 create
在 Struts2
中,让动态方法调用可配置,有两个原因: 1
)如果使用的是 POJO action
,动态方法调用可能会引起安全问题; 2
)动态方法调用和从 Struts 1
中引用过来的通配符方法有重叠;如果你的应用涉及到安全,或者习惯在 action
配置中使用感叹号作为通配符的话,需要在 struts
应用的 struts.properties
配置文件中将 struts.enable.DynamicMethodInvocation
设置为 false
ActionSupport
当在 Action
的配置中没有指定 class
属性时, Struts2
将默认使用 com.opensymphony.xwork.ActionSupport
ActionSupport
类中有 execute
方法,其中 execute
方法直接返回“ success
可通过在 package
内配置 default-action-ref
,将其 name
属性指定到缺省的 action
处理类,这时,当找不到对应的 action
处理类时,将默认去调用 default-action-ref
标签的 name
属性对应的 action
类。如下面的配置片断:
每个 package
内可以配置自己的缺省 action
,但是在每个命名空间下只能配置一个缺省的 action
,如果在多个具有相同命名空间的 package
内配置有多个缺省 action
时,框架就没法保证哪个 action
将被作为缺省的 action
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 struts2 action多方法 的文章

 

随机推荐