-
数据的验证,应该放在action层还是service层? 5
对于页面提交数据的验证,应该放在action层还是service层?
这两个层各自的具体职责是什么?
问题补充:我现在是加了一个验证类,action将接收的多个参数,传给service,service调用验证类中的验证方法对这些参数进行验证。如果有一个数据验证不通过,就向上(service层)抛出一个uncheck exception,且此exception的message为详细的报错信息(如用户名不能为空),service层将不处理该异常,继续抛至action层,action捕获抛出的uncheck exception,并将该exception的message当作错误信息传给页面,请问这么做有没有不妥,或有没有更好的(标准)方法?谢谢!2013年4月18日 17:50
8个答案 按时间排序 按投票排序
-
1、action层即作为控制器,它做的事情就是,拿到用户的参数,判断调用什么业务逻辑方法,然后把业务逻辑方法的返回值再传递给用户,你就可以把他当作一个快递分检站
service就里就做具体的业务逻辑判断,dao里面就写直接跟数据库打交道的东西。
2、action层负责选择不同的展示UI,为了保证系统能够在不同的UI界面做移植,action不要涉及业务逻辑。2013年4月18日 17:51
-
页面第一层验证,进入action之前第二层验证但不是写action的方法里,struts2有支持这样的验证方式validation,这种方式实现了方法与验证的分离
2013年5月03日 09:13
-
我不是来回答的,是来讨论的。
以前我都是放在action里做的。具体如下
- 浏览器提交前需要Javascript先校验下。一是本地速度快;二是用户体验好——都填好了也提交了等了好久服务器却说:错!重填!这个容易涨怒气。
- 简单验证action层同样做一遍,因为总会有“聪明人”会绕过浏览器的检查的。这里的问题是如何保持和前端Javascript的一致性,且不写重复代码?
- 业务逻辑验证,具体逻辑写在service层,组合调用在action层。
处理上,和楼主补充内容基本一致。- 从dao层就向上抛
- service层可能要做些处理。比如回滚,通知管理员等等根据具体业务。但基本上不会完全吃掉,继续上抛。
- action统一拦截。会简单区分下,比如业务错误,直接报信息;致命错误,直接转向去系统异常等。
但是,现在我有些疑问。
随着HTML5越来越牛叉,服务器端渐渐变成只有service(还没有完全)层了。比如开放个rest接口供浏览器,手机,平板及其他客户端调用。
如果考虑今后的这些扩展,似乎所有验证都扔action里面比较不妥。至少要能够简单解耦出来才可以...
当然早早考虑太多,走向过度设计的歧路也不好...
所以,你怎么看?元芳2013年4月19日 10:30
-
引用我现在是加了一个验证类,action将接收的多个参数,传给service,service调用验证类中的验证方法对这些参数进行验证。如果有一个数据验证不通过,就向上(service层)抛出一个uncheck exception,且此exception的message为详细的报错信息(如用户名不能为空),service层将不处理该异常,继续抛至action层,action捕获抛出的uncheck exception,并将该exception的message当作错误信息传给页面,请问这么做有没有不妥,或有没有更好的(标准)方法?谢谢!
你这样做相当于把本来action(控制器)的工作转嫁给了service,这样就导致service层还要负责控制跳转的工作。
应该在action中调用验证类中的验证方法对参数进行验证。
如果有一个数据验证不通过,就把详细的报错信息(如用户名不能为空)当作错误信息,然后跳转到错误页面提示错误信息。
如果全部验证通过,就调用合适的service进行后续的处理,然后再跳转到操作成功的页面。
这正是action的典型应用场景。这样service只做业务逻辑的处理,控制跳转由action去做。
而且你那样做,在service层自定义一个异常抛出去,在action中又捕获过来,然后提取异常中的报错信息,不是更加大了工作量吗,多做了无用功。在action中调用校验逻辑,只要根据校验结果就可以知道该怎么处理了(是跳转到错误页面还是继续后续处理)。2013年4月19日 10:00
-
(1)这个要一分为二的看待. 如果是null之类的判断, 可以放在action. 如果是涉及到业务逻辑(比如不变性约束), 都需要放在Servcie层.
(2)按照MVC模式看, Action层也只是接收http请求, 不涉及到更多的职责. 所以在非常复杂的大型项目中, 分三层: Action->AO->Servcie. 此时可以把一些验证工作放在AO层(当然AO还有其他职责). Action层本身只做接收请求, 然后委派给AO.2013年4月18日 23:49
-
通用点的方法是在action和service中间加一层数据的验证,这样可以更好的降低耦合性;
但项目中大多时候是数据和业务的耦合性比较强,所以会在使用到数据的时候在进行验证,例如我们要把页面上传的文件内容入库,如果我们先读一遍+验证,然后再读一遍+存库,这样重复的IO操作会很吃程序的效率(当然这只是举个例子)
推荐的做法是在action和service中间加一层数据的在加工方法,将action收集到的数据进行验证+2次处理,然后传递给service2013年4月18日 22:54
-
此处假设使用三层架构,struts2
那么此时action本质作为命令/处理器(DispatcherServlet才是真正的控制器 因为分派 和 页面选择都是它做的),
如果有service,action里边还是应该只做简单的收集数据,然后转发数据到service进行处理,根据相应的返回值(返回值/异常[如果出错了])选择下一个逻辑视图(result)。
而且web层 功能越少越好, 即非常薄,why? 比如明天我要提供webservice 那么如相同逻辑还有重复一遍。
也就是说,action 按照纯粹的话 应该只做收集数据 转发给service。
如果验证逻辑非常复杂, service层之上可以再加个验证层 进行数据验证2013年4月18日 18:21
-
Action作为控制器,根据用户请求选择合适的业务逻辑进行处理,然后根据处理结果返回合适的视图展示给用户。
比如Action收到用户登录请求,- 如果校验失败则返回给用户一个提示用户名不能为空或过短的页面,
- 如果校验成功但是用户名密码不匹配,则返回一个提示用户名或密码错误的页面,
- 如果用户名密码匹配成功则返回登录成功的页面。
简单的校验可以放在Action里面,因为Action里本就没有很多东西。
如果校验比较多最好是放到service层,但是不要跟其他业务逻辑杂糅在一起,那样就乱了,放到单独的service类中(专做校验)。2013年4月18日 18:07
相关推荐
org.tarena.dang.service :业务层 org.tarena.dang.dao :数据访问层 org.tarena.dang.entity :实体类 org.tarena.dang.util :工具类 org.tarena.dang.interceptor :拦截器 3)struts配置文件结构 web....
• Customers of the service should be able to create pages to meet their specific needs. • The page designer isn't able to have direct involvement in page development. • ...
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...
由《Ext JS源码分析与开发实例宝典》作者:彭仁夔团队开发而成 90%以上代码可以生成验证、生成三层代码、生成完善的权限系统、生成数据库等功能 ... 把模板化的项目放到Mgicode市场获得一些外快。
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 71、说出一些常用的类,包,接口,请各举5个 72、java中有几种...
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中...
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 52 71、说出一些常用的类,包,接口,请各举5个 54 72、java中有...
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...
70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...
如果还是不行的话,通过 adb kill-server 重新启动 adb 然后从头再来一次试试。 断开无线连接 命令: adb disconnect 无线连接(无需借助 USB 线) 注:需要 root 权限。 上一节「无线连接(需要借助 USB 线)...
3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView的交互 3.14 控制不同的文字字体——Typeface对象使用 ...
3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView的交互 3.14 控制不同的文字字体——Typeface对象使用 ...
3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView的交互 3.14 控制不同的文字字体——Typeface对象使用 ...
20.7节经由BrowserManager深度-链接到数据 20.8节经由BrowserManager深度-链接容器 20.9节实现自定义历史记录管理器 第二十一章.开发策略(646) 21.1节.使用Flex组件工具包创建组件 21.2节.在Flash中使用...
第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会; 第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高。不要害怕和逃避,毕竟我们...