IT考试必备知识:认识Struts

暴风高达 收藏 1 629
导读:转至:htt_p://w_ww.goceanedu.com.cn HelloWorld 之初识 Struts 2.0(2008-06-27 09:15:51) Struts2的诞生源于OpenSynphony的著名Web框架WebWork,和Struts1一样,WebWork也是主流的Web框架之一。由于年轻的缘故,WebWork的技术先进程度要优于Struts1,但Struts1却具有更广泛的客户群。     2005年,双方终于

转至:htt_p://w_ww.goceanedu.com.cn


HelloWorld 之初识 Struts 2.0(2008-06-27 09:15:51)

Struts2的诞生源于OpenSynphony的著名Web框架WebWork,和Struts1一样,WebWork也是主流的Web框架之一。由于年轻的缘故,WebWork的技术先进程度要优于Struts1,但Struts1却具有更广泛的客户群。

    2005年,双方终于决定合作开发下一代的Web框架,Struts2于是诞生。从技术层面讲,Struts2采用了WebWork的核心技术而与Struts1完全不兼容。

   以下通过一个简单的登录功能展现Struts2.0的基本概念。用户通过下面页面输入用户和密码,然后提交,如果用户名和密码分别为“whatisjava”和“java”则显示成功页面,否则将转回登录页面并提示错误信息。


 一、安装Struts 2.0

 可以从Struts官方网站 htt_p://s_truts.apache.org/ 下载Struts2的发行包。将发行包中lib文件夹下的下列jar文件复制到应用的/WEB-INF/lib下。这些jar文件是运行简单Struts2应用的最小集合。

struts-core-2.1.2.jar

xwork-2.1.1.jar

ognl-2.6.11.jar

commons-logging-1.0.4.jar

commons-fileupload-1.2.1.jar

freemarker-2.3.12.jar

 

二、配置FilterDispatcher过滤器

在web.xml中按如下配置:    ... ... ...

   <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>

   ... ... ...

    FilterDispatcher是Struts2提供的过滤器,可以看成Struts2的前端控制器,它将截获所有请求。针对形如“*.action”的请求,Struts2最终将调用合适的action组件实现业务流程处理,例如:若用户的请求为:“.../logon.action”将最终调用名为logon的Action类的execute方法。

    由于采用了动态代理机制,Struts2的Action不在需要继承Struts提供的类(Struts1的Action需要继承org.apache.struts.action.Action类),Struts2的Action可以是一个普通的Java类,称之为POJO(普通而平凡的Java类),这正是时下盛行的“低侵入性”的体现。

 

三、配置Action

    Struts2需要有struts.xml配置文件用于指定action等配置信息,该文件应置于应用类路径(/WEB-INF/classes)中,如果使用Eclipse开发工具,在src文件夹下编辑即可。本应用的struts.xml的配置如下:       ... ... ...

   <?xml version="1.0" encoding="UTF-8" ?>   <!DOCTYPE struts PUBLIC        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"        "ht_tp://s__truts.apache.org/dtds/struts-2.0.dtd">   <struts>      <package name="some" extends="struts-default" namespace="/test">        <action name="logon" class="action.LogonAction">          <result name="success">/view/success.jsp</result>          <result name="error">/view/logon_form.jsp</result>       </action>     </package>   </struts>

   ... ... ...

       

    其中package元素用于定义包,Struts2中的包类似于Struts1的模块,一个包可以包含多个action、interceptor等组件的的定义。一个包看成一系列action、interceptor等组件的集合。package元素的主要属性有name、extends和namespace。

name属性用于指定该包的名称,是用于引用该包的标识。

extends属性用于指定该包所继承的包,一个包继承另外一个包就拥有了另外一个包的所有定义。此处名为some的包继承了Struts自定义的struts-default包,这是必要的,因为struts-default包定义了应用必须使用到的一些组件。struts-default包的定义在struts-default.xml文件中,该文件位于struts-core-2.1.2.jar中,在应用启动时被自动加载。

namespace属性用于定义该包的命名空间。一个包如果定义了命名空间后,该包中的所有action的对应的URI为: “/应用名/所在包的命名空间名/acion名.action” 例如,上述文件中名为logon的acion所对应的URI为“/应用名/test/logon.action”。如果不指定namespace属性,则默认的namespace属性值为“”,其对应包中的action的URI为“/应用名/acion名.action”。

    元素的定义Action组件,其主要属性name和class:

name属性用于指定action的名称,用于标识该action,与该action对应的URI为“.../action名称.action”。

class属性用于指定该action对应的类名,该类可以是一个普通的POJO,通过execute方法封装业务处理流程。

    元素的子元素类似于Struts1中的forward定义。将action所转向的页面地址映射为字符串名称。action类的execute方法将返回一个字符串,即表示所定义的页面名称,Struts2将转向到该名称所对应的页面地址。上述配置文件中的两个分别表示登录成功(success)和失败(error)后所转向的地址。

 

四.action类

    与Struts1不同,Struts2的Action类可以不需要ActionForm为其传送表单数据。Struts2的Action类可以通过自己属性获得表单数据,例如下面LogonAction,当用户请求“../test/logon.action”时,Struts2将创建LogonAction实例,并调用setter方法填充其username和password属性。LogonAction的message属性用于记录向页面输出的结果,将存放在request中。

    另外,Struts1的Action以单实例的方式工作,而Struts2会为每次请求创建新的Action实例,不存在线程安全的问题。

    Action的execute方法用于处理业务流程。该方法应返回一个字符串参数,与相应action配置的result元素对应,表示应转向的页面地址。

   需要注意的是,虽然Struts2的Action采取了与HTTPServlet低耦合的设计方式,但需要访问Servlet API的情况还是经常有的。可以通过ActionContext类获得对request,session等Servlet API进行访问的途径,如:下面类中的 “ctx.getSession().put("username", username);”用于在HTTPSession对象中存入数据。

 

import com.opensymphony.xwork2.ActionContext;

public class LogonAction {

    private String username;    private String password;    private String message;

    //getter and setter

    ... ... ...

    public String execute() {        if ("whatisjava".equals(username) && "java".equals(password)) {            ActionContext ctx = ActionContext.getContext();            ctx.getSession().put("username", username);            setMessage("成功登入");            return "success";        } else {            setMessage("用户名或密码错误");            return "error";        }    }} 

五、JSP页面

   logon_form.jsp为登录表单,success.jsp为登录后的成功页面,此处没有使用Struts2所提供的标签库,与普通JSP没有相比无特殊之处,注意:通过EL“${requestScope.message}”显示Action的输出信息。

   logon_form.jsp主要内容如下:

   ... ... ...

    <form action="test/logon.action" method="post">      <table cellpadding="0" cellspacing="0" border="0"       class="form_table">       <tr>        <td valign="middle" align="right">         用户名:        </td>

        <td valign="middle" align="left">         <input type="text" class="inputgri" name="username" />        </td>       </tr>       <tr>        <td valign="middle" align="right">         密码:        </td>        <td valign="middle" align="left">         <input type="password" class="inputgri" name="password" />        </td>       </tr>

      </table>

      <p>       <input type="submit" class="button" value="提交 »" />      </p>     </form>

     <p>      ${requestScope.message}     </p>     ... ... ...

 

  

    success.jsp主要内容如下:   ... ... ...

    <div id="content">     <p id="whereami">     </p>     <h1>      ${requestScope.message}     </h1>     <p>欢迎你,${sessionScope.username}</p>    </div>    ... ... ...

0
回复主贴

相关文章

更多 >>
聚焦 国际 历史 社会 军事
1条评论
点击加载更多

发表评论

更多精彩内容

经典聚焦

更多
发帖 向上 向下
广告 关闭