struts2 crud

CRUD DEMO I

STRUS2 CRUD 例子
由于是wiki静态页面的输入,附件不可用,你可以在..找到.war文件。

介绍
欢迎到struts2(s2) CRUD的例子。这个例子被尽可能简单的创建,它没有使用任何进阶的特性,比如Spring IoC, Hibernate Open-session-in-view, OS Sitemesh, annotations等等。对于这些进阶的和其他的例子,请参考 struts2 Guides。

struts2
Struts2 是一个传统的MVC2 基于action 的框架(比如Struts 1, Stripes, Simple, ..),不同于新出现的基于事件的框架(比如JSF, Wicket, Rife, ..)。Strut2使用XWork引擎,一个处理conversion,validation.interception..的基础命令模式的框架。Struts2是基于webwork上,一个开始是为了克服apache struts1的一些问题的尝试。

.war 部署
你可以在网站上下载.zip包然后把它放到你的servet容器下(然后把它重命名为.war),它下面WEB-INF包含了源码。布局已经尽可能的精简了。

配置文件
WEB-INF/web.xml
web应用的描述符文件包含了一个过滤器和它的映射文件。这个过滤器默认映射到/*,意味着所有的请求都会被拦截,但是只有特定后缀(默认是.action)还有某些特别的路径(对于静态文件)会被struts2处理。
<web-app>
    <display-name>Struts 2 CRUD Demo</display-name>
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>


WEB-INF/classes/struts.xml
struts2.xml包含了XWork的配置:actions, validation, interceptors and results。
为了理解这些术语,我们需要看一看struts2(XWork)的结构。一个基本的请求有点像这样:一个请求被提交了,我们的actionMapper会试图检测正确的action执行。它会查找在你的struts.xml中注册的名字。如果找到了,在执行这个action前,他会遍历一个拦截器的栈定义。

拦截器在Struts2是非常重要的,它会在你的action之前和之后执行,然后提交到视图中,它本身就能完美的控制validation, authentication, open-session-in-view patterns, catching exceptions, setting or altering parameters, hiding complex operations,等等。struts2提供了许多创建好的有一系列特性栈,但是没有什么能够不会让你去想实现你自己的拦截器。

最实用的拦截器之一是'params'拦截器,他会把你的请求参数注入到你的action中。所以如果你的action有一个setName(String),而且你的请求参数叫'name',你的参数就会被注入到action中。并没什么特别的,是吗?好吧,setId(Long id)怎么样?只要你的id参数能够被转换成long类型,他也会起作用。还不够特别吗?提交一个叫empolyee.id的参数怎么样?是的,就和你想的一样,他会当成getEmployee().setId(Long id)来执行。struts2能够处理所有正常的对象(Integer, String, Date, .. and Arrays, Lists, Maps, ..)。这些对你来说还不够?你可以创建自己的转换器来处理那些更复杂的对象。

验证也是框架中重要的一个方面,增加验证是一个缓慢而复杂的过程,更不用说添加出错时候的那些反馈信息。我们认为不要重复发明轮子,所以struts2有一个松散耦合的验证框架,这个你会在插入或修改一个employee的action中看到。

当一个action执行的时候,结果将用于控制流程。这些简单的字符串("success", "error", "input", ..)会被用于执行某种结果-可能是被转发到一个jsp页面,提交到一个freemarker模板,产生一个报表,输出xml,你的名字等。它全面不依赖于你的action。注意,当验证失败时,结果默认是'input'。

一旦结果被提交、转化、执行.. WW会再反向遍历拦截器,这对于资源清理,日志,时间处理来说相当完美。

让我们来看看struts2.xml里面的更多细节。
<struts>
    <!-- Configuration for the default package. -->
    <package name="default" extends="struts-default">

        <!-- Default interceptor stack. -->
        <default-interceptor-ref name="paramsPrepareParamsStack"/>
       
        <action name="index" class="com.aurifa.struts2.tutorial.action.EmployeeAction" method="list">
            <result name="success">/WEB-INF/jsp/employees.jsp</result>
            <!-- we don't need the full stack here -->
            <interceptor-ref name="basicStack"/>
        </action>

        <action name="crud" class="com.aurifa.struts2.tutorial.action.EmployeeAction" method="input">
            <result name="success" type="redirect-action">index</result>
            <result name="input">/WEB-INF/jsp/employeeForm.jsp</result>
            <result name="error">/WEB-INF/jsp/error.jsp</result>
        </action>
    </package>
</struts>

有四个主要的节点元素在这个例子里面:package, interceptor, action, and result.
Packages 是一种将actions, results, result types, interceptors, and interceptor-stacks组合到一个单元里的途径。
概念上讲,包和对象相似,能被继承,有私有部分,能被子包重写。具体的细节参看..

拦截器允许你在执行action方法代码的前后加上一些代码。到目前为止,我们确认在我们例子中使用{{paramsPrepareParamsStack }}拦截器;你可以忽略掉这个。具体的细节参看..

在框架中,action映射是基本的工作单元。本质上,action映射处理一个类的标识符。当一个请求匹配action的名称时,框架使用映射去查找怎样处理这个请求。

在我们的例子中,我们使用了同样的action(EmployeeAction)类定义了两个action。一个被登记为'index',用来转发index页面;另一个'crud' 会被用来执行各种增删改查操作。你也需要注意他们罗列了不同的方法属性:list方法默认执行,而我们的crud action运行input方法 。具体的细节参看..

在一个action执行后,result定义了如何处理。每个action执行都会返回一个字符串结果被用来匹配配置文件中result的不同处理结果。

对于我们的index action,我们不需要任何输出,我们假设没有错误,所以我们只需要列出正确的结果(注意:你也可以定义一个全局的结果集);result会使用默认的转发器result转发请求到employees.jsp file。也要注意一旦我们不需要所有的拦截器(no validation, fileupload, preparing, or other funky things),我们不如使用基本的拦截器拦截请求。

在我们的crud Action中还有更有趣的:除了success result,我们还有input result (转发到input表单) 和 error result (返回一个被抛出的异常在action执行的时候,比如数据库异常)。你也可以看到我们对于success result 指定了不用的结果类型,以防重定向。


no end.





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值