分享
 
 
 

JBuilder2005Struts深度体验之改造

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

用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 附加功能定义

在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模块间转换。

由于我们的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的后缀。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有