写教程的目的并不是为了显示自己的高深,而是帮助他人快速入门,因此我这里不强调太多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,敬请关注。
posted on 2009-10-22 20:49
Mickey.Shao 阅读(620)
评论(0) 编辑 收藏 所属分类:
struts2