Spring-Boot的Web開發(fā)(一)

1. 概述

2. 導(dǎo)入靜態(tài)資源文件

1.首先導(dǎo)入css,js.img文件.把這些文件全部放在static下的asserts目錄下

靜態(tài)資源文件夾

2. 導(dǎo)入html文件,把這些文件放入templates文件夾下面

html文件
  • 但是這些文件如果你直接訪問localhost:8080是訪問不到的

  • 默認(rèn)訪問的是靜態(tài)資源文件夾下面的index.html頁面,但是應(yīng)該轉(zhuǎn)到我們的login.html頁面

  • 在項目下創(chuàng)建config包,創(chuàng)建MyMvcConfig

    public class MyMvcConfig implements WebMvcConfigurer {
    
    /**
     * 跳轉(zhuǎn)到指定的頁面
     * @param registry
     */
    public void addViewControllers(ViewControllerRegistry registry){
        registry.addViewController("/").setViewName("login");
        //遇到"index.html"自動轉(zhuǎn)到"login.html"頁面      
        registry.addViewController("/index.html").setViewName("login");
        }
    }
    
  • 這個類方法的作用就是把初始的請求轉(zhuǎn)發(fā)到login.html這個響應(yīng),之后就可以在localhost:8080直接訪問

3. 國際化(可以轉(zhuǎn)變頁面語言)

  • 通過瀏覽器的語言信息,動態(tài)調(diào)整瀏覽器的語言

1. Spring MVC步驟

  • 編寫國際化配置文件
  • 使用ResourceBundleMessageSource管理國際化資源文件
  • 在頁面使用fmt:message取出國際化內(nèi)容

2. SpringBoot步驟

  • 編寫國際化配置文件,抽取頁面需要顯示的消息

    國際化配置文件

  • SpringBoot自動配置好了管理國際化資源文件的組件,但是他默認(rèn)是認(rèn)為這個資源文件是放在classpath/目錄下的,我們是把它放在了classpath/目錄下的i18n目錄下.所以我們需要重新配置一下它的位置

    spring.messages.basename=i18n.login
    
  • 去頁面獲取國際化的值,根據(jù)瀏覽器語言的信息進(jìn)行設(shè)置的

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="description" content="">
        <meta name="author" content="">
        <title>Signin Template for Bootstrap</title>
        <!-- Bootstrap core CSS -->
        <link href="asserts/css/bootstrap.min.css" rel="stylesheet">
        <!-- Custom styles for this template -->
        <link href="asserts/css/signin.css" rel="stylesheet">
    </head>
    <body class="text-center">
        <form class="form-signin" action="dashboard.html">
            <img class="mb-4" src="asserts/img/bootstrap-solid.svg" alt="" width="72" height="72">
            <h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>
            <label class="sr-only" th:text="#{login.username}">Username</label>
            <input type="text" class="form-control" placeholder="Username" th:placeholder="#{login.username}" required="" autofocus="">
            <label class="sr-only" th:text="#{login.password}">Password</label>
            <input type="password" class="form-control" placeholder="Password" th:placeholder="#{login.password}" required="">
            <div class="checkbox mb-3">
                <label>
          <input type="checkbox" value="remember-me"> [[#{login.remember}]]
        </label>
            </div>
            <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.btn}">Sign in</button>
            <p class="mt-5 mb-3 text-muted">? 2019-2020</p>
            <a class="btn btn-sm">中文</a>
            <a class="btn btn-sm">English</a>
        </form>
    </body>
    </html>
    
  • 點(diǎn)擊中英文按鈕轉(zhuǎn)變頁面語言信息

    • 原理:國際化Local(區(qū)域信息對象):LocalResolver獲取區(qū)域信息對象
    @Bean
        @ConditionalOnMissingBean
        @ConditionalOnProperty(
            prefix = "spring.mvc",
            name = {"locale"}
        )
        public LocaleResolver localeResolver() {
            if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
                return new FixedLocaleResolver(this.mvcProperties.getLocale());
            } else {
                AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
                localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
                return localeResolver;
            }
        }
        
    
    • 默認(rèn)的就是根據(jù)請求頭帶來的區(qū)域信息獲取語言信息,如果我們想通過點(diǎn)擊超鏈接按鈕來獲取網(wǎng)頁的語言信息,我們就必須自己編寫一個類來實現(xiàn)LocaleResolver接口
    public class MyLocaleResolver implements LocaleResolver {
    
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String l = request.getParameter("l");
        Locale locale = Locale.getDefault();
        if(!StringUtils.isEmpty(l)){
            String[] split = l.split("_");
            locale = new Locale(split[0],split[1]);
        }
        return locale;
    }
    
    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
        }
    }
    
    • 把自己編寫好的MyLocaleResolver放在spring mvc的擴(kuò)展功能的類MyMvcConfig里面
    /**
     * @description: 使用WebMvcConfigurer可以擴(kuò)展spring mvc的功能
    * @Author: Mutong
    * @Date: 2020/2/2 15:49
    */
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
    /**
     * 注冊一個自己編寫的LocaleResolver,用來點(diǎn)擊按鈕實現(xiàn)國際化
     * @return
     */
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
        }
    }
    
    • 同時改變HTML頁面的中英文超鏈接
    <a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
    <a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
    
    • 頁面顯示


      頁面顯示

      image

4. 登陸攔截

1. 表單提交

  • 完善html代碼,根據(jù)下面的代碼,把頁面提交到http://localhost:8080/user/login頁面
    <form class="form-signin" action="dashboard.html" th:action="@{/user/login}" method="post">

2. 編寫loginController方法

@Controller
public class loginController {
    //@PostMapping(value = "/user/login")
    @RequestMapping(value = "/user/login",method = RequestMethod.POST)
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Map<String,Object> map){
        if (!StringUtils.isEmpty(username) && "123456".equals(password)){
            return "dashboard";
        }else{
            map.put("msg","用戶名密碼錯誤");
            return "login";
        }
    }
}

3. 登陸錯誤編寫提示

  • 如果取到的msg不為空,則顯示,否則不顯示
    <p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>

4. 登陸攔截

  • 完善loginController
    • Map<String,Object> map用一個map用來存儲報錯信息
    • HttpSession session獲取登陸的用戶名session.setAttribute("loginUser",username);
@Controller
public class loginController {
    //@PostMapping(value = "/user/login")
    @RequestMapping(value = "/user/login",method = RequestMethod.POST)
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Map<String,Object> map,
                        HttpSession session){
        if (!StringUtils.isEmpty(username) && "123456".equals(password)){
            session.setAttribute("loginUser",username);
            return "redirect:/main.html";
        }else{
            map.put("msg","用戶名密碼錯誤");
            return "login";
        }
    }
}
  • 編寫loginHandlerInterceptor類來進(jìn)行登陸檢查
    • getAttribute("loginUser");獲取到登陸用戶
    • 判斷user是否為空
/**
 * @description: 登陸檢查
 * @Author: Mutong
 * @Date: 2020/2/2 20:57
 */
public class loginHandlerInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("loginUser");
        if (user == null){
            request.setAttribute("msg","沒有權(quán)限,請先登錄");
            request.getRequestDispatcher("/index.html").forward(request,response);
        }else{

        }
        return true;
    }
}
  • loginHandlerInterceptor放入到容器中
    • 攔截所有的請求addPathPatterns("/**")
    • 除了excludePathPatterns("/index.html","/","/user/login","/asserts/**");
    /**
     * 注冊攔截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new loginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/index.html","/","/user/login","/asserts/**");
    }
  • 頁面顯示
    image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市片拍,隨后出現(xiàn)的幾起案子煌集,更是在濱河造成了極大的恐慌,老刑警劉巖捌省,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苫纤,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卷拘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門喊废,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恭金,你說我怎么就攤上這事操禀。” “怎么了横腿?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斤寂。 經(jīng)常有香客問我耿焊,道長,這世上最難降的妖魔是什么遍搞? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任罗侯,我火速辦了婚禮,結(jié)果婚禮上溪猿,老公的妹妹穿的比我還像新娘钩杰。我一直安慰自己,他們只是感情好诊县,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布讲弄。 她就那樣靜靜地躺著,像睡著了一般依痊。 火紅的嫁衣襯著肌膚如雪避除。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天胸嘁,我揣著相機(jī)與錄音瓶摆,去河邊找鬼。 笑死性宏,一個胖子當(dāng)著我的面吹牛群井,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毫胜,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼书斜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了指蚁?” 一聲冷哼從身側(cè)響起菩佑,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凝化,沒想到半個月后稍坯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年瞧哟,在試婚紗的時候發(fā)現(xiàn)自己被綠了混巧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡勤揩,死狀恐怖咧党,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陨亡,我是刑警寧澤傍衡,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站负蠕,受9級特大地震影響权纤,放射性物質(zhì)發(fā)生泄漏构资。R本人自食惡果不足惜乾闰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一速客、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欲账,春花似錦屡江、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俄删,卻和暖如春宏怔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畴椰。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工臊诊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斜脂。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓抓艳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帚戳。 傳聞我的和親對象是個殘疾皇子玷或,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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