用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所示的对话框:
按next到下一步。
3.一些附加功能的定义
直接按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. }
用action代替switch.jsp的控制转换功能
我们在前面已经数落用switch.jsp实现请求转换控制的缺点,struts框架的action是实现请求转换控制的最适合替代者。
在这节里,我们就来创建一个名为loginaction的action,让其完美的接替switch.jsp的工作。
file->new...->web->在web页中双击action图标,启动创建action的向导。
1.指定action名字及web模块
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>
注意:
struts框架总控制器servlet通过路径匹配的方式截获http请求,其匹配串是*.do,表示url以.do结束的http请求才会被struts框架处理,否则struts忽略之。所以在写链接地址时千万不要忘了调用地址后加一个.do的后缀。
4.为/loginaction定义两个出口
一个action一般只有一个入口,但往往会有多个出口,action根据业务处理的不同结果转向相应的出口。图 12 /loginaction右边是一个带"forward"的浅色虚框,右键单击这个forward虚框,在弹出的菜单中点击add forward菜单项,在strut config editor中将新增一个默认名为forward的出口项图标,左键单击这个forward新增的图标,对这个出口进行制定,如图 13所示:
1. <struts-config>
2. <form-beans>
3. <form-bean name="useractionform" type="bookstore.useractionform" />
4. </form-beans>
5. <action-mappings>
6. <action name="useractionform" path="/loginaction"
7. scope="request" type="bookstore.loginaction">
8. <forward name="success" path="/welcome.jsp" />
9. <forward name="fail" path="/fail.jsp" />
10. <forward name="error" path="/error.jsp" />
11. </action>
12. </action-mappings>
13. </struts-config>
1. package bookstore;
2.
3. import org.apache.struts.action.actionmapping;
4. import org.apache.struts.action.actionform;
5. import javax.servlet.http.httpservletrequest;
6. import javax.servlet.http.httpservletresponse;
7. import org.apache.struts.action.actionforward;
8. import org.apache.struts.action.action;
9.
10. import java.sql.*;
11.
12. public class loginaction
13. extends action {
14. public actionforward execute(actionmapping actionmapping,
15. actionform actionform,
16. httpservletrequest servletrequest,
17. httpservletresponse servletresponse) {
18. useractionform useractionform = (useractionform) actionform;
19. connection conn = null;
20. try
21. {
22. conn = dbconnection.getconnection();
23. preparedstatement pstat = conn.preparestatement(
24. "select user_name from t_user where user_id=? and password = ?");
25. pstat.setstring(1, useractionform.getuserid());
26. pstat.setstring(2, useractionform.getpassword());
27. resultset rs = pstat.executequery();
28. if (rs.next())
29. { //密码正确
30. useractionform.setusername(rs.getstring(1));
31. servletrequest.getsession().setattribute("ses_userbean", useractionform);
32. return actionmapping.findforward("success");//通过验证,转向welcome.jsp出口
33. }
34. }
35. catch (sqlexception se)
36. {
37. se.printstacktrace();
38. return actionmapping.findforward("error");//程序发生异常,转向error.jsp出口
39. }
40. finally
41. {
42. try
43. {
44. if (conn != null)
45. {
46. conn.close();
47. }
48. }
49. catch (sqlexception ex)
50. {
51. ex.printstacktrace();
52. return actionmapping.findforward("error");//程序发生异常,转向error.jsp出口
53. }
54. }
55. return actionmapping.findforward("fail");//未通过验证,转向fail.jsp出口
56. }
57. }
<jsp:usebean id="ses_userbean" scope="session" class="bookstore.user"/>
<jsp:usebean id="ses_userbean" scope="session" class="bookstore.useractionform"/>
提示:
一般情况下,action只执行流程控制的功能,而不执行具体的业务处理。所以loginaction的execute()中验证用户的业务最好抽取到一个具体的bo中(business object:商业处理对象)。
新闻热点
疑难解答