2 l523115401 l523115401 于 2018.07.11 20:58 提问

关于代码编写规范的疑问,spring mvc 控制层一段代码被多次复制重用,如何设计优化

业务逻辑大概如下:
功能:用户留咨保存功能
视图层:留咨界面,用户填写信息
控制层:校验数据合法,并依据request从cookies中取出用户城市站、usertraceId等信息,根据request请求头判断设备类型。最终封装实体调用入库接口。
服务层:验重、保存数据。
问题:
控制层做入参校验理所当然,没有问题。现在问题来了,此控制器承载多方留咨请求,,绝大部分业留咨务都可以直接请求,变化来了,在另一种业务条件下,如领优惠券,产品提了需求,要求用户领券成功之后在再调用用户留咨接口。我初始想在领券控制器中判断,成功后直接调用用户留咨控制器,避免一系列参数校验逻辑再写一遍,也不用再重写从request里面获取cookies等方法。但是考虑到mvc的设计,不应该控制层调取控制层(redirect除外)但是不调用,着一系列的逻辑我又要重写一份。又想到把校验逻辑和取cookies和设备信息放到service层,但是需要操作request,request是控制层操作的,如果把request带到服务端,那样也破坏了编码规范,至少这个服务类方法的test ng你都很难跑。不能new一个request对象吧。
所以不知道如何设计才好?难道我还是要把校验等代码复制一份?求探讨指教

3个回答

bayuemu
bayuemu   2018.07.11 21:10
已采纳

验证的事情交给拦截器去做

xiao_nini
xiao_nini uuu
10 天之前 回复
qq_40959736
qq_40959736 验证的事情交给拦截器去做
10 天之前 回复
l523115401
l523115401 想到了,在这个业务里使用不太适合。这个领券控制器是有逻辑的,只有在特定渠道调用的领券才会留咨,拦截器把领券请求也加上是不是显的不太合理呢,毕竟大部分领券是不需要留咨的。当然这只是一种情况
10 天之前 回复
cangketie
cangketie 你好酷啊,都玩这个了
10 天之前 回复
l523115401
l523115401 我想过用拦截器,方法可行,可是拦截器处理这种逻辑感觉怪怪的
10 天之前 回复
javacaprain
javacaprain   2018.07.12 11:15

有几个办法:
1、如果Service层不想让request对象作为参数传入,可以在Controller层将request对象的参数放到ThreadLocal中,可以线程安全地传入Service层。
2、也可以采用创建工厂设计模式,动态地去获取对应的Service
3、也可以跳出MVC的范畴,往微服务靠一靠。比如说把现有的业务拆分成上下游两个服务,第一层服务是Controller,第二层服务是Service,两层服务间的调用。

qq_42214807
qq_42214807   2018.07.11 21:54

封装类 对其实例化或在放入配置文件中

l523115401
l523115401 封装类?不太明白,这是要从request取数据的,封装类里把数据写进去?
10 天之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
SpringMVC4.1之Controller层最佳实践
SpringMVC4.1之Controller层最佳实践原文写于 2014-09-28 https://github.com/kuitos/kuitos.github.io/issues/9前几天突发奇想想去看看spring现在到升级到什么版本了,有些啥New Features。结果发现了一个很人性化的新注解,刚好最近在构建客服系统新的接口层结构,然后重新研究了下spring mvc,一些成果跟大家
规范你的代码编写风格
笔者寄语:一份编写规范的代码会让人赏心悦目,养成良好的代码编写习惯是每一个程序员应该具备的基本素养!1、基本规则【规则1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。例如:标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。【规则1-2】标识符的长度应当符合“m...
Spring MVC学习历程<三>Spring MVC 控制层Controller
@Controller的几种配置1、通过URL对应Bean            class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">    如果配置HandlerAdapter则do可以不写控制层要实现Controller接口。以上配置,访问/hello.do就会寻找id为/hello.do的Bean
MVC引入SERVICE层 提高代码重用性 沟通CONTROL和MODEL
MVC是web开发中常见的程序结构。 简单的mvc结构如下: view层:显示层。  control层:业务层,集合了各种action。  model层:模型层,一般和数据打交道。简单的sample:一个表对应一个model类。 其中control层调用model层的方法,实现对数据的访问。  采用这样的结构在一定程度上,可以做到代码清晰,较容易扩展
springMVC中的controller层
MVC控制层的作用:接收客户端的请求,然后调用Service层业务逻辑,获取到数据,传递数据给视图层(客户端)用于视觉呈现。 实现步骤 1.在类上使用@Controller注解 作用: 告诉springmvc的dispatcherServlet这是一个Controller然后被dispatcherServlet的上下文所管理,并且完成它的依赖注入 2.在类上使用@Req
Spring--MVC--如何书写MVC的控制层Controller
MVC控制层的作用:调用业务逻辑产生合适的数据,传递数据给视图层用于视觉呈现1.在类上使用@Controller注解作用: 告诉springmvc的dispatcherServlet这是一个Controller然后被dispatcherServlet的上下文所管理,并且完成它的依赖注入2.在类上使用@RequestMapping注解例如:@RequestMapping(“/user”)作用: Con
service层重构的解决方案(三种解决…
1 service层重构的关键代码; package com.lrq.service.base; public interface ICommonService {     public void save(T t); } package com.lrq.service.base.impl; import com.ilrq.dao.DAO; import com.lrq.service.
spring mvc 控制层梳理
言归正传,研究一下注解下的控制层。 我习惯于使用JSTL展示页面,因此需要在原lib基础上增加jstl.jar和standard.jar,详细lib依赖如下: 引用 aopalliance-1.0.jar commons-logging-1.1.1.jar log4j-1.2.15.jar spring-beans-2.5.6.jar spring-context-2.5.6.j
MVC中三层规范写法示例
经常会在web项目中用到MVC模式的写法C:控制层Controller,负责对请求的url分发到不同的网址,处理请求的入口。 M:规范数据数据成Bean,并负责调用数据库 V:只负责从数据库获取数据,并显示。此三层的设计充分得将数据显示与数据操作很好的分离开了,是一种极佳的面向对象的设计思路。下面把常见的MVC模式的规范写法总结如下:model:public class Question {
spring mvc:控制层梳理
<br />言归正传,研究一下注解下的控制层。 <br />我习惯于使用JSTL展示页面,因此需要在原lib基础上增加jstl.jar和standard.jar,详细lib依赖如下:引用<br />aopalliance-1.0.jar <br />commons-logging-1.1.1.jar <br />log4j-1.2.15.jar <br />spring-beans-2.5.6.jar <br />spring-context-2.5.6.jar <br />spring-context-s