网上有很多关于struts1.x和struts2.x的文章,但是都不太清楚,本人身为初学者,把自己的心得分享给和我一样的初学者,如有不对的地方请多多指出,谢谢。如果需要转载请注重个人学习成果,请注明出处,谢谢!
另外参考网上高手写的struts心得原创,地址:http://www.blogjava.net/nokiaguy/archive/2008/04/15/193229.html 建议看看。
首先我测试的工具是myeclipse9.0 M2。
笔记开始:
首先先给大家看看目录:
struts1.x的整站结构图: struts2.x的整站结构图:
首先给出struts1.x 的搭建过程,之后是struts2的搭建过程,在搭建过程中会对struts1.x和struts2.x的重点进行说明并说说他们的区别。在搭建环境之前说明一下,我是用myeclipse9.0 M2开发的,myeclipse会自动生成struts的jar包等文件及配置文件,如果是使用eclipse或者是其它工具开发的话,需要到网站下载struts框架需要的jar包,并添加到相应的目录,例如:在eclipse中开发struts1.x时,需要把struts1.x的支持jar包复制到/WEB_INF/lib目录下,把需要的tld文件复制到/WEB_INF目录下。struts的框架请自己百度下载,在这里就不给的地址了。对于各个配置文件属性的详细说明,请读者自己在百度搜索,百度很多的,都写得很好。
struts1.x------------------------------------------------------------------------------------------------------------------------------------
现在开始搭建struts,搭建环境Struts1.x的基本步骤。
1. 安装Struts1.x。由于Struts的入口点是ActionServlet,所以得在web.xml中需要配置这个Servlet。
2. 编写ActionForm类(一般从org.apache.struts.action.ActionForm类继承),这一步不是必须的,如果要接收客户端提交的数据,需要执行这一步。
3. 编写Action类(一般从org.apache.struts.action.Action类继承)。
4. 在struts-config.xml文件中配置Action和ActionForm。
5. 如果要采集用户录入的数据,一般需要编写若干JSP页面,并通过这些JSP页面中的form将数据提交给Action。
根据上面的步骤,就可以搭建出struts1.x的的环境
(一)编写web.xml文件(如果没有就新建),配置要使用struts1.x必须配置web.xml文件,这样web才能支持struts,配置代码如下:
(二)编写ActionForm类,在ActionForm类可以说是一个简单的POJO类,在它的内容里只需要定义对象的属性和定义每个参数的get和set方法(这里的参数就是表单中的的参数,名字可以根据自己习惯,最好是见名知意),所以struts1.x的ActionForm代码如下
struts1.x 的Form文件:LoginForm.java的类文件代码如下:
package struts1.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(三)编写Action类,struts1.x 的Action类是最关键的类,它是必须的。Action类必须继续Action类并实现Action类中的execute方法,这个方法中的的内容就是我们的重点,我们把数据的控制都写在这里,这个Action类接收表单的数据,进行判断处理,然后根据结果返回一个页面转向(我这里的只是简单的测试,并没有涉及数据库操作,所以比较简单),所以struts1.x的Action代码如下
struts1.x 的Action文件:LoginAction.java的类文件代码如下:
package struts1.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import struts1.form.LoginForm;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
String username=loginForm.getUsername();
String password=loginForm.getPassword();
if(username.equals("aaa")&&password.equals("000")){
return mapping.findForward("Success");
}else return mapping.findForward("Fail");
}
}
(四)在struts-config.xml文件中配置Action和ActionForm。这个配置就是让服务器知道怎么工作,比如:当用户在登录页面点击登录之后,它就根据action的配置工作,当然还有其他的一下配置,在这个测试中不需要就不写了。
struts1.x 的struts-config.xml配置页面代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans >
<form-bean name="loginForm" type="struts1.form.LoginForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
name="loginForm"
path="/login"
scope="request"
type="struts1.action.LoginAction">
<forward name="Success" path="/success.jsp"></forward>
<forward name="Fail" path="/fail.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="struts1.ApplicationResources" />
</struts-config>
第五步的内容已经在前面写好了,各个页面的代码如上面所示,现在就可以运行测试了。到此struts1.x测试完成。
struts2.x----------------------------------------------------------------------------------------------------------------------------------------------
开始搭建struts2.x。在说struts2.x之前先说一下webwork吧,WebWork2.2版本发布之后,官方宣称WebWork框架将要和Struts合并。这让一些WebWork的用户产生了担忧,合并之后,是不是就意味着自己在WebWork这方面技术和经验的积累都已浪费?已使用或即将使用WebWork的项目是不是就意味着更多的风险?
答案是:完全不用担心这些。WebWork和Struts的合并,是各取所长,然后诞生出一个更加高效的Web框架。而这个框架用得就是WebWork的优秀技术和Struts的强大社区。
合并的情况如下:
1、 产生一个新的项目Struts Action 2.0 = WebWork2.2 + 一些Struts的功能和特性。
2、 WebWork框架将会中止新功能的增加,如果有新的版本发布都会是Bug的修改。
3、 代码、框架的开发者、社区都将移到Struts。
4、 合并的目标是致力于生产率的提高。
5、 Struts不再是一个框架,它是一个社区。
6、 Struts社区中主要有两个Web框架。一个是基于Action模型的Struts Action;另一个是基于组件模型的Struts Shale。
由上面的说明可以看到,struts2.x是webwork和struts1.x的合并产物,他们各取其优,但是要说明的是Struts2虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了Struts1.x的方式(当然,Struts2仍然是基于MVC模式的,也是动作驱动的,可能这是唯一没变的东西)。Struts2实际上是在Webwork基础上构建起来的MVC框架。我们从Struts2的源代码中可以看到,有很多都是直接使用的xwork(Webwork的核心技术)的包。既然从技术上来说Struts2是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。
搭建环境Struts2.x的基本步骤。
1. 安装Struts2.x ,在web.xml中需要配置struts。
2. 编写Action类(包含了struts1.x中的Action和ActionForm,一般从com.opensymphony.xwork2.ActionSupport继承)。
3. 在struts.xml文件中配置Action。
4. 如果要采集用户录入的数据,一般需要编写若干JSP页面,并通过这些JSP页面中的form将数据提交给Action。
根据上面的步骤,就可以搭建出struts2.x的的环境
(一)安装Struts2.x,配置web.xml文件,这一步对于Struts1.x和Struts2都是必须的,只是安装的方法不同。Struts1的入口点是一个Servlet,而Struts2的入口点是一个过滤器(Filter)。因此,Struts2要按过滤器的方式配置。下面是在web.xml中配置Struts2的代码:
struts2.x 的web.xml配置页面代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
(二)编写Action类,这一步和Struts1.x也必须进行。只是Struts1.x中的动作类必须从Action类中继承,而Struts2.x的动作类需要从com.opensymphony.xwork2.ActionSupport类继承。
在Struts1.x中,必须要单独建立一个ActionForm类(或是定义一个动作Form),而在Struts2中ActionForm和Action已经二合一了。从下面的代码可以看出,前面部分就是应该写在ActionForm类中的内容。
从下面的代码可以看出,动作类的一个特征就是要覆盖execute方法,只是Struts2的execute方法没有参数了,而Struts1.x的execute方法有四个参数。而且execute方法的返回值也不同的。Struts2只返回一个String,用于表述执行结果(就是一个标志)。
所以Action类代码如下:
struts2.x 的Action类,LoginAction类文件的代码如下:
package com.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
if(getUsername().equals("bbb")&&getPassword().equals("111")){
return "Success";
}
else
{
return "Fail";
}
}
}
(三)在struts.xml文件中配置Action,这一步struts1.x和struts2.x都是必须的,只是在struts1.x中的配置文件一般叫struts-config.xml(当然也可以是其他的文件名),而且一般放到WEB-INF目录中。而在struts2.x中的配置文件一般为struts.xml,放在src目录下,当程序运行的时候会自动复制到/WEB-INF下。
struts2.x 的struts.xml配置页面代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2" extends="struts-default" >
<action name="Login" class="com.struts2.action.LoginAction">
<result name="Success">/success.jsp</result>
<result name="Fail">/fail.jsp</result>
</action>
</package>
</struts>
在<struts>标签中可以有多个<package>,第一个<package>可以指定一个Servlet访问路径(不包括动作名),如“/mystruts”。extends属性继承一个默认的配置文件“struts-default”,一般都继承于它,大家可以先不去管它。<action>标签中的name属性表示动作名,class表示动作类名。
到此struts2.x配置完成。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
各个页面代码如下:
index.jsp,success.jsp,fail.jsp的页面代码(struts1.x和struts2.x的一样):
index.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="login.jsp">登录</a> <br>
</body>
</html>
success.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
登录成功! <br>
</body>
</html>
fail.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
登录失败! <br>
</body>
</html>
struts1.x 的login.jsp页面代码如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<html:form action="/login">
username : <html:text property="username"/><br/>
password : <html:password property="password"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
struts2.x 的login.jsp页面代码如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<s:form action="Login">
<s:textfield name="username" label="username" />
<s:password name="password" label="password" />
<s:submit/>
</s:form>
</body>
</html>
----------------------------------------------------------------------------------------------------------------------------------------
struts2.x的其他一些特性:
在login.jsp中使用了Struts2带的tag。在Struts2中已经将Struts1.x的好几个标签库都统一了,在Struts2中只有一个标签库/struts-tags。这里面包含了所有的Struts2标签。但使用Struts2的标签大家要注意一下。在<s:form>中最好都使用Struts2标签,尽量不要用HTML或普通文本,大家可以将struts2.x中的login..jsp的代码改为如下的形式,看看会出现什么效果:
........
<body>
<s:form action="Login">
username : <s:textfield name="username" />
password : <s:password name="password" />
<s:submit/>
</s:form>
</body>
提示一下,在<s:form>中Struts2使用<table>定位。如果使用上面的写法,在浏览器中将会看到username和文本框不在同一行内。
<result>标签的name实际上就是execute方法返回的字符串,如果返回的是“positive”,就跳转到positive.jsp页面,如果是“negative”,就跳转到negative.jsp页面。在<struts>中可以有多个<package>,在<package>中可以有多个<action>。我们可以用如下的URL来访问这个动作:
注:Struts1.x的动作一般都以.do结尾,而Struts2是以.action结尾。
到此struts2.x配置完成。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
各个页面代码如下:
index.jsp,success.jsp,fail.jsp的页面代码(struts1.x和struts2.x的一样):
index.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="login.jsp">登录</a> <br>
</body>
</html>
success.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
登录成功! <br>
</body>
</html>
fail.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
登录失败! <br>
</body>
</html>
struts1.x 的login.jsp页面代码如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<html:form action="/login">
username : <html:text property="username"/><br/>
password : <html:password property="password"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
struts2.x 的login.jsp页面代码如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<s:form action="Login">
<s:textfield name="username" label="username" />
<s:password name="password" label="password" />
<s:submit/>
</s:form>
</body>
</html>
----------------------------------------------------------------------------------------------------------------------------------------
struts2.x的其他一些特性:
在login.jsp中使用了Struts2带的tag。在Struts2中已经将Struts1.x的好几个标签库都统一了,在Struts2中只有一个标签库/struts-tags。这里面包含了所有的Struts2标签。但使用Struts2的标签大家要注意一下。在<s:form>中最好都使用Struts2标签,尽量不要用HTML或普通文本,大家可以将struts2.x中的login..jsp的代码改为如下的形式,看看会出现什么效果:
........
<body>
<s:form action="Login">
username : <s:textfield name="username" />
password : <s:password name="password" />
<s:submit/>
</s:form>
</body>
提示一下,在<s:form>中Struts2使用<table>定位。如果使用上面的写法,在浏览器中将会看到username和文本框不在同一行内。