JBuilder 2005 Struts深度体验之改革
副标题#e#
用ActionForm截获登录表单数据
原登录模块用bookstore.User描写login.jsp登录页面表单的数据,在switch.jsp措施中通过<jsp:useBean>标签获取login.jsp表单的数据。其实User类相当于Struts框架中的模子,我们将通过一个ActionForm更好地实现这个成果。
ActionForm和Bean一样以属性名匹配的映射机制从HTTP请求中填充工具数据,但ActionForm比一般的Bean提供了更多的成果,Struts答允ActionForm通过validate()要领举办自校验,当数据不正那时自动转向到输出界面,另外还可以通过reset()要领,在数据填充前复位属性值。
下面我们就来建设UserActionForm,替换User的成果,成立起Struts框架中的"数据模子"。
1.指定ActionForm的Web模块及类信息
File->New…->Web->在Web页中双击ActionForm图标,弹出如图6所示的对话框:
图6 建设UserActionForm
·Struts config:我们前面有提到Struts1.1支持多个设置文件,所以你在这儿可以选择利用哪个Struts设置文件。因为我们此刻还没有界说多个Struts设置文件,所以只得利用struts-config.xml。在开拓新增图书的成果时,我们将界说另一个设置文件。
·ActionForm:ActionForm的类名,这里我们填入UserActionForm。
按Next到下一步。
2.界说ActionForm属性
图7 界说ActionForm属性
通过Add…按钮为UserActionForm增加4个属性,如图7所示。出格的,假如这个ActionForm所对应的进口页面已经建设,你也可以直接通过Add from JSP…按钮,选择一个JSP页面,JBuilder会阐明这个页面的表单,并将表单的数据组件名抽取为ActionForm的属性。
按Next到下一步。
3.一些附加成果的界说
图8 附加成果界说
#p#副标题#e#
在FormBeanName中为UserActionForm指定一个名字,一般接管JBuilder所提供的默认名即可。这个名字将在struts-config.xml文件用来定名UserActionForm。
ActionForm比一般JavaBean强大的处地址于它可以举办数据检讨,还可以举办数据复位。假如这个ActionForm最终要放到session中的,那么最好实现reset()要领,以复位ActionForm的数据,不然属性大概不会反应最新的值。这里, UserActionForm无需举办数据有效性校验,但由于UserActionForm最终需要放到session中,所以我们需要实现reset()要领。故此我们勾选Create/replace reset() method body选项。
直接按Finish建设UserActionForm,再将User类的代码拷贝过来,整改后的最终代码如下所示:
代码清单 6 以ActionForm实现的User类
1. package bookstore;
2.
3. import java.sql.*;
4. import java.text.*;
5. import java.util.Date;
6. import javax.servlet.http.*;
7. import org.apache.struts.action.*;
8.
9. public class UserActionForm
10. extends ActionForm
11. {
12. private String userId;
13. private String password;
14. private String userName;
15. private String loginDatetime;
16. public String getPassword() {
17. return password;
18. }
19.
20. …
21. //复位所有属性值
22. public void reset(ActionMapping actionMapping,HttpServletRequest servletRequest) {
23. this.userId = null;
24. this.userName = null;
25. this.password = null;
26. this.loginDatetime = null;
27. }
另外,JBuilder自动在struts-conf.xml文件中通过<form-bean>描写ActionForm。UserActionForm必需和一个Action相关联,因为HTTP请求通过Struts总节制器转发给Action,Struts节制器一旦发明Action有一个对应的ActionForm时,就用HTTP请求的数据填充这个ActionForm。
用Action取代switch.jsp的节制转换成果
我们在前面已经数落用switch.jsp实现请求转换节制的缺点,Struts框架的Action是实现请求转换节制的最适合替代者。
在这节里,我们就来建设一个名为LoginAction的Action,让其完美的接替switch.jsp的事情。
File->New…->Web->在Web页中双击Action图标,启动建设Action的领导。
1.指定Action名字及Web模块
图9 指定Web模块及Action名字
在Action中键入LoginAction作为Action的类名,个中Base class的下拉框中有很多Action基类可供选择,它们用于差异的场所,这些选项是:
·org.apache.struts.action.Action:尺度的Action。
·org.apache.struts.actions.ForwardAction:相当于JSP的<jsp:forward>,利便Struts节制器举办预处理惩罚。另外,从学究的角度上来说,在JSP页面直接通过<jsp:forward>违反了MVC的分层原则,节制器无法过问。
·org.apache.struts.actions.IncludeAction:出于ForwardAction相似的原因,Struts推荐用IncludeAction取代JSP的<jsp:include>。
·org.apache.struts.actions.LookupDispatchAction:假如一个表单有多个提交按钮,差异的提交按钮执行差异的业务操纵,用DispatchAction最为符合。
·org.apache.struts.actions.SwitchAction:用SwitchAction可在差异的Struts模块间转换。
#p#分页标题#e#
由于我们的Action需要完成用户暗码验证的业务,并按照功效转换到差异的页面中,所以这个LoginAction是一个普通的Action,故我们选择org.apache.struts.action.Action。
按Next到下一步。
2.配置Action的设置信息
图10 配置LoginAction的设置信息
·Action path:会见这个Action的URI,接管默认的/loginAction,这样我们将通过雷同这样的URL:http://127.0.0.1:8080/webModule/loginAction.do来会见这个Action。
·FormBean name:下拉框中列出Web模块中所有的ActionForm,我们选择前一小节中所建设的userActionForm。这样客户端的HTTP请求会见LoginAction时,HTTP请求所带的数据就会被Struts总节制器自动填充到userActionForm中了。
·Scope:Action有两个选择:request和session。暗示ActionForm在填充后将放在request工具中照旧session工具中,由于我们需要在通过暗码验证后,才利用户登录系统。这样就不能使userActionForm在数据填充时就放入session中,而应该在通过暗码验证后,手工将其绑定到session中(UserActionForm一旦绑定到session中,其valueBound()要领就会被挪用,记任命户登录日志),故此,我们选择request。
·input JSP:输入的JSP页面。在ActionForm需要举办数据有效性自校验的环境下,假如校验失败,Struts框架总节制器将请求返回到这个输入页面上。因为UserActionForm无需举办有效性校验(在3.1的第3步我们没有为UserActionForm实现自校验成果),所以无需指定输入的JSP。
按Finish按钮直接建设LoginAction,JBuilder自动打开Struts Config Editor,活跃形象地揭示用户登录模块Struts框架下的处理惩罚流程,如图11所示:
图11 Struts Config Editor
位于中心的/loginAction是会见LoginAction的URI,它是登录业务的节制器。Struts总节制器建设一个UserActionForm实例,并用HTTP请求的数据填充UserActionForm实例,然后将其传给LoginAction的execute()要领。
3.界说会见进口
此刻我们需要调解login.jsp表单的提交地点,利用LoginAction来处理惩罚用户登录的请求,调解后的代码如所示:
代码清单 7 login.jsp 利用LoginAction处理惩罚用户登录
1. <%@page contentType="text/html; charset=GBK" import="bookstore.UserList" %>
2. …
3. <form name="form1" method="post" action="/webModule/loginAction.do">用户名:
4. <select name="userId">
5. <option value="" selected>--登任命户--</option>
6. <%=UserList.getUserListHTML()%>
7. </select>
8. 密 码:
9. <input name="password" type="password">
10. <input type="submit" name="Submit" value="登录">
11. </form>
12. </body>
13. </html>
如第3行所示,将本来action="switch.jsp"改为"/webModule/loginAction.do",由于我们需要将整个应用陈设于/webModule的URI下,所以需要在Action会见的地点前加上/webModule。假如通过Struts的<html:form>标签来指定表单提交的地点,则无需添加/webModule,标签将自动举办转换,你将在本专题后续内容中进修到这种要领。
留意:
Struts框架总节制器Servlet通过路径匹配的方法截获HTTP请求,其匹配串是*.do,暗示URL以.do竣事的HTTP请求才会被Struts框架处理惩罚,不然Struts忽略之。所以在写链接地点时千万不要忘了挪用地点后加一个.do的后缀。