1. 程式人生 > >web開發中前端頁面是如何跟後端伺服器資料互動的

web開發中前端頁面是如何跟後端伺服器資料互動的

後端伺服器一般是指servlet容器,用於執行java源程式

常見的網頁有html,htm,shtml,asp,aspx,php,jsp等格式
前兩個常用於靜態網頁,後面幾個常用於動態網頁。

這裡前端網頁以比較常見的 xx.html 和 xx.jsp 網頁作為介紹,其它類似

 

一、靜態頁面xx.html如何跟後臺互動:

  • 先來看一個最簡單的登陸介面原始碼
  •   <body>
        <form action="loginServlet" method="post">
           user:<input type="text" name="username"/>
           password:<input type="password" name="password"/>
          
           <input type="submit" value="Submit"/>
        </form>
      </body>
  • 這是一個表單,我們看到裡面都是純html內容,這是一個靜態頁面,當我們點選submit按鈕時候,瀏覽器會提交表單內的資料到伺服器的loginServlet這個相對地址,我們看看瀏覽器的地址變成啥了:
  • 這不就是我們的後臺servlet的地址嘛,然後這個地址指向的是loginServlet這個servlet,然後在web.xml檔案中找到這個servlet關聯的java類,從而執行了伺服器端的程式(第一次執行,那麼會例項化,然後執行裡面init()函式,然後執行service()函式,如果是第二次呼叫,那麼不用例項化了,直接執行service()函式),我們來看看伺服器端的源程式:
  • package com.atguigu.javaweb;

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;

    public class loginServlet extends MyGeneriServlet {
        public void init(javax.servlet.ServletConfig config) throws ServletException{
            super.init(config);
        }
        public void service(ServletRequest request, ServletResponse response)
                throws ServletException, IOException {
            //獲取請求方式是GET,POST方式?
            HttpServletRequest httpServletRequest=(HttpServletRequest) request;
            String method=httpServletRequest.getMethod();
            System.out.println(method);
            //1.獲取請求引數:username,password
            String username=request.getParameter("username");
            String password=request.getParameter("password");
            //獲取請求引數
            String initUser=getServletContext().getInitParameter("user");
            String initpassword=getServletContext().getInitParameter("password");
             
            PrintWriter out=response.getWriter();
            //3.對比
            if(initUser.equals(username)&&initpassword.equals(password)){
                out.print("Hello"+username);    // 生成html內容
            }else{
                out.print("Sorry"+username);    // 生成html內容
            }
        }
    }
    上面沒有判斷此時對servlet的請求是post還是get方法,不過沒關係,request這個傳進來的引數以及包含了這些資訊,自己判斷一下執行相應的操作即可

  • 由於頁面路徑已經跳轉到servlet了,但是servlet不是一個.html檔案啊,那豈不是沒有內容供瀏覽器顯示了,不是的,我們看到返回的引數response中的物件PrintWriter out用於動態生成html內容的字串"Hello",所以這時候相當於servlet這個路徑也有了html內容了,瀏覽器的頁面就會顯示上述字串了

  • 二、jsp頁面如何跟後端伺服器互動:

  • jsp網頁檔案就是html內容裡面插入java程式碼,當我們訪問.jsp網頁檔案時候,伺服器提前已經知道這個頁面內含有java程式碼,那麼伺服器這邊就得先執行一下這些程式碼(就跟執行servlet的java原始碼一樣),同時把執行的結果嵌入在當前這個.jsp頁面內,我們看看原始碼:

  • <%@page import="java.util.Date"%>     // 如果這個.jsp頁面中用到了一些java函式,就得匯入庫,這就跟java原始檔一樣的

  • <html>
        <head>
               <title>第一個 JSP 程式</title>
        </head>
        <body>
               <%
                      out.println("Hello World!"); // 這裡實際上是伺服器執行了結果,然後以文字返回給瀏覽器進行顯示
               %>

        </body>
    </html>

  • 上面紅色程式碼就是java程式碼,剛剛說過物件PrintWriter out用於動態生成html內容的字串,所以伺服器執行完嵌入在裡面的java程式碼後,就是動態生成了一串html程式碼,然後一起傳給客戶端瀏覽器進行顯示

  • 當然這種情況.jsp裡面沒有按鈕,表單這樣的控制元件,現在再來看看有表單這種.jsp如何跟後端互動:

  • view.jsp

  • <%@page import="day03_student.Student"%>  // 還是得帶入java用到的庫檔案

  • <style type="text/css">  // 樣式設計部分,即css

  • table{

  • border:1px solid gray;

  • border-collapse:collapse;

  • width:50%

  • }

  • td{

  • border:1px solid gray;

  • }

  • </style>

  • <body>
        <h2>學生個人基本資訊</h2>
       <table>
       <tr>
        <td>編號</td>
        <td>學號</td>
        <td>姓名</td>
        <td>性別</td>
        <td>年齡</td>
        </tr> 
         <tr>
          <%
        Student s=(Student)request.getAttribute("students");  // 
         %>

         <td><%=s.getId()%></td>
         <td><%=s.getStuno()%></td>
         <td><%=s.getName()%></td>
         <td><%=s.getGender()%></td>
         <td><%=s.getAge() %></td>
         </tr>
       </table>
      </body>
    參考的原文:https://blog.csdn.net/myclass1312/article/details/80571867 

  • 這時候如果我們直接訪問這兒view.jsp檔案,應該是沒有資料的,因為物件s無法從request物件獲取,必須得先給這個request物件賦值才行,即應該從如下servlet路徑跳轉來view.jsp檔案路徑才行

  • public class viewservlet extends HttpServlet {
     
        private StudentDao dao=new StudentDao();
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
                    String idstr = request.getParameter("id");
                    int id = Integer.parseInt(idstr);
                    //將資料放入request中,傳遞到頁面
                    Student student=dao.queryById(id);
                    request.setAttribute("students", student);
                    request.getRequestDispatcher("view.jsp").forward(request, response);
        // 這裡是從當前頁面跳轉去哪個頁面,同時傳遞了request, response這兩個引數,這時候的request就是有內容的,接下來的view.jsp頁面就能獲取到內容而且動態生成html內容
        }
        
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doGet(request, response);
            }
    }

總結:每個xx.html檔案,xx.jsp檔案,servlet響應程式...都是需要在客戶端瀏覽器通過URL來訪問的。

xx.jsp檔案,servlet響應程式因為含有java原始碼,需要伺服器電腦先執行一下,.jsp檔案中的java程式碼一般會動態生成一些html內容嵌入在當前.jsp檔案裡面一起給瀏覽器顯示出來;而servlet中的java程式碼一般是資料處理功能的,可能會通過request.getRequestDispatcher("view.jsp").forward(request, response); 

這樣的方式跳轉到其它有html內容的頁面的URL(同時傳遞處理好的資料過去) 來顯示結果。