Struts2教程1:第一个Struts2程序

简介:
在本系列教程中我们将学习到 Struts2 的各种技术。在本教程中使用的工具和程序库的版本如下:
开发工具:MyEclipse6
Web 服务器:Tomcat6
Struts 版本:Struts2.0.11.1
JDK 版本:JDK1.5.0_12
J2EE 版本:Java EE5.0
     在本系列教程中Web 工程的上下文路径都是struts2 ,如果在Web 根目录有一个index.jsp 文件,则访问路径如下:

http://localhost:8080/struts2/index.jsp
     由于MyEclipse6 目前并不支持Struts2 ,所以我们需要到struts.apache.org 去下载Struts2 安装包。要想正常使用Struts2 ,至少需要如下五个包(可能会因为Struts2 的版本不同,包名略有差异,但包名的前半部是一样的)。
struts2-core-2.0.11.1.jar
xwork-2.0.4.jar
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
    Struts2 虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了Struts1.x 的方式(当然,Struts2 仍然是基于MVC 模式的,也是动作驱动的,可能这是唯一没变的东西)。Struts2 实际上是在Webwork 基础上构建起来的MVC 框架。我们从Struts2 的源代码中可以看到,有很多都是直接使用的xwork(Webwork 的核心技术) 的包。既然从技术上来说Struts2 是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。
     如果大家使用过Struts1.x ,应该对建立基于Struts1.x Web 程序的基本步骤非常清楚。让我们先来回顾一下建立基于Struts1.x Web 程序的基本步骤。
1.          安装Struts 。由于Struts 的入口点是ActionServlet ,所以得在web.xml 中配置一下这个Servlet
2.          编写Action 类(一般从org.apache.struts.action.Action 类继承)。
3.          编写ActionForm 类(一般从org.apache.struts.action.ActionForm 类继承),这一步不是必须的,如果要接收客户端提交的数据,需要执行这一步。
4.          struts-config.xml 文件中配置Action ActionForm
5.          如果要 采集用户录入的数据,一般需要编写若干JSP 页面,并通过这些JSP 页面中的form 将数据提交给Action
下面我们就按着编写struts1.x 程序的 这五步和struts2.x 程序的编写过程一一对应,看看它们谁更“酷”。下面我们来编写一个基于Struts2 Web 程序。这个程序的功能是让用户录入两个整数,并提交给一个Struts Action ,并计算这两个数的代数和,如果代码和为非负数,则跳转到positive.jsp 页面,否则跳转到negative.jsp 页面。

 
【第1 步】  安装Struts2
     这一步对于Struts1.x Struts2 都是必须的,只是安装的方法不同。Struts1 的入口点是一个Servlet ,而Struts2 的入口点是一个过滤器(Filter) 。因此,Struts2 要按过滤器的方式配置。下面是在web.xml 中配置Struts2 的代码:
< filter >
    < filter-name > struts2 </ filter-name >
    
< filter-class >
        org.apache.struts2.dispatcher.FilterDispatcher            
    
</ filter-class >
</ filter >
< filter-mapping >
    
< filter-name > struts2 </ filter-name >
    
< url-pattern > /* </ url-pattern >
</ filter-mapping >

 
【第2 步】  编写Action
     这一步和 Struts1.x 也必须进行。只是 Struts1.x 中的动作类必须从 Action 类中继承,而 Struts2.x 的动作类需要从 com.opensymphony.xwork2.ActionSupport 类继承。下面是计算两个整数代码和的 Action 类,代码如下:
package  action;
  
import  com.opensymphony.xwork2.ActionSupport;
  
public   class  FirstAction  extends  ActionSupport
{
    
private   int  operand1;
    
private   int  operand2;
  
    
public  String execute()  throws  Exception
    {
        
if  (getSum()  >=   0 )   //  如果代码数和是非负整数,跳到positive.jsp页面
        {
            
return   " positive " ;
        }
        
else    //  如果代码数和是负整数,跳到negative.jsp页面
        {
            
return   " negative " ;
        }
    }
  
    
public   int  getOperand1()
    {
        
return  operand1;
    }
  
    
public   void  setOperand1( int  operand1)
    {
        System.out.println(operand1);
          
this .operand1  =  operand1;
    }
  
    
public   int  getOperand2()
    {
        
return  operand2;
    }  
    
public   void  setOperand2( int  operand2)
    {
        System.out.println(operand2);
        
this .operand2  =  operand2;
    }
    
public   int  getSum()
    {
        
return  operand1  +  operand2;   //  计算两个整数的代码数和
    }
}
 
从上面的代码可以看出,动作类的一个特征就是要覆盖execute 方法,只是Struts2 execute 方法没有参数了,而Struts1.x execute 方法有四个参数。而且execute 方法的返回值也不同的。Struts2 只返回一个String ,用于表述执行结果(就是一个标志)。上面代码的其他部分将在下面讲解。

【第3 步】  编写ActionForm
     在本例中当然需要使用ActionForm 了。在Struts1.x 中,必须要单独建立一个ActionForm 类(或是定义一个动作Form ),而在Struts2 ActionForm Action 已经二合一了。从第二步的代码可以看出,后面的部分就是应该写在ActionForm 类中的内容。所以在第2 步,本例的ActionForm 类已经编写完成(就是Action 类的后半部分)。
【第4 步】  配置Action
     这一步 struts1.x struts2.x 都是必须的,只是在 struts1.x 中的配置文件一般叫 struts-config.xml (当然也可以是其他的文件名),而且一般放到 WEB-INF 目录中。而在 struts2.x 中的配置文件一般为 struts.xml ,放到 WEB-INF"classes 目录中。下面是在 struts.xml 中配置动作类的代码:

<? xml version="1.0" encoding="UTF-8"  ?>
  
<! DOCTYPE struts PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
      "http://struts.apache.org/dtds/struts-2.0.dtd"
>
  
< struts >
      
< package  name ="struts2"  namespace ="/mystruts"
          extends
="struts-default" >
          
< action  name ="sum"  class ="action.FirstAction" >
              
< result  name ="positive" > /positive.jsp </ result >
              
< result  name ="negative" > /negative.jsp </ result >
          
</ action >
      
</ package >
  
</ struts >
 
<struts> 标签中可以有多个<package> ,第一个<package> 可以指定一个Servlet 访问路径(不包括动作名),如“/mystruts ”。extends 属性继承一个默认的配置文件“struts-default ”,一般都继承于它,大家可以先不去管它。<action> 标签中的name 属性表示动作名,class 表示动作类名。
    <result> 标签的name 实际上就是execute 方法返回的字符串,如果返回的是“positive ”,就跳转到positive.jsp 页面,如果是“negative ”,就跳转到negative.jsp 页面。在<struts> 中可以有多个<package> ,在<package> 中可以有多个<action> 。我们可以用如下的URL 来访问这个动作:

http://localhost:8080/struts2/mystruts/sum.action
Struts1.x 的动作一般都以.do 结尾,而Struts2 是以.action 结尾。
【第5 步】  编写用户录入接口(JSP 页面)
1.        主界面(sum.jsp
Web 根目录建立一个sum.jsp ,代码如下:
<% @ page language = " java "  import = " java.util.* "  pageEncoding = " GBK "   %>
  
<% @ taglib prefix = " s "  uri = " /struts-tags " %>
  
  
< html >
      
< head >
          
< title > 输入操作数 </ title >
      
</ head >
  
      
< body >
           求代数和
          
< br />
          
< s:form  action ="mystruts/sum.action"   >                 
              
< s:textfield  name ="operand1"  label =" 操作数1" />
              
< s:textfield  name ="operand2"   label =" 操作数2"   />         
              
< s:submit  value ="代数和"   />             
          
</ s:form >
      
</ body >
  
</ html >
 
sum.jsp 中使用了Struts2 带的tag 。在Struts2 中已经将Struts1.x 的好几个标签库都统一了,在Struts2 中只有一个标签库/struts-tags 。这里面包含了所有的Struts2 标签。但使用Struts2 的标签大家要注意一下。在<s:form> 中最好都使用Struts2 标签,尽量不要用HTML 或普通文本,大家可以将sum.jsp 的代码改为如下的形式,看看会出现什么效果:
         ... ...
            求代数和
          <br/>
          <s:form action="mystruts/sum.action" >               
操作数1 <s:textfield name="operand1" /><br/>
操作数2 <s:textfield name="operand1" /><br/>
              <s:submit value=" 代数和" />           
          </s:form>
          ... ...
     提示一下,在<s:form> Struts2 使用<table> 定位。
2.        positive.jsp
<% @ page language = " java "  import = " java.util.* "  pageEncoding = " GBK " %>
  
<% @ taglib prefix = " s "  uri = " /struts-tags "   %>
  
  
< html >
    
< head >
      
< title > 显示代数和 </ title >
    
</ head >
    
    
< body >     
      代数和为非负整数
< h1 >< s:property  value ="sum"   /></ h1 >
    
</ body >
  
</ html >  
 
3.        negative.jsp
  <% @ page language = " java "  import = " java.util.* "  pageEncoding = " GBK " %>
  
<% @ taglib prefix = " s "  uri = " /struts-tags "   %>
  
  
< html >
    
< head >
      
< title > 显示代数和 </ title >
    
</ head >
    
    
< body >
      代数和为负整数
< h1 >< s:property  value ="sum"   /></ h1 >
      
    
</ body >
  
</ html >  

 
    这两个jsp 页面的实现代码基本一样,只使用了一个<s:property> 标签来显示Action 类中的sum 属性值。<s:property> 标签是从request 对象中获得了一个对象中得到的sum 属性,如我们可以使用如下的代码来代替<s:property value=”sum”/>
 
<%
 com.opensymphony.xwork2.util.OgnlValueStack ovs =
(com.opensymphony.xwork2.util.OgnlValueStack)request.getAttribute("struts.valueStack"); 
 out.println(ovs.findString("sum")); 
%>
     启动Tomcat 后,在IE 中输入如下的URL 来测试这个例子:

http://localhost:8080/struts2/sum.jsp





 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/216515 ,如需转载请自行联系原作者
相关文章
|
数据可视化 测试技术
一文了解软件测试规范
软件测试规范是测试工作的依据和准则,在进行软件测试时,应在相关国标文件的要求和指导下完成测试工作,这样可以从根本上保证软件测试工作的质量,进而提升软件产品的质量。 一个完整的软件测试规范应该包括对规范本身的详细说明,例如规范的目的、范围、文档结构、词汇表、参考信息、可追溯性、方针、过程/规范、指南、模板、检查表、培训、工具、参考资料等。
1402 0
一文了解软件测试规范
|
SQL 开发框架 .NET
如何在 EF Core 中使用乐观并发控制
如何在 EF Core 中使用乐观并发控制
131 0
|
XML 安全 Java
掌握SpringBoot单点登录精髓,一键通行多系统,轻松打造无缝用户体验新纪元!
【8月更文挑战第29天】单点登录(SSO)是一种身份认证机制,用户在多个相互信任的应用系统中只需登录一次即可访问所有系统,无需重复输入凭证。本文详细介绍如何利用Spring Security和OAuth2在SpringBoot中实现SSO,并提供示例代码。核心步骤包括:引入依赖、配置认证服务器与资源服务器、实现单点登录拦截器及完成SSO配置。通过合理配置,SSO能显著提升用户体验和系统安全性。
637 2
|
11月前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
1898 3
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
传感器 搜索推荐 物联网
5G与物联网:构建万物互联的未来世界
【9月更文挑战第11天】5G与物联网的融合正引领我们进入一个万物互联的未来世界。在这个世界中,各种设备将通过网络紧密相连,实现数据的实时传输和处理。这不仅将极大地方便人们的生活和工作,还将推动社会向智能化、数字化迈进。我们有理由相信,在不久的将来,一个更加智能、便捷、高效的世界将呈现在我们面前。
|
监控 Ubuntu Linux
|
JSON JavaScript 前端开发
qml的文件结构及其对象基本属性
qml的文件结构及其对象基本属性
259 2
|
传感器 存储 监控
引领未来生活方式的智慧之家——物联网在智能家居中的应用
在当今科技日新月异的时代,物联网已经渗透到了我们生活的方方面面,其中最具代表性的就是智能家居。本文将探讨物联网在智能家居中的应用,并剖析其对人们生活方式的影响。从智能家居系统的构成、数据收集与分析、设备互联等角度深入阐述,旨在帮助读者更好地理解物联网技术在智能家居中的重要性和优势
834 4
|
JavaScript 前端开发
layui复选框checkbox全选和获取值的解决方案
layui复选框checkbox全选和获取值的解决方案
1828 0
[海康相机] 连接相机失败:未安装USB3驱动或驱动无效
[海康相机] 连接相机失败:未安装USB3驱动或驱动无效
624 0