浏览 5563 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-21
介绍action是如何匹配表单元素,以及数据的传递 需要注意的事项: 我修改了tomcat端口,所以你们看到的http://127.0.0.1:8888/里的8888,要以你自己的tomcat端口为准 修改了xml文件一定要重新启动tomcat或者重新热部署 我就以index.jsp和HelloAction.java来讲解 index.jsp的表单部分代码 <form action="Login.action" method="post"> <table align="center"> <caption><h3>用户登录</h3></caption> <tr> <td>用户名:<input type="text" name="username"/></td> </tr> <tr> <td>密 码:<input type="text" name="password"/></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="登录"/> <input type="reset" value="重填"/></td> </tr> </table> </form> HelloAction.java package yufei.hello; public class HelloAction { private String username; private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String execute() { String strReturn = "error"; if (username.equals("yufei")) strReturn = "success"; return strReturn; } } 只要我们的action里有相应的属性(成员变量)名和表单里的文本框的name属性一致,然后再生成其getter和setter方法 struts就能自动取得其值,这里就是表单里的文本框中的name="username",name="password"对应HelloAction中的属性 username,password 以面向对象的编程思想,上面action中的username和password很明显是应该属于user(用户)这个对象 Struts 2 也为我们提供了Pojo高级访问的支持,现在我们打开上次的工程,没有到这里这里下载 我们新建一个包yufei.pojo,在包里新建一个pojo类User,再新建一个类HelloAction,然后新建一个pojo.xml User.java package yufei.pojo; public class User { // POJO 类 private String username; private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } HelloAction.java和以前的比有所变动 public class HelloAction { // 使用刚新建的User对象 private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String execute() { String strReturn = "error"; // 使用user对象的username属性 if (user.getUsername().equals("yufei") && user.getPassword().equals("yufei")) strReturn = "success"; return strReturn; } } pojo.xml <?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="yufei.pojo" extends="struts-default"> <action name="Pojo" class="yufei.pojo.HelloAction"> <result name="success">/pojo/welcome.jsp</result> <result name="error">/pojo/error.jsp</result> </action> </package> </struts> 然后在src目录下的struts.xml根元素里加上以下这行 <include file="yufei/pojo/pojo.xml"/> 接下来需要页面了,在WebRoot新建一个文件夹,命名为pojo,我们把WebRoot下的index.jsp,error.jsp,welcome.jsp复制到 pojo文件夹里,然后修改这三个文件,error.jsp和welcome.jsp也只是需要加入识别其具体位置的信息 index.jsp <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>使用Pojo类</title> </head> <body> <!-- form 表单提交给Login.action去处理 --> <form action="Pojo.action" method="post"> <table align="center"> <caption><h3>用户登录</h3></caption> <tr> <td>用户名:<input type="text" name="user.username"/></td> </tr> <tr> <td>密 码:<input type="text" name="user.password"/></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="登录"/> <input type="reset" value="重填"/></td> </tr> </table> </form> </body> </html> error.jsp和welcome.jsp的body内容 <!-- welcome.jsp --> <body> 你好啊亲爱滴,我等你很久了 /pojo/welcome.jsp </body> <!-- error.jsp --> <body> 你是谁啊,我根本不认识你,再不离开我放狗了 /pojo/error.jsp </body> 接下来我们启动tomcat,然后在浏览器地址栏输入http://127.0.0.1:8888/Struts2Study/pojo/index.jsp 我们在表单里填入数据,在用户名和密码都是yufei的情况下,他会跳转到welcome.jsp,其它情况会跳转到error.jsp 看我们的Action类中,只有一个user属性,并没有username和password,我们再来看看我们index.jsp里表单里文本框的 name属性,分别是user.username,user.password,恩,现在我们应该明白了吧,struts自动帮我们把值填入action类的 user属性(pojo类)里的username属性和password属性,在多层应用程序中,这个功能能给我们提供不少的方便 - - - - 理论上action类不用实现任何接口继承任何类,就象我们之前的程序那样,我们的HelloAction就没有实现任何接口继承任何类 不过呢,为了方便,我们一般都是会去继承com.opensymphony.xwork2.ActionSupport这个类,并且重载(override)其execute方法 参考javadoc或者翻看愿代码我们可以发现(都在从apache下载的那个压缩包里,如果你下的时完全版) ActionSupport实现了以下这些接口 com.opensymphony.xwork2.Action com.opensymphony.xwork2.LoaleProvider com.opensymphony.xwork2.TextProvider com.opensymphony.xwork2.Validateable com.opensymphony.xwork2.ValidationAware com.uwyn.rife.continuations.ContinuableObject java.io.Searializable java.lang.Cloneable com.opensymphony.xwork2.Action接口里定义了5个常量,SUCCESS,ERROR,INPUT,LOGIN,NONE,以及一个方法public String execute(), 常量值分别是其小写形式,所以在我们实现了ActionSupport后,就不应该再使用这些"successs","error"字符串常量了, 我们可以使用从Action接口继承来的常量SUCCESS和ERROR,实际代码象下面这样 yufei.pojo.HelloAction.java修改以后 package yufei.pojo; import com.opensymphony.xwork2.ActionSupport; public class HelloAction extends ActionSupport { // 使用刚新建的User对象 private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() { String strReturn = ERROR; // 使用user对象的username属性 if (user.getUsername().equals("yufei") && user.getPassword().equals("yufei")) strReturn = SUCCESS; return strReturn; } } 其中execute方法上的注释@Override表示其修饰的方法必需是重载的方法,如果此方法不是重载方法,编译期会报错,这样就能 保证我们不会因为拼写错误而导致没有重载父类的方法,这个特性是JDK5开始才有的 我们可以看到,我们把在执行方法里的"success"和"error"换成了SUCCESS和ERROR,我们重起tomcat,再来测试,效果和刚才一样 从com.opensymphony.xwork2.Validateable和com.opensymphony.xwork2.ValidationAware 这两个接口可以看出,我们继承 ActionSupport,就能使用Struts的表单数据校验功能,数据校验不在本文讨论范围 在我们进行web开发时,servlet的一些对象是经常用到的,如session,request,response等,在struts 1 中,是通过execute的参数 传入,象这样: public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) 而struts2 的execute是不带参数的(就算修改了默认执行方法,但是执行方法的规则之一就是方法不能带参数)要获得上述对象,可以使用 Struts 2.0中com.opensymphony.xwork2.ActionContext类,我们可以通过它的静态方法getContext()获取当前Action的上下文对象。 另外,org.apache.struts2.ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象。 HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession(); 如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象 下面我们来做个试验,当我们登录成功,将用户名密码放入session,然后在成功页面显示我们的登录用户名和密码 在yufei.pojo.HelloAction.java里加入以下方法 public String sendPara() { String strReturn = ERROR; if (user.getUsername().equals("featherfly")) { strReturn = SUCCESS; // 将username和password的值加入session里 ActionContext.getContext().getSession().put("username",user.getUsername()); ActionContext.getContext().getSession().put("password",user.getPassword()); } return strReturn; } 修改pojo.xml为以下形式 <?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="yufei.pojo" extends="struts-default"> <action name="Pojo" class="yufei.pojo.HelloAction"> <result name="success">/pojo/welcome.jsp</result> <result name="error">/pojo/error.jsp</result> </action> </package> <!-- 新加入部分 --> <package name="yufei.pojo1" extends="struts-default" namespace="/pojo"> <action name="Pojo" class="yufei.pojo.HelloAction" method="sendPara"> <result name="success">/pojo/welcome1.jsp</result> <result name="error">/pojo/error.jsp</result> </action> </package> </struts> 然后在WebRoot/pojo文件夹里新建一个welcome1.jsp,我们加入访问session的内容,再修改其标识信息即可 <body> <!-- 使用EL表达式得到session对象里的username属性 --> 你好啊亲爱滴${sessionScope.username},我等你很久了<br> 登录密码是:${sessionScope.password}<br> /pojo/welcome1.jsp </body> 最后修改index.jsp,在其中再添加一个表单,提交给namespace="/pojo" name="Pojo" 去处理,这个action定义了执行 方法,会和上面的表单在执行方法上不一样,这个只要username等于featherfly就跳转到/pojo/welcome1.jsp <form action="Pojo.action" method="post"> <table align="center"> <caption><h3>用户登录</h3></caption> <tr> <td>用户名:<input type="text" name="user.username"/></td> </tr> <tr> <td>密 码:<input type="text" name="user.password"/></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="登录"/> <input type="reset" value="重填"/></td> </tr> </table> </form> <center><p>用户名为featherfly,action="/Struts2Study/pojo/Pojo.action"</p></center> <form action="/Struts2Study/pojo/Pojo.action" method="post"> <table align="center"> <caption><h3>用户登录</h3></caption> <tr> <td>用户名:<input type="text" name="user.username"/></td> </tr> <tr> <td>密 码:<input type="text" name="user.password"/></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="登录"/> <input type="reset" value="重填"/></td> </tr> </table> </form> 现在,重起tomcat,再来打开http://127.0.0.1:8888/Struts2Study/pojo/index.jsp,在下面表单里输入featherfly,密码 任意输入,提交,现在我们是不是看到了登录名字和密码了啊? (上面的表单的表单成功的用户名和密码都是yufei) 项目文件在附件中 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-11-13
不错,不错。
|
|
返回顶楼 | |
发表时间:2007-12-26
太棒了,支持
|
|
返回顶楼 | |