Struts 2 自学之路: 4 理解Action

Struts2表单元素匹配与数据传递
本文介绍Struts2框架中Action如何匹配表单元素及数据传递的注意事项,包括通过Pojo类实现高级访问支持的方法,以及如何利用ActionContext获取servlet对象。
内容简介:
介绍action是如何匹配表单元素,以及数据的传递

需要注意的事项:
我修改了tomcat端口,所以你们看到的http://127.0.0.1:8888/里的8888,要以你自己的tomcat端口为准
修改了xml文件一定要重新启动tomcat或者重新热部署

我就以index.jsp和HelloAction.java来讲解
index.jsp的表单部分代码[code]
<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>
[/code]

HelloAction.java[code]
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;
}
}
[/code]

只要我们的action里有相应的属性(成员变量)名和表单里的文本框的name属性一致,然后再生成其getter和setter方法
struts就能自动取得其值,这里就是表单里的文本框中的name="username",name="password"对应HelloAction中的属性
username,password

以面向对象的编程思想,上面action中的username和password很明显是应该属于user(用户)这个对象
Struts 2 也为我们提供了Pojo高级访问的支持,现在我们打开上次的工程,[url=http://yufei.iteye.com/blog/125743][color=blue]没有到这里这里下载[/color][/url]
我们新建一个包yufei.pojo,在包里新建一个pojo类User,再新建一个类HelloAction,然后新建一个pojo.xml
User.java[code]
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;
}

}
[/code]

HelloAction.java和以前的比有所变动[code]
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;
}
}
[/code]

pojo.xml[code]
<?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>
[/code]

然后在src目录下的struts.xml根元素里加上以下这行
[code]
<include file="yufei/pojo/pojo.xml"/>
[/code]

接下来需要页面了,在WebRoot新建一个文件夹,命名为pojo,我们把WebRoot下的index.jsp,error.jsp,welcome.jsp复制到
pojo文件夹里,然后修改这三个文件,error.jsp和welcome.jsp也只是需要加入识别其具体位置的信息

index.jsp[code]
<%@ 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>
[/code]

error.jsp和welcome.jsp的body内容[code]
<!-- welcome.jsp -->
<body>
你好啊亲爱滴,我等你很久了
/pojo/welcome.jsp
</body>
<!-- error.jsp -->
<body>
你是谁啊,我根本不认识你,再不离开我放狗了
/pojo/error.jsp
</body>
[/code]


接下来我们启动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修改以后[code]
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;
}
}

[/code]

其中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里加入以下方法
[code]
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;
}
[/code]

修改pojo.xml为以下形式
[code]
<?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>
[/code]

然后在WebRoot/pojo文件夹里新建一个welcome1.jsp,我们加入访问session的内容,再修改其标识信息即可
[code]
<body>
<!-- 使用EL表达式得到session对象里的username属性 -->
你好啊亲爱滴${sessionScope.username},我等你很久了<br>
登录密码是:${sessionScope.password}<br>
/pojo/welcome1.jsp
</body>
[/code]

最后修改index.jsp,在其中再添加一个表单,提交给namespace="/pojo" name="Pojo" 去处理,这个action定义了执行
方法,会和上面的表单在执行方法上不一样,这个只要username等于featherfly就跳转到/pojo/welcome1.jsp

[code]
<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>
[/code]

现在,重起tomcat,再来打开http://127.0.0.1:8888/Struts2Study/pojo/index.jsp,在下面表单里输入featherfly,密码
任意输入,提交,现在我们是不是看到了登录名字和密码了啊? (上面的表单的表单成功的用户名和密码都是yufei)


项目文件在附件中
内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值