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,敲入以下代码:
< 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 >
<?
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等,深入的东西请留意以后的文章。
<! 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 >
<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方法,因为父类已经有了默认的实现。
*
*/
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类,然后该写页面了,我这里用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:
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 >
<%
@ 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跑通了吗,米老鼠?呵呵!”,恭喜你,你已经入门了。
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 >
下面解释下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类中的呢?这就要归功于伟大的拦截器机制了,关于拦截器的更多内容,请参看后面的文章,呵呵!
< s:textfield name ="myName" ></ s:textfield >
< s:submit value ="提交" ></ s:submit >
</ s:form >
提交数据后,struts找到myFirstAction的配置,把结果导向到了first_action_result.jsp中,结果页面通过<s:property />标签将myName打印到页面上了。
看了这篇文章,应该觉得struts2开发很简单吧?
下一篇文章将深入介绍struts.xml,敬请关注。