spring+springMVC+mybatis的整合 part6

登錄注冊

首先荸哟,我們webapp要實現(xiàn)用戶登錄,必須得能新建用戶蛔翅。所以先把注冊用戶放在前面敲茄。
預期功能:打開注冊頁面
填寫注冊信息
點擊注冊
顯示注冊后的提示信息

一個web注冊頁面
web頁面能進行基本的數(shù)據(jù)效驗
服務器能存儲用戶的注冊信息
注冊動作完成后,返回提示頁面山析。

一般在開發(fā)中堰燎,有了大概樣子的功能模塊,需要整理一下業(yè)務流程和程序執(zhí)行流程
大概的流程圖如下所示:
[圖片上傳失敗...(image-5d396d-1536456883937)]

上圖說明:
web頁面完成注冊信息的填寫后笋轨,需要在web頁面做一些基本的數(shù)據(jù)效驗秆剪。
注冊信息通過基本的驗證后,直接提交到服務器爵政,tomact → servelt → spring 仅讽。后端程序一切都被spring接管了,所以钾挟,需要在spring中完成這些功能洁灵。
spring和外界通信,我們都是在Controller中完成掺出。所以我們在Controller中處理數(shù)據(jù)徽千。
當數(shù)據(jù)通過了Controller中的校驗后,需要在Controller中來查找數(shù)據(jù)庫是否存在同樣的用戶名汤锨,通用的數(shù)據(jù)操作流程如:Controller → Service → Dao双抽。
Service是為我們的程序提供服務的,盡量每個Service對應一個Dao闲礼,只需要提供單一的數(shù)據(jù)驅(qū)動牍汹,在外層進行業(yè)務組裝,這樣就能達到目的柬泽,同樣也能將程序解耦慎菲,以后的維護也就相對簡單了。

在實際項目中主要是使用JSON數(shù)據(jù)聂抢,所以要寫一個返回json數(shù)據(jù)的實體
在domain包中新建一個ResponseObj類

public class ResponseObj <T>{
    public final static int OK = 1, FAILED = 0, EMPUTY = -1;
    public final static String OK_STR = "成功", FAILED_STR = "失敗", EMPUTY_STR = "數(shù)據(jù)為空";

    private int code; // 狀態(tài)碼,0成功;1空數(shù)據(jù);-1請求失敗
    private String msg;
    private Object data;
   省略code钧嘶,msg,data的set琳疏,get方法
}

要寫登錄注冊的接口有决,我們先創(chuàng)建一個mvc目錄闸拿,目錄下controller包
controller包中創(chuàng)建一個MainController的類。

@Controller
@RequestMapping("/mvc")
public class MainController {
    /**
     * 登陸頁面
     * @return
     */
    @GetMapping("/login")
    public String login(){
        return "login";
    }
}

在實際項目中主要是使用JSON數(shù)據(jù)书幕,所以不使用ModelAndView
JSON數(shù)據(jù)解析我用的是阿里巴巴的Fastjson

具體使用:http://www.reibang.com/p/3c45f4be2c90
MainController主要是用于跳轉(zhuǎn)到登錄頁面
我們在Controller目錄下創(chuàng)建一個UserController

@Controller
@RequestMapping("/userAction")
public class UserController {
    @Autowired
    private UserServiceImpl userService;    //自動載入Service對象
    private ResponseObj responseObj;    //返回json數(shù)據(jù)的實體

    /**
     * @param req   http請求
     * @param user  發(fā)起請求后新荤,spring接收到請求,然后封裝的bean數(shù)據(jù)
     * @throws Exception
     */
    @PostMapping("/reg")
    @ResponseBody
    public Object reg(HttpServletRequest request, User user, HttpSession session) throws Exception {
        JSONObject jsonObject=new JSONObject();
        responseObj = new ResponseObj<User>();
        if (null == user) {
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg("用戶信息不能為空台汇!");
            jsonObject= (JSONObject) JSON.toJSON(responseObj);
            return jsonObject;
        }
        if (StringUtils.isEmpty(user.getLoginId()) || StringUtils.isEmpty(user.getPwd())) {
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg("用戶名或密碼不能為空苛骨!");
            jsonObject= (JSONObject) JSON.toJSON(responseObj);
            return jsonObject;
        }
        if (null != userService.findUser(user)) {
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg("用戶已經(jīng)存在!");
            jsonObject= (JSONObject) JSON.toJSON(responseObj);
            return jsonObject;
        }
        try {
            userService.add(user);
        } catch (Exception e) {
            e.printStackTrace();
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg("其他錯誤苟呐!");
            jsonObject= (JSONObject) JSON.toJSON(responseObj);
            return jsonObject;
        }
        userService.updateLoginSession(request.getSession().getId(), user.getLoginId());
        responseObj.setCode(ResponseObj.OK);
        responseObj.setMsg("注冊成功");
        user.setPwd(session.getId());   //單獨設置密碼為sessionId 誤導黑客痒芝,前端訪問服務器的時候必須有這個信息才能操作
        user.setNextUrl(request.getContextPath() + "/mvc/home");    //單獨控制地址
        responseObj.setData(user);
        session.setAttribute("userInfo", user);
        jsonObject= (JSONObject) JSON.toJSON(responseObj);
        return jsonObject;
    }
    /**
     * 登錄接口
     * @param req
     * @param user
     * @return
     */
    @PostMapping("/login")
    @ResponseBody
    public Object login(HttpServletRequest request, User user,HttpSession session) throws Exception{
        JSONObject jsonObject=new JSONObject();
        responseObj = new ResponseObj<User>();
        if (PublicUtil.isJsonRequest(request)) {    //確認是否json提交
            user = new GsonUtils().jsonRequest2Bean(request.getInputStream(), User.class);  //轉(zhuǎn)換為指定類型的對象
            return user.toString();
        }
        if (null == user) {
            responseObj.setCode(ResponseObj.EMPUTY);
            responseObj.setMsg("登錄信息不能為空");
            jsonObject= (JSONObject) JSON.toJSON(responseObj);
            return jsonObject;
        }
        if (StringUtils.isEmpty(user.getLoginId()) || StringUtils.isEmpty(user.getPwd())) {
            responseObj.setCode(ResponseObj.FAILED);
            responseObj.setMsg("用戶名或密碼不能為空");
            jsonObject= (JSONObject) JSON.toJSON(responseObj);
            return jsonObject;
        }
        //查找用戶
        User user1 = userService.findUser(user);
        if (null == user1) {
            responseObj.setCode(ResponseObj.EMPUTY);
            responseObj.setMsg("未找到該用戶");
            jsonObject= (JSONObject) JSON.toJSON(responseObj);
            return jsonObject;
        } else {
            if (user.getPwd().equals(user1.getPwd())) {
                user1.setPwd(session.getId());
                user1.setNextUrl(request.getContextPath() + "/mvc/home");
                responseObj.setCode(ResponseObj.OK);    //登錄成功,狀態(tài)為1
                responseObj.setMsg(ResponseObj.OK_STR);
                responseObj.setData(user1); //登陸成功后返回用戶信息
                userService.updateLoginSession(request.getSession().getId(), user.getLoginId());
                session.setAttribute("userInfo", user1);
                jsonObject= (JSONObject) JSON.toJSON(responseObj);
                return jsonObject;
            } else {
                responseObj.setCode(ResponseObj.FAILED);
                responseObj.setMsg("用戶密碼錯誤");
                jsonObject= (JSONObject) JSON.toJSON(responseObj);
                return jsonObject;
            }
        }
    }
}

相關的登錄注冊頁面我就放在github上吧牵素,還有相關的js css image資源

我在使用過程中發(fā)現(xiàn)js严衬,css資源不生效,
提示Absolute paths not recommended in JSP也就是
在JSP中不推薦使用絕對路徑

解決方法
在相對路徑前加上${pageContext.request.contextPath}這樣JSP取得資源的絕對路徑了

<script type="text/javascript" 
src="${pageContext.request.contextPath}/static/js/jquery-3.1.1.min.js"></script>

這里可以做前后端分離笆呆,用純粹的html+js來調(diào)用Api接口實現(xiàn)前后端分離请琳。下一個part寫

action="<%=request.getContextPath()%>/userAction/reg" method="post"

<%=request.getContextPath()%>這是指向應用的根路徑

mothod是說明我們請求的方式

Paste_Image.png

如果使用form表單提交時:
form表單中,每個input的name我們需要和后端的接口那邊的字段對應赠幕。
當我們的字段對應后俄精,spring可以自動把請求的內(nèi)容轉(zhuǎn)換為適應的對象。

存入數(shù)據(jù)庫的信息有亂碼

也就是說Form表單提交的時候出現(xiàn)亂碼
spring框架提供的字符集過濾器
spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解決POST方式造成的中文亂碼問題
可以使用過濾器處理亂碼問題
需要在web.xml中加入

<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

這些是登錄注冊的頁面

Paste_Image.png
Paste_Image.png

主要參考于大牛Clone丶記憶的SSM集成之路

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子飞主,更是在濱河造成了極大的恐慌,老刑警劉巖测蘑,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異康二,居然都是意外死亡,警方通過查閱死者的電腦和手機勇蝙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門沫勿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人味混,你說我怎么就攤上這事产雹。” “怎么了翁锡?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵蔓挖,是天一觀的道長。 經(jīng)常有香客問我馆衔,道長瘟判,這世上最難降的妖魔是什么怨绣? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮拷获,結(jié)果婚禮上篮撑,老公的妹妹穿的比我還像新娘。我一直安慰自己匆瓜,他們只是感情好赢笨,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驮吱,像睡著了一般茧妒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上左冬,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天桐筏,我揣著相機與錄音,去河邊找鬼又碌。 笑死九昧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的毕匀。 我是一名探鬼主播铸鹰,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼皂岔!你這毒婦竟也來了蹋笼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤躁垛,失蹤者是張志新(化名)和其女友劉穎剖毯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體教馆,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡逊谋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了土铺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胶滋。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悲敷,靈堂內(nèi)的尸體忽然破棺而出究恤,到底是詐尸還是另有隱情,我是刑警寧澤后德,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布部宿,位于F島的核電站,受9級特大地震影響瓢湃,放射性物質(zhì)發(fā)生泄漏理张。R本人自食惡果不足惜赫蛇,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涯穷。 院中可真熱鬧棍掐,春花似錦、人聲如沸拷况。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赚瘦。三九已至粟誓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間起意,已是汗流浹背鹰服。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揽咕,地道東北人悲酷。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像亲善,于是被迫代替她去往敵國和親设易。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蛹头,服務發(fā)現(xiàn)顿肺,斷路器,智...
    卡卡羅2017閱讀 134,639評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,779評論 6 342
  • spring mvc 工作機制(原理): DispatcherServlet主要用作職責調(diào)度工作渣蜗,本身主要用于控制...
    java大濕兄閱讀 1,893評論 5 24
  • 或許自己是個偽樂觀主義者屠尊,又或許是真的很積極。 估計是經(jīng)期綜合癥吧耕拷,這兩天情緒起伏很大讼昆。悲觀消極想太多。也知道很多...
    一粒簡單閱讀 124評論 0 0
  • 眼見得高考的日子一日近似一日骚烧,“愚頑怕讀文章”的寶玉心里著實慌了控淡。 這個周日,他在書房冥思苦想一...
    柳絮輕飛閱讀 556評論 0 3