`
yufei
  • 浏览: 94169 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Struts 2 自学之路: 4 理解Action

阅读更多
内容简介:
介绍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)


项目文件在附件中
分享到:
评论
2 楼 chentao881114 2007-12-26  
太棒了,支持
1 楼 liukidd 2007-11-13  
不错,不错。

相关推荐

    Struts 2 自学之路: 3.1 struts.xml 核心配置实例说明

    这篇博客"Struts 2 自学之路: 3.1 struts.xml 核心配置实例说明"将引导我们深入了解如何使用这个至关重要的文件。 首先,`struts.xml`位于项目的`src/main/resources`或`WEB-INF/classes`目录下,它是Spring框架与...

    Struts 2 自学之路: 1 准备工作及helloworld

    本篇文章将带你踏上Struts 2的自学之旅,首先从准备工作开始,然后通过一个简单的“Hello, World”程序来熟悉基本操作。 准备工作: 1. **环境配置**:首先确保你的计算机上已经安装了Java Development Kit (JDK)...

    struts2自学文档

    ### Struts2自学文档知识点详解 #### 一、Struts2简介 Struts2是一个用于构建企业级Java Web应用程序的开源框架。它基于MVC(Model-View-Controller)架构模式,提供了一种灵活的方式来组织代码,使得业务逻辑、...

    struts2 自学材料

    - **Interceptor(拦截器)**: 拦截器是Struts2的核心特性之一,它允许在Action执行前后插入自定义的处理逻辑。拦截器可以用来实现如日志、事务控制、权限验证等功能。 **2. 上传与下载功能** Struts2提供了一套...

    struts2自学笔记

    Struts2自学笔记 Struts2是Java Web开发中的一款广泛应用的MVC框架,它基于Model-View-Controller设计模式,旨在简化企业级应用的开发流程。本自学笔记将深入探讨Struts2的核心概念、主要功能及其实现原理。 1. **...

    Struts 2 自学入门教程

    这个"Struts 2自学入门教程"涵盖了Struts 2的核心概念和技术,是初学者了解和掌握Struts 2框架的绝佳资源。 首先,我们要理解Struts 2的标志(Tag)。这些标签是用于构建用户界面的JSP标签库,它们简化了在页面上...

    struts2实战案例(项目+建库语句)

    4. **struts15_user**:这个名字可能指的是Struts2的一个Action类或者是一个配置文件,如`struts.xml`,它定义了用户相关的操作,比如登录、注册等。在Struts2中,Action是处理用户请求的核心组件,它接收请求、执行...

    struts2 in Action

    如果你想自学struts2,此文档是很好的自学宝典,经典struts2 in Action,能帮你建立整体的struts2思想,你还在犹豫什么

    struts完全自学指导

    通过这个自学指导,你将能够理解Struts的核心原理,熟练配置和使用Struts框架,为构建高效、稳定的Java Web应用打下坚实基础。在学习过程中,可以结合具体的项目实践,加深对知识点的理解和掌握。

    struts2视频自学总结

    拦截器是Struts2的核心概念之一,用于在Action执行前后进行预处理和后处理。Struts2默认提供了一系列的拦截器,如`defaultStack`,并通过`struts.xml`文件进行配置。此外,开发者还可以自定义拦截器,只需实现`...

    Struts2自学笔记——Struts2的文件上传

    这篇自学笔记将深入探讨Struts2的文件上传机制。 1. **文件上传原理** 文件上传是基于HTTP协议的POST请求实现的。在HTML表单中,通过`&lt;input type="file" /&gt;`元素让用户选择本地文件。当用户提交表单时,浏览器会...

    《Struts2_自学教程》

    - **Struts2**: 相比之下,Struts2采用了一种更为灵活的设计理念。在Struts2框架中,Action类可以实现一个或多个接口,如`Action`接口,这使得Action类能够更加灵活地选择所需的功能和服务。此外,Struts2还提供了一...

    struts框架自学教程 PPT

    这个“Struts框架自学教程 PPT”提供了一个详细的学习路径,帮助初学者理解并掌握Struts的核心概念和技术。 Struts框架的主要目标是简化企业级Web应用的开发过程,通过提供一个结构化的框架,使得开发者可以更专注...

    Struts2超详细学习笔记分享(献给自学新人)

    本篇超详细学习笔记将带你逐步深入理解Struts2的核心概念和运作机制。 首先,让我们了解Struts2的基本特性。Struts2是一个基于Servlet的框架,它通过将JSP作为视图(View),Servlet作为控制器(Controller),并将...

    Struts2完全学习手册源代码第19-20章

    通过对这三章源代码的学习和实践,读者可以全面理解Struts2的工作方式,掌握其核心机制,并具备使用Struts2进行实际项目开发的能力。同时,书中通过实例演示了如何在实际开发中运用这些知识,对于自学Struts2框架的...

    struts自学笔记

    Struts 是一个流行的Java Web开发框架,主要用于构建MVC(模型-视图-控制器)架构的应用...同时,创建一个基本的Struts2应用涉及配置文件、Action类和结果页面的编写,理解这些基础知识对于深入学习Struts2至关重要。

    struts2框架入门

    为了更好地理解Struts2,你需要学习如何创建Action类、编写struts.xml配置文件、使用Interceptor、处理结果以及理解OGNL的使用。通过阅读提供的"15_学员用书_STRUTS2核心_IMAGE版.pdf",你可以逐步掌握这些概念和...

Global site tag (gtag.js) - Google Analytics