1. 程式人生 > 實用技巧 >JavaWeb基礎一

JavaWeb基礎一

JavaWeb

IDEA 快捷鍵:

  • 導包:alt + enter
  • 看方法的具體:ctrl + b /滑鼠左鍵
  • 重寫 父類方法:ctrl + o
  • 補充左邊程式碼:ctrl + alt + v 或 alt + enter
  • 程式碼規範:ctrl + alt + l
  • :alt + insert
  • 註釋:Ctrl + / 或 Ctrl +Shift+ /

基本

  • 新的web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                          http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0"
             metadata-complete="true">
    </web-app>
    
  • 基本路徑

        <!--路徑對映-->
        <servlet>
            <servlet-name>login</servlet-name>
            <servlet-class>com.requst.test.loginServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>login</servlet-name>
            <url-pattern>/login</url-pattern>
        </servlet-mapping>
    
  • maven依賴包 pom.xml

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        
        <!--  jsp-api:專案依賴-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
    
  • 編碼和解碼

    // string 編碼為 utf-8
    URLEncoder.encode("string","utf-8");
    // string 解碼為 utf-8
    URLDecoder.decode("string","utf-8");
    

1. 基本概念

1.1 前言

web開發

  • 靜態web
    • html,css
    • 頁面不會發生改變
  • 動態web
    • 技術棧:Servlet/jsp。。。
    • 資料會始終發生改變,不同的時間,不同的地點頁面都會不同

1.2 web應用程式

2. web伺服器

3. Tomcat

3.1下載tomcat

3.2 啟動tomcat

  • 現在暫時通過bin目錄下的 startup.bat 啟動 tomcat

  • 訪問http://localhost:8080若出現如下圖,則表示啟動成功

3.3 tomcat配置

  • tomcat預設埠號:8080
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
  • 伺服器預設名:localhost
  • 預設網站應用存放的位置為:webapps
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

3.4 釋出網站

  • 如何訪問:

    • 將自己寫的網站,放到伺服器( Tomcat中指定的web應用的資料夾( webapps)下,就可以訪問了
    • http://localhost:8080/myWeb/
  • 網站結構:

    --webapps:Tomcat伺服器的web目錄
    	-ROOT 
    	-webName:網站的目錄名
    		-WEB-工NF
    			-c1asses:java程式
    			-lib:web應用所依賴的jar包
    			-web.xml:網站配置檔案
    		-index.htm預設的首頁
    

4. HTTP

5. Maven

5.1 需求:

  • 1.在javaweb開發中,需要使用大量的jar包,我們手動去匯入;
  • 2.如何能夠讓一個東西自動幫我匯入和配置這個ar包。
    由此, Maven誕生了!

5.2 Maven專案架構管理工具

Maven的核心思想;約定大於配置

5.3 maven 下載 安裝

  1. 開啟 maven官網

  2. 選擇 Download

  3. 找到Files,下載 Binary 和 Source

  4. 解壓 第一個即可

5.4 maven 配置

  • 開啟環境變數
  • 在系統變數 中 新建
    • 變數名:MAVEN_HOME
    • 變數值:maven的目錄
  • 在path中新增:%MAVEN_HOME%\bin
  • 在cmd中輸入 mvn -version,若彈出如圖,則成功

5.5阿里雲映象

  • 先開啟 setting.xml

  • 找到 mirrors 標籤,配置

    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>
    http://maven.aliyun.com/nexus/content/groups/public class="hljs-tag">
    </url>
    

5.6 本地倉庫

  • 先新建 一個資料夾做為本地倉庫

  • 再 開啟 setting.xml

  • 找到 localRepository

 <localRepository>你的本地倉庫路徑</localRepository>
  • 如圖 我的配置

5.7 在 IDEA 中使用maven模板配置 Maven

  1. 開啟 IDE 新建專案
  2. 建立Maven專案

  1. 等待專案初始化完成

  2. 觀察 本地倉庫

  3. IDEA 的 Maven 配置 注意

5.8 在 IDEA 中建立乾淨的Maven專案

  1. 新建專案

  2. 建立maven專案 不用選,直接Next

  3. 輸入專案名 ---》完成

  4. 如圖,這是乾淨的maven專案

5.9 標記檔案功能

方法一:

方法二:

  1. 先找到 專案結構

  2. 1 --> 2--> 3--> 4

5.10 IDEA 配置 Tomcat

5.11 啟動

  1. 點選 啟動

  2. 效果 如圖:

5.12 pom 檔案

Maven 功能

pom.xml 是maven核心

 <?xml version="1.0" encoding="UTF-8"?>

<!--這裡就是Maven版本和標頭檔案-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <!--這裡是專案 組id,名稱 -->
  <groupId>org.example</groupId>
  <artifactId>javaweb-01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
<!--  packag:專案打包方式
  jar:java 應用
  war:javaWeb 應用
-->
  <packaging>war</packaging>

  <name>javaweb-01-maven Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

<!--  配置-->
  <properties>
<!--    預設編碼格式-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--    編碼版本-->
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

<!--  專案依賴-->
  <dependencies>
    <dependency>
<!--      具體依賴的 jar包 配置檔案-->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

<!--  專案構建的東西-->
  <build>
    <finalName>javaweb-01-maven</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

6. Servlet

6.1 Servlet簡介

  • Sun在這些AP中提供一個介面叫做:Servlet,如果你想開發一個 Servlet程式,只需要完成兩個小步驟:
    • 編寫一個類,實現 Servlet介面
    • 把開發好的ava類部署到web伺服器中。

把實現了 Servlet介面的ava程式叫做, Servlet

6.2 HelloServlet

  1. 構建一個普通的 Maven專案,刪掉裡面的src目錄,以後我們的學習就在這個專案裡面建立 Moudle;這個空的工程就是 Maven主工程;

  2. 再建立一個模板maven,作為子工程

  • 關於 Maven 父子工程的理解:

    • 父專案中會有:

      <modules>
      <module>servlet_01</module>
      </modules>
      
    • 子專案中會有:

      <parent>
      <artifactId>javaWeb_study</artifactId>
      <groupId>org.example</groupId>
      <version>1.0-SNAPSHOT</version>
      </parent>
      

    父專案中的java,子專案可以直接使用

  1. 編寫一個Java類,繼承 HttpServlet (實現servlet介面)
public class HelloServlet extends HttpServlet {

    public HelloServlet() {
        super();
    }

//    由於get或都post只是請求實現的不同的方式,所以可以相互呼叫,業多邏都一樣;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        ServletOutputStream outputStream = resp.getOutputStream();
        PrintWriter pw =    resp.getWriter();
        pw.println("hello servlet");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
  1. 編寫 servlet 對映

    為什麼需要對映:

    ​ 想要通過瀏覽器訪問Java程式,而瀏覽器需要連線web伺服器,所以我們需要在web服務中註冊我們寫的 Servlet,還需給他一個瀏覽器能夠訪問的路徑;

    <!--註冊Servlet-->
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.study.servlet.HelloServlet</servlet-class>
        </servlet>
    <!--    Servlet的請求路徑-->
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>hello</url-pattern>
        </servlet-mapping>
    
  2. 配置Tomcat

    5.1 先建立Facets

    ​ 5.2 建立 Artifacts

    ​ 5.3 新增Tomcat

  3. 啟動測試

    首頁:

    通過對映的:

6.3 Servlet原理

6.4 Mapping

  1. 一個 servlet 指定一個對映路徑

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/ppx</url-pattern>
    </servlet-mapping>
    
  2. 一個 servlet 指定多個對映路徑

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/ppx</url-pattern>
        <url-pattern>/gkd</url-pattern>
        <url-pattern>/hello/*</url-pattern>
        <url-pattern>/ok</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/ppx</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
    	<url-pattern>/gkd</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/ok</url-pattern>
    </servlet-mapping>
    
  3. 一個 servlet 指定通用對映路徑

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
  4. 一個 servlet 指定對映路徑字尾

    <!--  注意: * 前面不能加 / 和 對映路徑
    	例:<url-pattern>/whh/*.ppx</url-pattern>  tomcat會報錯
    -->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.ppx</url-pattern>
    </servlet-mapping>
    
  5. 優先順序問題:

    指定了固有的對映路徑優先順序最高,如果找不到就會走預設的處理請求

6.5 ServletContext

​ Web容器在啟動的時候,它會為每個Web程式都建立一個對應的 ServletContext物件,它代表了當前的Web應用

1、共享資料

//  HelloServlet 中
	@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
//        this.getInitParameter();
//        this.getServletConfig();
//        this.getServletContext();
        ServletContext context = this.getServletContext();
        String uname = " ppx ";
        context.setAttribute("username",uname); //將一個數據儲存在了 ServletContext中,名字為:username。值:uname
        System.out.println("come to HelloServlet");
    }
//	GetServlet 中
	@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().print("名字是:" + username);
        System.out.println("come to GetServlet,name --->"+username);
    }
<!--  HelloServlet-->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.study.servlet_03.HelloServlet_03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

  <!--  GetServlet-->
  <servlet>
    <servlet-name>getC</servlet-name>
    <servlet-class>com.study.servlet_03.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getC</servlet-name>
    <url-pattern>/getC</url-pattern>
  </servlet-mapping>

2、測試:

​ 首先進入 GetServlet.java ,這時 ServletContext 的 username值為null

​ 進入 HelloServlet ,將 username 的值 ppx 存入 ServletContext 中

​ 再次進入 GetServlet.java ,這時 ServletContext 的 username值為 ppx

3、請求轉發

public class ServletDome_02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
//        resp.getWriter().println("這裡是ServletDome_02");

        ServletContext context = this.getServletContext();
//		請求轉發
      context.getRequestDispatcher("/getC").forward(req,resp);
        System.out.println("come to ServletDome_02");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

4、讀取資原始檔

Properties

  • 在Java目錄下新建properties
  • 在resources目錄下新建properties

發現都被打包到了classes目錄下,一般稱這個路徑為classpath

思路:同過檔案流來讀取

public class PropertiesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        System.out.println("come to PropertiesServlet ");
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties prop = new Properties();
        prop.load(is); //本地路徑
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().print(user+":"+pwd);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
  <!--  PropertiesServlet-->
  <servlet>
    <servlet-name>ps</servlet-name>
    <servlet-class>com.study.servlet_03.PropertiesServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ps</servlet-name>
    <url-pattern>/ps</url-pattern>
  </servlet-mapping>

測試結果:

6.6 HttpServletResponse

web伺服器接收到客戶端的http請求,針對這個請求,分別建立一個代表請求的 HttpServletRequest物件,代表響應的一個 HttpServletResponse物件

  • 如果要獲取客戶端請求過來的引數:找 HttpServletRequest

  • 如果要給客戶端響應一些資訊:找 HttpServletResponse

1、檔案下載

  1. 獲取檔案的下在路徑

  2. 下載的檔名稱

  3. 設定支援瀏覽器下載需要的東西

  4. 獲取下載檔案的輸入流

  5. 建立緩衝區

  6. 獲取OutputStream物件

  7. 將FileOutputStream流寫入到buffer緩衝區

  8. 使用OutputStream將緩衝區中的資料輸出到客戶端

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //        1. 獲取檔案的下在路徑
            String realPath = "E:\\java  學習程式碼\\IDEAJavaProject\\javaWeb_study_01\\response_01\\target\\classes\\007.png";
                    // this.getServletContext().getRealPath("src/main/resources/007.png");
            System.out.println("現在的檔案下載路徑為:"+realPath);
    //        2. 下載的檔名稱
            String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
    //        3. 設定支援瀏覽器下載需要的東西
            resp.setHeader("Content-Disposition","attachment; filename"+ URLEncoder.encode(fileName,"utf-8"));
    //        4. 獲取下載檔案的輸入流
            FileInputStream in = new FileInputStream(realPath);
    //        5. 建立緩衝區
            int len = 0;
            byte[] buffer = new byte[1024];
    //        6. 獲取OutputStream物件
            ServletOutputStream out = resp.getOutputStream();
    //        7. 將FileOutputStream流寫入到buffer緩衝區,使用OutputStream將緩衝區中的資料輸出到客戶端
            while((len = in.read(buffer)) != -1){
                out.write(buffer,0,len);
            }
    //        8. 關閉流
            out.close();
            in.close();
        }
    

2、簡單驗證碼

驗證實現

  • 前段實現

  • 後端實現

    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 如何讓瀏覽器 3s 重新整理一次
            resp.setHeader("refresh","3");
    
            // 在記憶體中建立一張圖片
            BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);
            // 得到圖片
                //得到筆
            Graphics2D g = (Graphics2D) image.getGraphics();
                //畫出背景
            g.setColor(Color.WHITE);
            g.fillRect(20,20,80,20);
                // 畫出隨機數字
            g.setColor(Color.BLUE);
            g.setFont(new Font(null,Font.BOLD,20));
            g.drawString(makeNum(),0,20);
    
            // 告訴瀏覽器 用圖片方式開啟
            resp.setC ontentType("image/jpeg");
            // 網站存在快取 , 不讓圖片進行快取
            resp.setDateHeader("expirse",-1);
            resp.setHeader("cache-control","no-cache");
            resp.setHeader("pragma","no-cache");
            // 把圖片寫給瀏覽器
            ImageIO.write(image,"jpg",resp.getOutputStream());
        }
    
        private String makeNum (){
            Random random = new Random();
            String num = random.nextInt(999999) + 100000 + "";
            return num;
        }
    

3. 重定向

一個web資源收到客戶端請求後,他會通知客戶端去訪問另外一個web資源,這個過程叫重定向。一般是跳轉頁面。

測試:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
         resp.setHeader("Location","/r/img");
         resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
         */
        resp.sendRedirect("/r/img");    //重定向
    }

重定向和轉發的區別:

  • 相同點:
    • 頁面都會跳轉
  • 不同點
    • 請求轉發的時候,url 不會發生變化 ,編碼307
    • 重定向時,url 會發生改變,編碼302

6.7 HttpServletRequest

HttpServletRequest代表客戶端的所有請求

獲取前端傳遞的引數,再轉發

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        // 獲取引數
        String name = req.getParameter("username");
        String pwd = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobbies");
        // 列印引數
        System.out.println("----------------------------");
        System.out.println(name);
        System.out.println(pwd);
        System.out.println(Arrays.toString(hobbies));
        System.out.println("----------------------------");
        // 通過請求轉發
        req.getRequestDispatcher("/succse.jsp").forward(req,resp);
    }

7、Cookie、Session

7.1 會話

會話:使用者開啟一個瀏覽器,點選了很多超連結,訪問多個Web資源,關閉瀏覽器,這個過程可以稱之為會話 。

有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經來過,稱之為有狀態會話。

7.2 儲存會話的兩種技術

cookie

  • 客戶端技術(響應、請求)

session

  • 伺服器技術、利用這個技術、可以儲存使用者的會話資訊。我們把資訊放在Session 中

常見應用:網站會

1、從請求得到 Cookie

2、伺服器相應給客戶端cookie

Cookie[] cookies = req.getCookies();	//獲得 cookie
cookie.getName();	//獲得cookie中的 key
cookie.getValue();	//獲得cookie中的 value
new Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis()));	//新建一個 cookie
cookie.setMaxAge(60*60);	//設定cookie的有效期 1小時
resp.addCookie(cookie);		//響應給客戶端一個cookie

cookie:一般會儲存在本地的使用者目錄 appdate 下

刪除cookie:

  • 不設定有效期,關閉瀏覽器,自動失效
  • 設定有效期的時間為 0

7.4 Session(重點)

什麼是 Session :

  • 伺服器會給每個瀏覽器建立一個 Session 物件;
  • 一個Session 獨佔一個瀏覽器,只要瀏覽器沒有關閉,這個Session 就會一直存在
  • 使用者登入後,整個網站都可以訪問。儲存使用者資訊
 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解決亂碼問題
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();
        //給Session中存入資訊
        session.setAttribute("name","皮皮蝦");
        session.setAttribute("object",new preson("七仔",15));
        //獲取Session 的 ID
        String id = session.getId();
        //判斷Session 是不是新建立的
        if (session.isNew()){
             resp.getWriter().write("\r\nSession 建立成功,ID為"+id);
        }else{
            resp.getWriter().write("\r\nSession 已經存在,ID為"+id);
        }
    }

		//得到Session中的資訊
        String name = (String) 		session.getAttribute("name");
        resp.getWriter().println("name--->"+name);
		// 移除 session 的值
        session.removeAttribute("name");
        //登出 Session
        session.invalidate();

自動失效:

<!--  設定 Session 的失效時間 ,以分鐘為單位-->
  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>

8、 JSP

8.1 什麼是 JSP

Java Server Pages:Java伺服器端頁面,也和 Servlet一樣,用於動態Web技術!

最大的特點:

  • 寫JSP就像在寫HTML
  • 區別:
    • HTML只給使用者提供靜態的資料
    • JSP頁面中可以嵌入JAVA程式碼,為使用者提供動態資料

8.2 JSP原理

思路:JSP是怎麼執行的

  • 將html內容變為Java語法執行

  • 伺服器內部工作

    tomcat中有一個work目錄

    本機地址:C:\Users\ASUS.IntelliJIdea2019.3\system\tomcat\Unnamed_javaWeb_study_02\work\Catalina\localhost\rq\org\apache\jsp

頁面轉變為了Java程式

JSP的本質是Servlet

//初始化
public void _jspInit() {
  }
//銷燬
  public void _jspDestroy() {
  }
//JSPServer
  public void _jspService(HttpServletRequest request,HttpServletResponse response)

1、判斷方法的程式碼

if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允許 GET、POST 或 HEAD。Jasper 還允許 OPTIONS");
        return;
      }

2、內建的物件:

final javax.servlet.jsp.PageContext pageContext;	//頁面上下文
javax.servlet.http.HttpSession session = null;		//session
final javax.servlet.ServletContext application;		//applicationContext
final javax.servlet.ServletConfig config;			//config
javax.servlet.jsp.JspWriter out = null;				//out
final java.lang.Object page = this;					//page:當前
HttpServletRequest request							//請求
HttpServletResponse response						//響應

3、輸出頁面前增加的程式碼

response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;

4、內建的物件能在JSP中直接使用

訪問JSP頁面的流程

在JSP頁面中;
只要是JAVA程式碼就會原封不動的輸出;
如果是HTML程式碼,就會被轉換為:

out.write("<h1>登入</h1>\r\n");

8.3 JSP基本語法

EL表示式:${ }

JSP表示式

  <% = new java.util.Date() %>

JSP指令碼片段

<% for (int i = 0; i < 5; i++) { %>
<h2> Start ${i} </h2>
<% }%>

JSP宣告

<%! static {
    System.out.println("這是 PIG");
}
    private  int  value = 20;
    public void domeFuncation(){
        System.out.println("PIG AGE IS"+value);
    }
%>

JSP宣告:會被編 譯到JSP生成Java的類中!其他的,就會被生成到 _jspService方法中!

JSP的註釋不會顯示在客戶端,而HTML會顯示

8.4 JSP 指令

1、定製錯誤頁面

<%--JSP裡:定製錯誤頁面--%>
	<%--<%@ page errorPage="error/500.jsp"  %>--%>
<%--web.xml裡:定製錯誤頁面--%>
 <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
</error-page>

2、404頁面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>404 ERROR</title>
</head>
<body>
    <h1>糟糕,訪問丟失了...</h1>
    <img src="../images/404.jfif" title="訪問丟失">
</body>
</html>

2、新增網頁頭和網頁尾

<%--第一種:兩個頁面和當前頁面 合在一起 --%>
    <%@ include file="/common/Header.jsp"%>
    <h2>Start</h2>
    <%@ include file="/common/footer.jsp"%>
<%--第二種:3個頁面拼接在一起,本質還是3個--%>
	<jsp:include page="common/Header.jsp"/>
    <h2>Start</h2>
    <jsp:include page="common/footer.jsp"/>

8.5 9大內建物件

  • PageContext 存東西
  • Request 存東西
  • Response
  • Session 存東西
  • Application【ServletContext】 存東西
  • config 【ServletConfig】
  • out
  • page
  • exception

8.6 JSP標籤、JSTL標籤、EL表示式

 <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
        <!-- JSTL表示式 依賴-->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/taglibs/standard -->
        <!-- standard 標籤庫-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

EL表示式:$ { }

  • 獲取資料

  • 執行運算

  • 獲取web開發的常用物件

JSTL標籤

JSTL標籤庫的使用就是為了彌補HTML標籤的不足;它自定義許多標籤,可以供我們使用,標籤的功能和Java程式碼一樣!

<jsp:forward page="dome03.jsp">
    <jsp:param name="name" value="ppx"/>
    <jsp:param name="age" value="18"/>
</jsp:forward>

格式化標籤
SQL 標籤
XML 標籤
JSTL 函式

核心標籤

JSTL標籤庫使用步驟:

  • 引入對應的 taglib

  • 使用其中的方法

  • 在 Tomcat也需要引入jstl的包,否則會報錯:JSTL解析錯誤

JSTL:if測試

  <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  
  <%--引入JSTL核心標籤庫,才能使用JSTL標籤--%>
  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <html>
  <head>
      <title>JSTL if測試</title>
  </head>
  <body>
      <h2>  測試 DOME </h2>
  <%--    <div>--%>
          <form action="jstlDome01.jsp" method="get">
              <input type="text" name="username" value="${param.username}" >
  
              <input type="submit" value="Login...">
          </form>
      <%--
      test:條件
      var:儲存 變數名
      value:賦值
      --%>
      <hr/>
  <c:if test="${param.username == '123'}"  var="isAdmin" >
      <c:out value="jin ru le"></c:out>
  </c:if>
      <c:out value="${isAdmin}"></c:out>
  </body>
  </html>

JSTL:choose when 測試

<body>
    <h1>choose when 判斷</h1>
    <hr/>
    <form action="jstlDome02.jsp" methon="get">
        <input type="number" name="score" />
        <input type="submit" value="start">
    </form>
    <hr/> 

<c:choose>
    <%-- param . name :可以取得 name 的值  --%>
    <c:when test="${param.score >= 90}">優秀</c:when>
    <c:when test="${param.score >= 80}">良好</c:when>
    <c:when test="${param.score >= 60}">及格</c:when>
    <c:when test="${param.score <= 59}">失敗</c:when>
</c:choose>
    <hr/>
</body>

9、JavaBean

IDEA連線MySQL出現錯誤,解決地址:連線地址

10、 MVC三層架構

什麼是MVC:Model view Controller 模型、檢視、控制器

10.1 以前的架構

使用者直接訪問控制層,控制層就可以直接操作資料庫

servlet --> CRUD --> 資料庫
弊端:程式十分的臃腫,不利於維護
    
servlet的程式碼中:處理請求、響應、檢視跳轉、處理JDBC、處理業務程式碼、處理邏輯程式碼