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);
}
}