import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import javax.servlet.http.HttpServletResponse;
import java.beans.PropertyEditorSupport;
import java.io.PrintWriter;
import java.util.Date;
* @ClassName: BaseController
* @Description: 基本 Controller
* @author: tomy
* @Date: 2021/4/12 18:01
@Slf4j
public abstract class BaseController {
* 将前台传递过来的日期格式的字符串,自动转化为Date类型
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
setValue(DateUtils.parseDate(text));
});
* 使用response输出JSON
* @param response response
* @param str 响应对应
protected void out(HttpServletResponse response, Object str) {
PrintWriter out = null;
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
out = response.getWriter();
out.print(str);
} catch (Exception e) {
log.error("输出JSON出错", e.getMessage());
} finally {
if (out != null) {
out.flush();
out.close();
* 判断参数 是否存在
* @param responseBean responseBean
* @param jsonParam 需要判断的原始参数
* @param params 需要判断的key
* @return
protected boolean getParams(ResponseBean responseBean, JSONObject jsonParam, String[] params) {
boolean flag = false;
for (String param : params) {
if (jsonParam.containsKey(param)) {
if (StringUtils.isNotBlank(String.valueOf(jsonParam.get(param)))) {
flag = true;
} else {
flag = false;
break;
} else {
flag = false;
break;
if (!flag) {
responseBean.setSuccess(false);
responseBean.setErrCode("40003");
responseBean.setErrMsg("缺少参数&参数不能为空");
return flag;
* 获取ModelAndView
public ModelAndView getModelAndView(){
return new ModelAndView();
* 获取request对象
public HttpServletRequest getRequest() {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
return request;
* 获取项目在服务器中的文件位置
public String getWebRoot(){
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
return request.getServletContext().getRealPath("/").replace("\\", "/");
* 获取32位的uuid
* @return
public String get32UUID(){
return UuidUtil.get32UUID();
* 获取客户端Ip
* @return ip
public String getClientIp(){
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
return request.getHeader("x-forwarded-for");
* 判断请求来源
* @return 结果
public String getTerminal(){
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
String terminal = request.getHeader("User-Agent");
if(terminal.contains("Windows NT")){
terminal = "pc";
}else{
terminal = "mobile";
return terminal;
- 关于ResponseBean封装类,功能是返回的JSON数据结构标准。
引入所需的maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<!-- jackson json 优化缓存对象序列化 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.experimental.Accessors;
import java.io.Serializable;
* @ClassName: ResponseBean.java
* @Description: 返回的JSON数据结构标准
* @author: tomy
* @Date: 2021/4/09 14:29
@Data
@Accessors(chain = true)
public class ResponseBean implements Serializable {
private boolean success = false;
private Object data;
private String msg;
private String errCode;
private String errMsg;
@JsonIgnore
private boolean dataFormat = false;
@SneakyThrows
@Override
public String toString() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
ResponseBeanVo responseBeanVo = new ResponseBeanVo()
.setSuccess(this.isSuccess()).setData(this.getData()).setMsg(this.getMsg())
.setErrCode(this.getErrCode()).setErrMsg(this.getErrMsg());
if (this.isDataFormat()) {
return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(responseBeanVo);
} else {
return objectMapper.writer().writeValueAsString(responseBeanVo);
@Data
@Accessors(chain = true)
class ResponseBeanVo implements Serializable {
private boolean success;
private Object data;
private String msg;
private String errCode;
private String errMsg;
可以声明一个自定义控制器BaseController继承Controller重写Controller中的OnActionExecuting虚方法,然后其他控制器继承BaseController就可以,避免了给每个控制器打个过滤标签去验证public class BaseController : Controller
public UserInfo Lo...
update 参数多为 自定义 的 model
delete 参数多为 id
因此我们需要考虑在 BaseController 中将 JSONObject 转换为 常用的 Map,以更方便的操作。
每个请求都有它所归属的会话 ,se
1、创建BaseController并继承Controller,在BaseController实现所需要调用公共方法。
我这里需要实现动态加载模板页中数据,所以获取母版页数据的方法在Base中进行实现。
public abstract class BaseController : Controller
//进行依赖注入
pri...
摘自:http://blog.csdn.net/yanghua_kobe/article/details/9555575
建立iOS项目时候,首先创建一个super class,以供其他viewController去继承。以实现主题功能为例:
BaseController里定义这个方法
- (void)configUIAppearance{
NSLog(@"base config u
上一次写了一篇通用mapper的BaseService,上次的BaseService就是为了当前的Controller做铺垫。
这次的通用Controller是解决重复的劳动而改写的,只要继承该Controller,可以完成单表复杂查询,分页查询,添加,修改,批量修改,删除,批量删除等功能,您只需要把前端接口写好就行了,剩下的单表操作请求就交给BaseController了,废话不多...
大家写controller的时候是不是都需要返回一个结果给前端呢,成功与否,成功后提示的消息,后端出错响应给前端的消息 或者是说 所携带的数据等等,这里咱们可以找到一个共同点,就是都需要这么一个返回值,对于这些返回值为了更好和前端对接,也让咱们的代码可读性更强一点,一般我们都会写一个公共的返回类,用于规范返回结果,下面是通用的返回结果类:
import lombok.Data;
* @author: shenwang
* Date: 2021/5/24
@Data...
common\components\controller\BaseController
backend\controller\BaseController
frontend\controller\BaseController
api\controller\BaseController
每个子系统在控制器和Yii原本的Controller中增加了一到两层类,目的是定义一些公共的变量和方法
common\components\controllerBaseControl
前后端分离开发的时代,如何做好前后端的数据交互呢?我在有的工程中看过这样的后端接口:直接将前端所需要的数据返回,不做任何包装。这么做会有什么问题呢?我们只能依据http code来响应后端的请求结果。无法跟前端约定业务code,来让前端在UI上做特定的展示。而http code本身是请求级别的code定义,只是一个泛的定义。比如登陆失败有很多种原因:账号不存在,密码错误,账号锁定等等。我们如果只用http code 401告诉前端登陆失败这显然用户交互非常不友好。
maven多模块之间的调用也是通过dependency的,和调用其他外部的依赖没区别。
1、如果没有父模块,是完全分离的多个模块,那么只能先编译好底层的模块(比如你说的service模块为一个jar),然后再引入到controller模块中去(就和引用一个第三方的jar一样)。
通常的做法是建立一个本地仓库,编写service的团队写好后mvn install到本地仓库去
编写controller...