相关文章推荐
宽容的苦咖啡  ·  LayUI switch 开关监听 ...·  7 月前    · 
从容的碗  ·  Dev ...·  8 月前    · 
聪明的啤酒  ·  Dataframe.to_csv(sep=" ...·  1 年前    · 

简单地记录一下常用的BaseController中的方法

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) {
        // Date 类型转换
        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...