SSM之SSM應(yīng)用實(shí)例

一 日志功能,實(shí)現(xiàn)將用戶操作日志保存到數(shù)據(jù)庫
1.準(zhǔn)備工作

新建ssm項(xiàng)目,添加依賴,在spring-mvc.xml添加aop相關(guān)配置

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.1.1.RELEASE</version>
</dependency>
<!-- 啟用 aspectj 方式 AOP-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
2.實(shí)現(xiàn)

2.1 自定義注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
    /**
     * 操作事件
     */
    String value();
}

2.2 日志類

public class UserLog {
   //日志id
    private Integer id;
   //用戶id
    private Integer userId;
    //用戶ip
    private String ip;
   //操作時(shí)間
    private Date createdTime;
   //請(qǐng)求方法
    private String method;
   //請(qǐng)求url
    private String requestUrl;
   //返回結(jié)果
    private String result;
  
  //get和set方法
  ...
}

數(shù)據(jù)庫字段和實(shí)體類對(duì)應(yīng)即可
2.3 數(shù)據(jù)庫mapper

public interface UserLogMapper {
    int deleteByPrimaryKey(Integer logId);

    int insert(UserLog userLog);

    UserLog selectByPrimaryKey(Integer logId);

    List<UserLog> selectAll();

    int updateByPrimaryKey(UserLog record);

    /**
     * 查詢某一個(gè)時(shí)間段的數(shù)據(jù)
     * @param start  開始的時(shí)間
     * @param stop   結(jié)束的時(shí)間
     * */
    List<UserLog> selectUserByPeriod(@Param("start") String start, @Param("stop") String stop);
}

2.5 service

@Aspect
@Component
public class LogServiceImpl implements LogService {
/*
     * 獲取入?yún)⒑统鰠?     * @param joinPoint
     * @param o
     * @return
     * */
    @Override
    public void getByJoinPoint(JoinPoint joinPoint, Object o) throws ClassNotFoundException {
        StringBuffer operateEvent = new StringBuffer();
        String targetName = joinPoint.getTarget().getClass().getName(); // 請(qǐng)求類名稱
        String methodName = joinPoint.getSignature().getName(); // 請(qǐng)求方法
        Object[] arguments = joinPoint.getArgs();  //獲取入?yún)?        UserLog userLog = new log();
        User loginUser = (User) session.getAttribute("loginUser");
        log.setUserId(loginUser.getId());
       //getHos()是獲取客戶端ip的方法
        log.setLogIp(getHost(request));
        log.setLogReqUrl(request.getRequestURI());
        log.setLogMethod(joinPoint.getSignature().getDeclaringTypeName() + "," + joinPoint.getSignature().getName());
        // 從o中讀取提取返回結(jié)果  
        //String result = 
         log.setLogResult(result);
        //保存到數(shù)據(jù)庫
        int insert = mapper.insert(log);

2.4 LogAspect.java:日志切面

@Aspect
@Component
@Order(3)
public class LogAspect {

    // 注入Service用于把日志保存數(shù)據(jù)庫
    @Autowired
    private LogService logService;

    // 切點(diǎn)
  //@annotation用于匹配當(dāng)前執(zhí)行方法持有指定注解的方法;
    @Pointcut("@annotation(com.cateringsystem.service.web.log.Log)") 
    public void logAspect() {
    }
 
    @Around("logAspect()")
    public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = joinPoint.proceed();
        logService.getByJoinPoint(joinPoint, result);
        return result;
    }
}

2.5 在需要生成日志的Controller上加上@Log注解,當(dāng)然在service層加注解也可以

@RestController
public class UserController {

   @Log(value = "  ")
   @RequestMapping(value = "/getUser", method = RequestMethod.GET)
   public String getUser(Model model,String parameter1,Integer parameter2) {
       ...
   }
}
3.測試

運(yùn)行項(xiàng)目,請(qǐng)求getUser這個(gè)方法,數(shù)據(jù)庫就多了一條記錄.
參考https://my.oschina.net/u/3136014/blog/904643#comments

二 文件上傳下載
1 上傳文件
     /**
     * form 表單上傳圖片/文件的方法
     *
     * @param savePath      獲取圖片/文件保存路徑
     * @param multipartFile 文件上傳對(duì)象
     */
    public static String setMultipartFile(String savePath, MultipartFile multipartFile) throws IOException {
        // 獲取文件對(duì)象
        File file = new File(savePath);
        // 獲取路徑
        String basePath = file.getPath();
        // 重命名后的文件
        String relativePath = getMakeRelativePath(multipartFile.getOriginalFilename());
        // 創(chuàng)建一個(gè)文件
        File target = new File(basePath.concat(relativePath));
        target.getParentFile();
        // 轉(zhuǎn)移圖片數(shù)據(jù)
        multipartFile.transferTo(target);
        String fileName = target.getName();
        return fileName;
    }
  • controller接口可參照下文的wangEditor實(shí)現(xiàn)富文本編輯的controller接口
2 下載文件
    @RequestMapping(value = "/pic/{id}", method = RequestMethod.GET)
    public Result getPic(@PathVariable("id") Integer id, HttpServletResponse response) throws Exception {
       //根據(jù)id獲取圖片名
        Test test = deviceService.getById(id);
        String fileName = test .getPic;
      //從本地獲取圖片损肛,實(shí)際開發(fā)中需要從服務(wù)器獲取
        File file = new File(“f:/test/”.concat(fileName));
       long fileSize = file.length();
        // 重置response
        response.reset();
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/octet-stream");
        response.addHeader("Content-Disposition", "attachment;filename=" + new String(file.getName().getBytes(), "GBK"));
        response.addHeader("Content-Length", String.valueOf(fileSize));

        // 讀取并以流的方式輸出
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buffer = new byte[1024];
        int length = 0;
        while ((length = (bis.read(buffer))) != -1) {
            bos.write(buffer, 0, length);
        }

        bos.flush();
        bos.close();
        bis.close();

        return null;
    }
三 wangEditor實(shí)現(xiàn)富文本編輯

官方文檔
這個(gè)富文本編輯器使用中最需要注意的是上傳圖片功能悠咱。服務(wù)器配置如下:

1 返回類

官方文檔給出了這樣的說明:https://www.kancloud.cn/wangfupeng/wangeditor3/335782
首先我們需要定義一個(gè)返回類,返回類必須是下面的格式贾虽。

@Data
public class ImgResult<T> {

    /**
     * 錯(cuò)誤碼
     */
    private int errno;

    /**
     *  data 是一個(gè)數(shù)組逃糟,返回若干圖片的線上地址
     */
    private String[] data;
}
2 controller接口寫法
    @RequestMapping(value = "/uploads", method = RequestMethod.POST)
    public ImgResult upload(@RequestParam(value = "files", required = false) MultipartFile[] files) throws IOException {
        ImgResult result = new ImgResult();
      // form 表單上傳多張圖片/文件的方法
        List<String> picPath = Upload.setMultipartFiles("F:/test/", files);
        int index = 0;
        String[] url = new String[picPath.size()];
        for (String s : picPath) {
            url[index++] = s;
        }
        result.setData(url);
        return result;
    }
四 quartz定時(shí)任務(wù)
quartz定時(shí)任務(wù)基礎(chǔ)知識(shí)可查看https://blog.csdn.net/noaman_wgs/article/details/80984873

定時(shí)任務(wù)相關(guān)內(nèi)容網(wǎng)上資料很多,不再多做說明蓬豁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绰咽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子地粪,更是在濱河造成了極大的恐慌取募,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟆技,死亡現(xiàn)場離奇詭異玩敏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)付魔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門聊品,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人几苍,你說我怎么就攤上這事翻屈。” “怎么了妻坝?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵伸眶,是天一觀的道長。 經(jīng)常有香客問我刽宪,道長厘贼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任圣拄,我火速辦了婚禮嘴秸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己岳掐,他們只是感情好凭疮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著串述,像睡著了一般执解。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纲酗,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天衰腌,我揣著相機(jī)與錄音,去河邊找鬼觅赊。 笑死右蕊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茉兰。 我是一名探鬼主播尤泽,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼规脸!你這毒婦竟也來了坯约?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤莫鸭,失蹤者是張志新(化名)和其女友劉穎闹丐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體被因,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卿拴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梨与。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堕花。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粥鞋,靈堂內(nèi)的尸體忽然破棺而出缘挽,到底是詐尸還是另有隱情,我是刑警寧澤呻粹,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布壕曼,位于F島的核電站,受9級(jí)特大地震影響等浊,放射性物質(zhì)發(fā)生泄漏腮郊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一筹燕、第九天 我趴在偏房一處隱蔽的房頂上張望轧飞。 院中可真熱鬧衅鹿,春花似錦、人聲如沸过咬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽援奢。三九已至,卻和暖如春忍捡,著一層夾襖步出監(jiān)牢的瞬間集漾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工砸脊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留具篇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓凌埂,卻偏偏與公主長得像驱显,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞳抓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • JSPXCMS開發(fā)架構(gòu)介紹 V1 – 架構(gòu)概述 基本概述 配置文件目錄 /src/main/resources/...
    Java_Evan閱讀 4,389評(píng)論 0 0
  • 一點(diǎn)知識(shí) 在JAVA開發(fā)領(lǐng)域埃疫,目前可以通過以下幾種方式進(jìn)行定時(shí)任務(wù): Timer:jdk中自帶的一個(gè)定時(shí)調(diào)度類,可...
    雅倩蘭爸爸閱讀 3,841評(píng)論 1 28
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,679評(píng)論 0 3
  • 作為一個(gè)不擅長社交的人來說孩哑,或許就這個(gè)標(biāo)題而言栓霜,我沒有太多的發(fā)言權(quán),但我要談的是我觀察到的一些現(xiàn)象横蜒。 今天在一個(gè)女...
    好好生活的琳琳發(fā)閱讀 232評(píng)論 0 1