超简单方法解决Struts2中一个action处理多个请求
关键字: struts2, action, 多个方法
这几天用Struts2+MySQL做名片管理系统的时候,遇到了一些问题,或许别人看来不是什么问题,但作为一个刚刚开始学习Struts2的新手,
很多东西对我来说还是很有难度的.比如我现在要说的在一个action中处理多个请求的问题.
简要描述一下问题的产生:我要做的名片管理系统中的一个用户管理模块,其中有两个最主要的方法就是登录和注册,这两个方法都是在UserAction中处理.
而按照通常的状况而言,一个Action中只会有一个execute方法,也就只能解决一个请求(大概看了下Struts,好像其中可以通过在form中加一个hidden元素,
然后再在execute方法中用getCommond()的方法来进行判别).不过我在Struts2中没有发现类似的解决办法,这也很有可能是我刚刚学习Struts2造成的,
毕竟到现在我都还没弄到一本完整的教材,就只是到处找了些零散的资料,然后,做的过程遇到问题再自己猜想结合google找到的一些东西来寻求解决.
遇到这个问题之后,我自己开始没有想明白是什么状况,该怎么解决.于是在网上找了下,找到的方法貌似都不是很简单,要么就很复杂,要么就要涉及一些比较深的知识.
后面我在执行这个程序的时候,发现Eclipse提出的一个warning,而正是这个warning给了我很大的提示,让我找到的解决方法.
Warning是这样的:No configuration found for the specified action: 'UserAction.action' in namespace: '/pages/user'.
Form action defaulting to 'action' attribute's literal value. 原因就是我在struts.xml中定义的action的name与login.jsp中的form中的action的name不一致,
将两个的名字改成相同就好了,不要求以.action结束,如都为:LoginAction,也就是struts.xml中的<action name="LoginAction" class="main.UserAction">,
和JSP页面中的<s:form action="LoginAction" method="POST">.
而在struts.xml中定义的action还有一个参数method,既然已经可以根据action的name找到对应的action,那还要这个参数做什么呢?另外,execute在不更改的情况下,
也是默认会调用的方法,再结合自己在网上找到的一些资料,我觉得可以尝试一下将struts.xml中的action中的method进行设置.
于是就有了下面的两个action的配置:struts.xml中的<action name="login" class="main.UserAction" method="login">和
JSP页面中的<s:form action="login" method="POST">. 提交上面的表单form的时候,在struts.xml中找到该form对应的action的方法为login(),
于是就到类UserAction中找到该方法并调用.因而也就能够调用UserAction类的login()方法了.
这样上面的问题也就可以解释了:因为两个地方定义的方法的名字不同,所以在点击登录进行login.jsp的时候就会弹出上述提示,
但由于struts.xml中只定义(配置)一个action,默认的方法为execute(),故而编译器还是能够找到该方法进行执行.
根据上面的推断,因而可以再添加一个注册页面register.jsp,将其中的表单form定义为:<s:form action="register" method="POST">,
而将struts.xml增加一个设置:<action name="register" class="main.UserAction" method="register">.
这样当register.jsp的action请求被拦截器拦截之后通过struts.xml的配置就可以找到UserAction类的register()方法进行相应的处理了,
因而也就可以实现一个UserAction中处理多个请求action了.
PS:由于本人刚刚学习Struts2不到两个星期,而且以前也没有接触过Struts方面的程序设计.所以,
肯定会有理解不对的地方,麻烦各位发现的朋友帮我指出来,谢谢
来自:http://www.360doc.com/content/09/1122/16/144699_9541328.shtml