struts1.x和struts2.x随笔

时间:2021-10-28 22:02:58

网上有很多关于struts1.x和struts2.x的文章,但是都不太清楚,本人身为初学者,把自己的心得分享给和我一样的初学者,如有不对的地方请多多指出,谢谢。如果需要转载请注重个人学习成果,请注明出处,谢谢!
另外参考网上高手写的struts心得原创,地址:http://www.blogjava.net/nokiaguy/archive/2008/04/15/193229.html 建议看看。

首先我测试的工具是myeclipse9.0 M2。

笔记开始:

       首先先给大家看看目录:
       struts1.x的整站结构图: struts1.x和struts2.x随笔    struts2.x的整站结构图: 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文件中配置ActionActionForm

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文件中配置ActionActionForm。这个配置就是让服务器知道怎么工作,比如:当用户在登录页面点击登录之后,它就根据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.xStruts2都是必须的,只是安装的方法不同。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),而在Struts2ActionFormAction已经二合一了。从下面的代码可以看出,前面部分就是应该写在ActionForm类中的内容。
     从下面的代码可以看出,动作类的一个特征就是要覆盖execute方法,只是Struts2execute方法没有参数了,而Struts1.xexecute方法有四个参数。而且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.xstruts2.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和文本框不在同一行内。