1. 程式人生 > 其它 >Web前端(九)-建立SpringBoot專案、web伺服器(WebServer、Servlet、Controller)、SpringBoot介紹(處理靜態、動態資源請求、客戶端發出請求的幾種方式、獲取客戶端傳遞引數的方式)

Web前端(九)-建立SpringBoot專案、web伺服器(WebServer、Servlet、Controller)、SpringBoot介紹(處理靜態、動態資源請求、客戶端發出請求的幾種方式、獲取客戶端傳遞引數的方式)

建立SpringBoot專案步驟

  1. 第一步:新建一個工程/專案:File-->New-->Project,選擇Spring Initializr 預設選項即可, 如果下一步一直轉圈或顯示timeout超時,則使用下面備用的地址:https://start.springboot.io

  2. 第二步:設定Group(域名反寫)、Artifact、選擇jdk版本(JDK8)

  3. 第三步:選擇Web,勾選 Spring Web(預設Tomcat伺服器),然後下一步完成即可!

注意:

  • 工程建立完之後如果報錯, 進入到boot1-1裡面的pom.xml,重新整理maven ;

  • 如果還是不行,檢查maven是否配置正確

  • 如果確定maven配置沒問題 , 把.m2下的repository資料夾刪除,然後再次重新整理maven,直到工程中不報錯為止。

老師SpringBoot地址:https://gitee.com/teduliu/springboot05.git

伺服器

  • 伺服器就是一臺高效能電腦

web伺服器

  • 就是在一臺高效能電腦上面安裝了web服務軟體(WebServer)

  • 傳奇老師帶大家寫的WebServer工程不僅包含了WebServer相關的功能,還包含了一些業務功能

WebServer做了哪些事兒?

  • 負責建立了底層的網路連線

  • 負責根據客戶端請求的靜態資源地址找到對應的靜態資原始檔,並返回給客戶端

    j舉例:http://localhost:8088/myweb/login.html,webServer負責找到login.html檔案返回給客戶端

  • 負責根據客戶端請求的動態資源路徑找到對應的Servlet,並執行

什麼是Servlet?

  • WebServer是一個容器, WebServer本身不具備任何業務功能, 而Servlet是用於擴充套件WebServer業務功能的元件, Servlet就是用來實現具體業務功能的元件。

什麼是Controller?

  • SpringMVC框架引入的Controller控制器的概念, 可以將多個有相關性的Servlet進行整合, 整合到一個Controller中, 可以大大提高開發效率

    • 舉例: RegServlet、LoginServlet、SelectServlet ,可以將以上三個Servlet整合到一個UserController中

SpringBoot

  • SpringBoot是目前主流的開發框架, 使用此框架可以非常便捷的將目前常用的一些其它框架引入到自己的工程中,省去了大量配置工作;

  • SpringBoot的核心思想: 約定大於配置 , 程式設計師不需要關心每一個框架具體的配置過程,直接使用SpringBoot所約定好的內容即可.

  • 我們常說的SSM三大框架指的是 Spring, SpringMVC, Mybatis 這三個框架, 使用SpringBoot框架是為了更便捷的將三個框架引入到自己的工程之中, 使用SpringBoot引入這三個框架省去了很多配置操作。

處理靜態資源請求

  • 把靜態資原始檔放到工程的src/main/resources/static目錄下, 啟動工程,不需要新增任何程式碼,static裡面的檔案都可以被客戶端訪問到。

處理動態資源請求

  1. 在cn.tedu.boot11包下面建立controller包,並在裡面建立HelloController

  2. 在類名上面新增 @Controller註解

  3. 在類裡面建立一個hello方法,通過RequestMapping註解進行修飾,程式碼如下:

package com.example.boot11.controller;

import com.example.boot11.entity.Emp;
import com.example.boot11.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Controller //告訴編譯器當前類為一個控制器
public class HelloController {
/**
* 當客戶端向/hello地址發出請求時由此方法進行處理
* @param info
* @param response
* @throws IOException
*/
@RequestMapping("/hello")
public void hello(String info, HttpServletResponse response) throws IOException {
//request表示請求物件
//response表示響應物件

//獲取傳遞過來的引數
//String info = request.getParameter("info");//等於上面的String info

System.out.println("伺服器接收到請求了!");
//測試路徑:http://localhost:8080/hello

//設定響應型別 告訴瀏覽器返回的內容是文字或html標籤 字符集為utf-8
response.setContentType("text/html;charset=utf-8");
//獲取輸出物件 異常丟擲
PrintWriter pw = response.getWriter();
//給客戶端輸出資料
pw.print("恭喜你!測試成功!info="+info);
//關閉資源
pw.close();
}
}

執行工程時提示埠被佔用

  1. 如果當前執行著一個web工程,此時再執行另外一個web時會報錯, 關閉另外一個工程後再執行即可;

  2. 當工程異常關閉時也可能出現埠被佔用, 此時沒有可關閉的工程,有三種解決辦法:

    1. 重啟電腦

    2. 修改當前工程的埠號, 不再使用預設被佔用的8080埠

      • 找到application.properties配置檔案

      • 在裡面新增 server.port=808x ,注意後面不要加“;”

    3. 可以百度查詢 "8080埠被佔用",找到如何檢視佔用8080埠的程序id,然後殺掉該程序(不推薦)

客戶端發出請求的幾種方式

  1. 在瀏覽器的位址列中輸入請求地址

  2. 在html頁面中通過超連結發出請求

  1. 在html頁面中通過form表單發出請求

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>首頁</title>
    </head>
    <body>
    <h1>Hello SpringBoot!</h1>

    <!--相對路徑-->
    <a href="hello">相對路徑</a>
    <!--絕對路徑-->
    <a href="/hello">絕對路徑1</a>
    <!--只有訪問站外資源時才推薦使用下面這種方式-->
    <a href="http://localhost:8080/hello">絕對路徑2</a>

    <h3>通過form表單發請求</h3>
    <form action="/hello">
    <input type="text" name="info">
    <input type="submit">
    </form>
    </body>
    </html>

獲取客戶端傳遞引數的幾種方式

  1. 通過HttpServletRequest物件獲取引數

    String info = request.getParameter("info");
  2. SpringMVC框架提供的方式:

    1. 直接在處理請求的方法引數列表位置宣告傳遞過來的引數名的方式

    2. 將傳遞過來的引數直接封裝到物件中

@ResponseBody

  • 此註解是SpringMVC中提供的註解, 作用: 可以以返回值的方式給客戶響應資料,相比較PrintWriter要簡單很多。

package com.example.boot11.controller;

import com.example.boot11.entity.Emp;
import com.example.boot11.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Controller //告訴編譯器當前類為一個控制器
public class HelloController {
/**
* 當客戶端向/hello地址發出請求時由此方法進行處理
* @param info
* @param response
* @throws IOException
*/
@RequestMapping("/hello")
public void hello(String info, HttpServletResponse response) throws IOException {
//request表示請求物件
//response表示響應物件

//獲取傳遞過來的引數
//String info = request.getParameter("info");//等於上面的String info

System.out.println("伺服器接收到請求了!");
//測試路徑:http://localhost:8080/hello

//設定響應型別 告訴瀏覽器返回的內容是文字或html標籤 字符集為utf-8
response.setContentType("text/html;charset=utf-8");
//獲取輸出物件 異常丟擲
PrintWriter pw = response.getWriter();
//給客戶端輸出資料
pw.print("恭喜你!測試成功!info="+info);
//關閉資源
pw.close();
}

/**
* 處理登入請求
* @param username
* @param password
* @param response
* @throws IOException
*/
@RequestMapping("/login")
public void login(String username,String password,HttpServletResponse response) throws IOException {
//直接宣告傳遞過來的引數
//設定響應型別
response.setContentType("text/html;charset=utf-8");
//獲取輸出物件
PrintWriter pw = response.getWriter();
//輸出資料
pw.print("接收到了username="+username+",password="+password);
//關閉資源
pw.close();
}

/**
* 處理註冊請求
* @param username
* @param password
* @param nick
* @param age
*/
@RequestMapping("/reg")
@ResponseBody //新增此註解後可以通過返回值的方式給客戶端響應資料
public String reg(User user){
System.out.println("user = " + user);
return "接受到請求了";
}

/**
* 處理員工新增請求
* @param emp
* @return
*/
@RequestMapping("/add")
@ResponseBody
public String add(Emp emp){
return "我叫"+emp.getName()+",工作是"+emp.getJob()+",工資是"+emp.getSalary()+"元";
}
}

練習:

  1. 建立一個add.html頁面,裡面新增一個form表單,提交地址為/add,表單中有三個文字框,分別獲取使用者輸入的員工姓名name,工資salary,工作job和一個新增按鈕

  2. 在HelloController中宣告一個add方法,通過RequestMapping註解處理/add請求,在entity包下面建立Emp員工實體類(包含name,salary,job屬性 還有setget方法tostring方法),在add方法引數列表的位置直接宣告Emp emp物件接收傳遞過來的引數 , 把接收到的引數以以下格式返回給客戶端, 通過剛才接觸的@ResponseBody註解給客戶端返回資料。

    以:我叫xxx工作是xxx月薪xxxx 形式返回。

晚課練習: 在作業平臺上提交今天的作業

  1. 建立一個新工程boot1-2 , 把11改8 , 打鉤Spring Web

  2. 在static裡面建立一個reg.html頁面 , 頁面參考今天下午的reg頁面, 提交地址為/reg

  3. 建立一個controller包(這個包一定要在cn.tedu.boot12包裡面建立), 在包裡面建立UserController, 記得在類名上面新增@Controller註解, 新增reg方法通過RequestMapping註解配置請求地址/reg, 把接收到的引數封裝到entity包下面的User實體類中(此時建立User實體類並提供set、get和tostring方法) , 通過返回值的方式響應資料(新增@ResponseBody註解) 給客戶端返回 "我叫xxx 註冊已成功!"

  4. 建立boot1-3工程 把前三步重複一遍!

  5. 建立boot1-4工程 把前三步重複一遍!

  6. 建立boot1-5工程 把前三步重複一遍!

  7. ...... 直到做到能默寫為止