SCM MVC框架FAQ


SCM MVC 框架 FAQ SCM MVC 框架 FAQ ........................................................................................................ 1 概述................................................................................................................................. 2 url 如何和 Action 类对应............................................................................................ 2 Action 中哪个方法被执行............................................................................................ 3 如何声明 Action 方法................................................................................................... 4 Action 方法对应哪个 jsp............................................................................................. 4 如何获取请求参数......................................................................................................... 5 如何返回信息给视图..................................................................................................... 5 如何输出 json 内容....................................................................................................... 6 如何实现重定向............................................................................................................. 6 如何在多次请求中保持状态......................................................................................... 6 如何使用 PageData........................................................................................................ 7 如何校验参数................................................................................................................. 7 如何添加业务校验......................................................................................................... 7 如何在用 ajax 调用服务端验证................................................................................... 8 如何显示校验失败信息................................................................................................. 8 如何使用 forms 标签..................................................................................................... 8 如何实现返回功能......................................................................................................... 9 如何显示操作结果....................................................................................................... 10 如何实现翻页............................................................................................................... 10 如何实现重置功能....................................................................................................... 10 如何实现关联下拉框................................................................................................... 11 如何上传文件............................................................................................................... 11 如何导出 EXCEL............................................................................................................ 11 如何导入 EXCEL............................................................................................................ 12 spring mvc 与 struts 的对比.................................................................................... 12 如何实现基本的增删改查........................................................................................... 14 概述 2010 年 5 月 3 日 18:40 此框架基于 spring mvc。 spring mvc 主要着眼于实现通用的,灵活的 mvc 解耦。 此框架的扩展部分则根据一些最佳实践来建立一种基于约定的开发方式,提供一些便利的 工具和通用的模式以提高开发效率、增加代码的可维护性,并内置一些机制以解决 web 开 发中的一些常见但不容易处理的问题。 本文档主要描述这些扩展部分,spring mvc 的一些基本用法也有提及,更详细的 spring mvc 文档请参考 http://static.springsource.org/spring/docs/current/spring-framework-reference/html/spring- web.html 框架的设计以下列软件开发的原则为出发点,也鼓励开发中遵守这些原则: COC Convention over configuration 约定 优于 配置 http://en.wikipedia.org/wiki/Convention_over_configuration DRY Don't repeat yourself 不重 复 http://en.wikipedia.org/wiki/Don%27t_repeat_yourself SOC Separation of concerns 分离 关注 点 http://en.wikipedia.org/wiki/Separation_of_concerns KISS keep it simple and stupid 保持 简单 http://en.wikipedia.org/wiki/KISS_principle 有兴趣的话请自行扩展了解。 url 如何和 Action 类对应 2010 年 4 月 22 日 19:52 1. 通过匹配 Action 类在 spring 容器中的 bean 的名字。 Action 类的名字由下列规则之一决定: 1. @Controller 中指定无后缀的 url: 如@Controller("/some/action") 则名字为 url 加上“.do”后缀,即/some/action.do 此用法与 ecom 中的传统做法一致 2. @Controller 中指定包含后缀的 url: 如@Controller("/some/action.html") 则名字直接使用该 url,即/some/action.html 3. @Controller 未包含参数 框架会根据 Action 类的包路径和类名自动生成 bean name。 如 scm.web.system.organization.action.QueryAction 类, 生成方式为包路径去除 scm.web、.action 这两部分,然后将类名去掉 Action 后缀, 将首字母变为小写,中间若有大写字母也将变为小写,但还会加上下划线“_”分 隔,最后将“.”号换为“/”号,并加上合适的后缀。 后缀默认为“.html”,但在类名为 OperateAction 或 FunctionsAction 时则为 “.do”。这样做是基于这样的想法:有界面的(输出 html 页面的)Action 相对应 的 Action 后缀为.html;纯功能性的 Action 则为.do,以更好地表达各自的用途。 根据上述规则,此例中的 Action 类的 bean 名字将为 system/organization/query.html 4. @Controller 中包含后缀参数 如@Controller(".json") 则规则与第 3 点相同,除了不使用默认规则来生成后缀,而是使用此处显示指定的 值。 2. 通过匹配@RequestMapping 注解中指定的 url 1. 可在 Action 类上添加@RequestMapping 注解,在其中指定 url。 此处的 url 可不带后缀,则支持 spring 的 servlet 映射的任意后缀; 也可显式指定后缀,则精确匹配该带后缀的 url 2. 可在 Action 方法的@RequestMapping 注解中指定 url。 规则与 1 相同 3. 综合匹配类和方法上@RequestMapping 注解的 url 参数 此时类上的 url 不加后缀,最终的 url 为类上的 url 加上方法上的 url。 @RequestMapping 还有其它更为灵活的用法,但由于不易理解,不推荐使用. 总结 建议使用第一类(bean name 方式)中的第 3 种方式来指定 Action 的 url,即完全根据约 定的惯例来实现,以提高代码的可维护性。 第二类(@RequestMapping 方式)只在特殊的场合下使用。 Action 中哪个方法被执行 2010 年 4 月 22 日 23:59 Action 类中要通过 url 调用的方法均需添加@RequestMapping 参数。 一般情况下,执行哪个方法由请求参数“op”的值来决定。 如果 op 参数没有值,则使用默认值“execute”。 如果方法的@RequestMapping 指定了完整的 url,则直接匹配对应的方法。 前面两种添加了@RequestMapping 注解的方法均为 url 对应的入口函数,后面描述时将它 们称为“Action 方法”。 未加@RequestMapping 注解的方法称为普通方法。 如果在普通方法上添加了@ModelAttribute 注解,则表示该方法将参与提供信息给视图, 会在 Action 方法被调用前执行。 如何声明 Action 方法 2010 年 4 月 30 日 20:41 见 spring 的官方参考文档 http://static.springsource.org/spring/docs/current/spring-framework- reference/html/mvc.html#mvc-ann-requestmapping-arguments Action 方法对应哪个 jsp 2010 年 4 月 23 日 19:15 根据方法的返回值决定。 1. 返回 void 根据当前请求的 url 决定, 比如 url 为/system/user/query.html, 则 jsp 为/WEB-INF/view/system/user/query.jsp (如果方法参数中包含 response 类型的话,则框架认为方法自己处理输出,不再 forward 到 jsp) 2. 返回 String /WEB-INF/jsp 加上返回的 String 比如返回值为/system/user/query.jsp, 则 jsp 为/WEB-INF/view/system/user/query.jsp。 返回值中的.jsp 后缀可省略,省略时使用默认值“.jsp”。 如果 jsp 所在的目录符合约定,但文件名不同,可仅返回文件名(同样可以省 略.jsp)。 3. 返回 View 对象 前面第 1、2 点的返回值最终都会在底层框架中转化为一个 View 对象 (pub.spring.MultiModelJstlView)。 如果有特殊的需要也可直接返回自己构造的 View 对象。 4. 返回 ModelAndView 对象 ModelAndView 同时包含 Model 跟 View 两种对象。本质上与第 3 点相同。 如何获取请求参数 2010 年 4 月 23 日 19:15 1. 少量的简单的参数可直接声明为方法参数。 比如请求的 url 为/test.html?id=123&name=hello, 要取得 id 和 name,可以这样声明方法: public void execute(Integer id, String name) {…} 如果希望方法的参数名和请求参数不同,可以加上@RequestParam 注解,比如请求参 数名为 pn,但希望方法的参数名为 pageNo,则可以这样定义: public void test(@RequestParam("pn") Integer pageNo) {…} 默认情况下,如果方法参数对应的请求参数不存在的话会报错,可以通过设置 @RequestParam 注解的 required 值来设置为非必要参数,还可以设置默认值。这些高 级用法在一般情况下并不常用到。 2. 多个或复杂的参数应使用实体类或定义对应的 Data 类,然后以该类型声明方法参 数。 参数和类数据的绑定方式和 ecom 中的 ReqFuncs.populate 方法类似,只是不需要显式 地调用该方法,而是直接声明为方法参数。如果请求参数是由用户填写的,可能会出 现数据类型不匹配等异常情况,默认情况下会报错。如果希望处理或忽略绑定错误, 可以在该方法参数后加一个 Errors 参数。 如何返回信息给视图 2010 年 4 月 23 日 19:16 视图大部分情况下即为 jsp 页面;信息即 request 中的 attribute。 可以使用如下途径(不是互斥的)来返回信息。  使用方法返回值来返回信息 单个对象一般直接作为 Action 方法的返回值。对象名由可由对象类型自动推断,即 首字母小写后的类名(不包含包路径);如果对象是数组或集合(如 List),则对象 名由元素类型推断出来,然后加上“List”后缀。可以通过在方法上添加 @ModelAttribute 注解来显式给出对象名。 当未添加@ModelAttribute 注解时,返回值为下列类型时有不同的行为: 返回 String:作为视图名 返回 Model 或 Map:其中的项将被合并到 request 的 attributes 中。  使用方法参数来返回信息 如果方法参数不是基础类型(字符串、数值、日期等)也不是与 http 相关的类 (request,response,session 等),则也会被框架自动添加为到返回信息中,对象 名同样可以自动推断,也可以通过在参数上添加@ModelAttribute 注解来显式指定。 当参数未添加@ModelAttribute 注解时,参数为下列类型时有不同的行为: Model 或 Map:其中的项将被合并到 request 的 attributes 中。 如何输出 json 内容 2010 年 4 月 23 日 19:16 1. 在 Action 上指定请求后缀: @Controller(".json") 或在 Action 方法的@RequestMapping 注解中添加显式的以.json 为后缀的 url。 2. 让 Action 方法中处理并返回信息 3. 框架自动将返回信息转化为 json 输出。 默认情况下输出的 json 对象是一个 map,包含各个返回对象(即使只有一个)。但如 果返回信息中包含一个名为 direct_result 的值,则该值将直接作为结果的 json 对象输 出。 如何实现重定向 2010 年 4 月 30 日 21:41 让 Action 方法返回 String,返回值设为如下形式: "redirect:/some/path/action.html" (如果当前页面的路径也为/some/path/的话,可直接写 redirect:action.html) 也可返回 View 类型,返回值为如下形式: new RedirectView(url); 如果 url 不带 contextPath 的话,还要加上第二个参数 true。 如何在多次请求中保持状态 2010 年 4 月 23 日 20:09 虽然通过 session 来在多次请求中共享数据是最简单的,但这种做法有天生的缺陷,即多 个 tab 页操作时会造成数据干扰。另外 session 中的数据如果没有显式清理的话,只能等 到 session 超时才会释放,造成不必要的服务器资源占用,减少了系统的可延展性 (salability)。 一般只有会话的全局信息(比如登录后的用户信息)才应直接使用 session 数据;一般的 业务实现上则建议使用请求参数(request parameter)来传递状态。 通过配合客户端脚本建立一个机制可以一定程度上解决干扰和清理的问题,这就是 ecom 中的 PageData 机制,scm 框架也支持这种做法,且与通过与框架集成,相对更加易用(但 可能更不易理解),在“如何使用 PageData”一节中专门说明。 除了自己实现单个参数传递外,scm 也支持一种称为 XData 的整体对象传递机制。大致来 说,框架会将对象序列化压缩后放在隐藏域中,通过 form post 传递;然后在目标 action 中,框架会自动反序列化并放到 model 中。具体用法是在要共享对象的 Action 类上使用 @SessionAttributes 注解,指定要传递的对象名。 如何使用 PageData 2010 年 5 月 1 日 0:30 PageData 适合用在类似 ecom 下单界面那样的业务场景,即同一页面在操作过程中会产生 多次请求,请求间需要共享数据。 XData 通常只适用于在多页面间保持状态;如果多页面间的数据量较大,XData 效率会比 较低,此时也可考虑使用 PageData 机制。 PageData 类似于 XData 的用法,即在需要共享数据的 Action 上添加注解,假设数据对象名 为 someData,则注解为: @PageData("someData") 在 jsp 中,与这些 Action 对应的 url 要记得传递 pageKey 参数, 如${home}/some/path/action.html?pageKey=${pageKey}。 也可使用标签来输出 url: 1. 声明标签库 <%@ taglib prefix="s" uri="app://pub.spring" %> 2. 输出 url 如何校验参数 2010 年 4 月 23 日 20:09 参数是指 request 提交上来的参数是否合法(参考“如何获取请求参数”一节)。合法性 这里是指数据类型是否匹配,对于业务性的校验在后面一节中描述。 简单类型(如 id)通常是由程序自己生成和传递的,故不作处理,数据类型不符则让它直 接抛出异常。 需要校验的是由用户填写的复杂类型(如实体和 Data 类)。 这种类型的数据可在 Action 的方法中声明为参数,框架会自动提取请求参数并填充,为处 理异常情况,可在该参数后面加上一个类型为 Errors 的参数,绑定中类型不符的信息会自 动包含在该对象中。 当发现 Errors 参数包含异常信息时,应重新显示填写页面,并输出有异常的字段的提示信 息(通过标签来输出校验失败的字段的提示信息。 可使用这样的形式来集中输出所有失败的字段提示信息。 如何使用 forms 标签 2010 年 4 月 30 日 20:52 基本用法见 spring 的官方参考文档: http://static.springsource.org/spring/docs/current/spring-framework- reference/html/view.html#view-jsp-formtaglib 实际上 scm 框架中使用的是 spring form 标签库的扩展,声明方式为 <%@ taglib prefix="form" uri="app://pub.form" %> 加上了如下功能:  简化 select 标签 1. 支持空项 空项是指"--请选择--","--不限--"这样的选项。 原来需要这样做: 现在只需 2. itemLabel 和 itemValue 默认为 id 和 text,故上述语句还可简化为:  简化 radioButtons 标签 用法和上面的 select 标签基本相同。  支持 input 标签格式化 1.1 支持 Date 的格式化,原来如果需要格式化日期,甚至不能使用 form 标签,而需 要这样做: 现在可以: 1.2 支持数值格式化 原来同样不能直接使用 form 标签,现在可以: 原来浮点数在输出后默认会加上.0,现在即使不指定 format,也不会有此现象。 另外为了支持 XData 和服务端客户端通用校验功能,必须使用这套扩展标签库。 如何实现返回功能 2010 年 4 月 23 日 20:13 在 jsp 中包含 site.js,然后调用 returnUrl 函数,提供来源页面的 url(不需要包含查询参 数)即可。返回的来源页面会自动恢复查询参数,故可以保持该页面离开时的状态(如翻 到第几页,查询条件等)。 此机制要求来源页面的状态是由查询参数来保持的(使用 get 方式进行 form 提交)。 如何显示操作结果 2010 年 5 月 1 日 14:03 让 Action 方法返回 View,返回值通过 ActionResult 工具类来创建。 比如操作成功时可以这样调用: return ActionResult.ok("保存成功", "/some/path/query.html"); 第二个参数是返回页面的 url,不要带 home,不需要带查询参数,如果与当前页面路径相 同的话也可不带路径。 失败时调用: return ActionResult.fail("保存失败", "/some/path/query.html"); 异常时调用: … catch (Exception e) { return ActionResult.error(e); } 验证失败时调用: return ActionResult.formView(); 如果用户希望操作完毕后直接返回特定页面,而不要显示操作成功的提示,可以这样: 如果返回页面就是执行操作时所在的页面(即相当于刷新),Action 方法返回 ActionResult.ok()即可; 如果是其它页面(比如从 show.html 返回 query.html),则可以在 form 中增加一个 隐藏域,命名为 returnUrl,值为要返回的页面的 url(不需要包含查询参数,框架会 自动加上;如果与当前页面路径相同的话也可不包含路径)。 Action 方法返回 ActionResult.ok()即可。 如何实现翻页 2010 年 4 月 23 日 20:13 在 jsp 中添加如下代码: 要求 request 中有 queryResult 属性。 如何实现重置功能 2010 年 4 月 23 日 20:13 这里的重置实际上是清空的意义。 对于查询页面来说,要清空查询条件,使用 html 内置的 reset 机制()是不够的,因为在查询后页面控件初始值已经变为查询条件中的值。 可以包含 site.js,调用其中的_reset 函数,如: 如果 form 中各个域的值和页面加载时的初始值有不同,则_reset()执行标准的 reset 功能; 如果没有不同,则执行清空功能。 如何实现关联下拉框 2010 年 4 月 23 日 20:14 和 ecom 一样,使用 jquery.chainselect.js。 示例用法见/test/t2.html 如何上传文件 2010 年 4 月 23 日 20:07 1. jsp form 加上属性: encType="multipart/form-data"; 加上文件域: 2. Action Action 方法中加上要接收的文件参数: @RequestParam MultipartFile file 即可使用该参数来获取相关信息,如: getBytes:文件内容, getOriginalFilename:原始文件名。 注意参数名与 jsp 中的 name 对应; 如不对应,也可通过给@RequestParam 注解加上参数来显式指定。 如何导出 EXCEL 2010 年 4 月 23 日 20:08 导出 EXCEL 一般是伴随着一个查询页面 QueryAction,故这里只针对这种情况进行说明。 假设查询页面的 url 为/some/path/query.html。 原来的 Action 方法为: public QueryResult execute(QueryData queryData, Integer page) {…} 要支持导出,理论上该方法不用修改,但由于查询通常带有分布,而导出则希望得到全部 记录,故还是要区分两种情况。可以加上 format 参数,判断其值是否为 xls,是的话再作 相应处理,如: public QueryResult execute(QueryData queryData, Integer page, String format) {…} url 要加上 format 参数,即/some/path/query.html?format=xls 然后在/WEB-INF/view/some/path 目录下建立模板文件 query.xls,模板使用类似 jsp 的语 法,如 ID NAME REMARK ${row[0]} ${row[1]} ${row[3]} 具体可参考 jXLS 网站上的相关说明文档 http://jxls.sourceforge.net/ 如何导入 EXCEL 2010 年 5 月 4 日 23:21 使用 pub.utils.ExcelUtils#parse 方法,传入一个 InputStream 对象,返回一个 List 对象。 spring mvc 与 struts 的对比 2010 年 4 月 30 日 20:04  代码结构 1. 重复 struts 要做一个简单的页面(/some/path/show.do),需要这样做:  包路径和类名 package ecom.web.some.path.action; class ShowAction ...  在 Action 上指定 url @Controller("/some/path/show") 3. 在 struts-config.xml 中指定 url
还剩13页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

615994564

贡献于2011-03-16

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf