Struts2 第一部分 跑通你的第一个struts2应用

Struts2 第一部分 跑通你的第一个struts2应用
    写教程的目的并不是为了显示自己的高深,而是帮助他人快速入门,因此我这里不强调太多struts2底层的东西,但是也会介绍一些必须了解的东西。好了,废话少说,开始吧!
    首先介绍下我的开发环境:eclipse3.5+jetty6+maven2+struts2.1.6。按照maven2规范,我们新建一项目Struts2Demo,建立源文件夹src/main/java和src/main/resources,建立webapp目录src/main/webapp,在webapp目录下建立WEB-INF目录,并创建一个web.xml文件。当然这些你完全可以使用maven2的Archetype插件创建。建立好的目录如下图:
   
    之后就应该先引入struts2依赖了,我们使用m2eclipse可以方便地引入struts2依赖的包,首先enable maven dependency management,然后就自动生成了pom.xml,接下来引入struts-core-2.1.6.jar,可以看到,struts2-core所依赖的jar包都给自动下载下来了,用maven2就是方便,而且能最大程度避免版本冲突问题。struts2.1.6依赖的包如下图(不用maven的可以一个个下):
   
    依赖问题解决后,就该开始开发了,在我们的web.xml配置struts2的filter(注意:版本不同filter可能不一样,详细可以看 struts2官方的guide)。我的web.xml代码:
<? xml version="1.0" encoding="UTF-8" ?>
< web-app  id ="Struts2Demo"  version ="2.4"  
    xmlns
="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

    
< filter >
        
< filter-name > struts2 </ filter-name >
        
< filter-class > org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </ filter-class >
    
</ filter >
    
< filter-mapping >
        
< filter-name > struts2 </ filter-name >
        
< url-pattern > /* </ url-pattern >
    
</ filter-mapping >
    
    
< welcome-file-list >
        
< welcome-file > home.action </ welcome-file >
    
</ welcome-file-list >
</ web-app >
    然后我们在src/main/resources下创建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 ="GettingStarted"  extends ="struts-default"  namespace ="/" >
        
< action  name ="home" >
            
< result > /index.jsp </ result >
        
</ action >
        
< action  name ="gettingStarted" >
            
< result > /WEB-INF/pages/getting_started/first_action_input.jsp </ result >
        
</ action >
        <action name="myFirstAction" class="org.mickey.struts2demo.GettingStarted.MyFirstAction">
            
<result name="success">/WEB-INF/pages/getting_started/first_action_result.jsp</result>
        
</action>

    
</ package >
</ struts >
    稍作解释哈,前四行照搬就可以了,然后一个struts配置文件必须是以<struts>为根的,<package>是包,主要包括name和namespace,name只是一个普通标识而已,保证全局唯一即可,namespace就是我们通过url访问时的所谓的名空间,比如namespace="/mickey",package下有一个action名为test,那么我们通过url访问的时候就是http://host:port/mickey/test.action。namespace不一定只有一个/,如"/mickey/minnie"都可以。我这里的package继承了struts-default包,这个包能在struts-core-2.1.6.jar中找到,在struts-default.xml里面,这个default包包含了一些拦截器,一些result types等,深入的东西请留意以后的文章。
    <action>标签主要包括name,class,method属性,name就是通过url访问的action的名字,如刚刚的例子就是name="test", class就是定位处理这个action的Action类,struts2中的Action只是pojo而已,十分简单。method就是指定用Action类中的哪个方法来处理这个action,如果不指定method,默认使用execute方法,看看我的struts.xml吧,绿色底那块,我们把class指向了org.mickey.struts2demo.GettingStarted.MyFristAction,下面我们来看看这个类吧:
/**
 * 
 
*/
package  org.mickey.struts2demo.GettingStarted;

import  com.opensymphony.xwork2.ActionSupport;

/**
 * 
@author  mickey.shao
 *
 
*/
public   class  MyFirstAction  extends  ActionSupport {
    
/**
     * 
     
*/
    
private   static   final   long  serialVersionUID  =   - 6911104681578292245L ;

    
private  String myName;
    
    
public  String getMyName() {
        
return  myName;
    }
    
public   void  setMyName(String myName) {
        
this .myName  =  myName;
    }

    
public  String execute(){
        
return  SUCCESS;
    }
}
    一般我们写Action可以不继承任何类,但是继承ActionSupport是更好的选择,这样可以获得框架更好的支持。看到execute方法了吧?一般action的method需要满足以下特点:1.必须是public,2.必须返回String,3.必须不带任何参数。SUCCESS其实是一个字符串"success",struts2已经定义好了。action myFirstAction没有指定method方法,默认就执行execute了,当然我们完全可以不写execute方法,因为父类已经有了默认的实现。
    写完Action类,然后该写页面了,我这里用jsp,在src/main/webapp/WEB-INF下建立文件夹pages/getting_started,新建两个jsp:first_action_input.jsp和first_action_result.jsp。先贴下这两个文件的代码哈:
first_action_input.jsp:
<% @ page language = " java "  contentType = " text/html; charset=UTF-8 "
    pageEncoding
= " UTF-8 " %>
<% @ taglib uri = " /struts-tags "  prefix = " s "   %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" >
< title > 输入你的名字 </ title >
</ head >
< body >
    
< s:form  action ="myFirstAction"  namespace ="/"  method ="post" >
        
< s:textfield  name ="myName" ></ s:textfield >
        
< s:submit  value ="提交" ></ s:submit >
    
</ s:form >
</ body >
</ html >
first_action_result.jsp:
<% @ page language = " java "  contentType = " text/html; charset=UTF-8 "
    pageEncoding
= " UTF-8 " %>
<% @ taglib uri = " /struts-tags "  prefix = " s "   %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" >
< title > 看看结果? </ title >
</ head >
< body >
    struts2跑通了吗,
< font  color ="red" >< s:property  value ="myName" /></ font > ?呵呵!
</ body >
</ html >
    first_action_input.jsp用于输入任意的字符串,然后first_action_result.jsp显示你输入的字符串,很简单。在浏览器敲入 http://host:port/appName/gettingStarted.action,进入到first_action_input.jsp,输入“米老鼠”,点击提交,看看结果吧~看到“struts2跑通了吗,米老鼠?呵呵!”,恭喜你,你已经入门了。
    下面解释下action和jsp的关系是如何映射的。往上看回我们的struts.xml文件,action gettingStarted的<result>标签配置的是first_action_input.jsp的相对于webapp根目录的完整路径,当我们浏览器敲入 http://host:port/appName/gettingStarted.action,struts根据配置,把视图转向了所配置的jsp去了。然后看看另一个action myFirstAction,<result>标签中多了个属性name,这个其实就是Action类的方法返回的字符串了,<result>标签主要包括name和type属性,name默认是"success",所以看到gettingStarted的result没有配置name,其实是默认了。type默认是dispatcher,普通分发而已,无需赘述。当然type还有redirect,plain text,chain等很多,这些深入的请看后面的文章,呵呵!
    现在的问题是,如何使得action myFirstAction执行呢?这就看看我们的first_action_input.jsp代码吧,页面中我使用了struts的tags,请从struts-core包META-INF目录下将struts-tags.tld拷贝到WEB-INF目录下,在页面用taglib将其导入。页面有主要由一个form组成,form里面有一个input文本框和一个提交按钮,文本框和提交按钮我都用的struts的tag,当然也可以不用的,关于struts-tags的更多内容可以参考后面的文章。
    < s:form  action ="myFirstAction"  namespace ="/"  method ="post" >
        
< s:textfield  name ="myName" ></ s:textfield >
        
< s:submit  value ="提交" ></ s:submit >
    
</ s:form >
看到这段,是不是已经豁然开朗了?呵呵!看到myName了吧,这就是我们Action类中的域了!那么这个myName是如何设置到Action类中的呢?这就要归功于伟大的拦截器机制了,关于拦截器的更多内容,请参看后面的文章,呵呵!
    提交数据后,struts找到myFirstAction的配置,把结果导向到了first_action_result.jsp中,结果页面通过<s:property />标签将myName打印到页面上了。
    看了这篇文章,应该觉得struts2开发很简单吧?
    下一篇文章将深入介绍struts.xml,敬请关注。

你可能感兴趣的:(Struts2 第一部分 跑通你的第一个struts2应用)