Struts2 MVC

来源:互联网 发布:日程管理app 知乎 编辑:程序博客网 时间:2024/04/28 00:38

1. 资料

  • 江南白衣博物馆--Struts2笔记
  • 京山游侠--SpringSide 3 中的 Struts 2

2.选型

    Struts的招牌与用户群 + Webwork的较优雅架构 +  Convention Plugin实现零配置文件,Struts2已经成为传统MVC里的最安全选择。

    当然,GWT,Flex等是另一个潮流了。

3. in SpringSide 3.0

3.1 Convention Plugin实现零配置文件

    Convention Plugin是2.1.6最新坐正的零配置Plugin,取代了原来的CodeBehind等插件,详细见详见Struts2笔记。 及其官方文档,Alfa.Shi翻译了中文版

    SpringSide 在struts.xml中重新定义扫描了根package名为web, 即会扫描xxx.xxx.web下所有的子Package。

3.2 CRUDAction的Prepareable与ModelDrivenen接口(涉及CRUD时的可选接口)

       CRUD的Action全部使用Prepareable与ModelDriven接口,两个接口都是CRUD界面必备,详见Struts2笔记。
       而非CRUD的action是否使用这两个接口就看具体情况了。
       因为只有input() 和 save()两个函数需要二次绑定,而list()等函数并不需要,所以根据命名约定实现了prepareInput(),prepareSave()两个函数,Struts2会自动在执行input()与save()前执行它们,详见CRUDAction基类.

4.2. CRUDAction基类(涉及CRUD时的可选基类):

     规范了CRUD函数的名称,规定使用ModelDriven和Preparedable接口,并规范了prepare二次绑定接口只在input和save函数中的使用
     流程如下:

  1. 用户打开用户列表页,访问/user.action
    a.执行默认的execute() 函数,实际执行list() 函数。
    b.list() 函数查询列表放入某list变量,返回SUCCESS,默认跳转到user.jsp
    c.user.jsp取出action中的list变量进行渲染。
  2. 用户新增对象,访问/user!input.action
    a.首先将id放入id变量,执行prepareInput()函数创建一个新的user变量
    b.input() 函数,返回INPUT,默认跳转到user-input.jsp
    c.user-input.jsp 执行getModel()获得user变量渲染input框
  3. 用户提交Form,访问/user!save.action
    a.执行preparedSave()函数创建新的user变量,将input框的内容绑定到getModel()获得的user变量
    b.执行save()函数保存user,返回RELOAD,跳转到@Result中定义RELOAD页面,以redirect方式重新打开/user.action
  4. 用户修改对象,访问/user!input.action?id=1
    a.绑定id=1到id变量,执行prepareInput()从数据库查询出user。
    b.下同2.
  5. 用户提交Form,访问/user!save.action
    a.绑定id=1到id变量,执行prepareSave()从数据库查询出user。
    b.下同3.

3.3 View相关

  • View /Taglib 相关规则详见View/Taglib,
  • JSP放在WEB-INF/content 中保证文件不可读,使SpringSecurity专心的只过滤*.action。
  • 基于Convention的神奇映射能力,WEB-INF/content/login.jsp的访问地址为/login.action,而且无需编写真正的LoginAction.java。

3.4 输入校验与国际化

  • Struts2的validate框架优点是可以在客户端和服务端同时进行校验。
    但是因为JQuery的validate plugin客户端检测更加好用,而且客户千方百计绕开客户端,直接发送一个邮箱格式不正确的请求意义不是很大,真的很紧要校验,还可以在服务层进行(参考hibernate validator)。
    所以用了JQuery的validate plugin,见Javascript。
  • 国际化,因为国际化式的开发是有成本的,挺麻烦的,因为不是每个项目都需要国际化的能力,所以在默认的mini-web示例里就不演示了。

3.5 信息与异常显示

        1.页面在跳转时会丢失addActionMessage()的信息, 在struts.xml中配置使用store interceptor,可以在redirect页面时,将信息存储在session中.

        2.尽量使用addActionMessage来添加信息, 如果用addActionError会自动跳到input页。

4. SpringSide Core的封装

4.1. Struts2Utils:

  • 绕过jsp/freemarker直接输出字符串/JSON/XML的便捷函数,用于ajax请求等简单输出结果,支持encoding,no-cache等参数。
  • 获取http request/response/session的简化方法.