Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 免费一极毛片,美女啪啪国产,亚洲国产精品久久久久网站

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          曾經(jīng)風(fēng)光無(wú)限的 JSP,為什么現(xiàn)在很少有人使用了?

          源 | 愚公要移山(ID:fdd_sxu_nwpu)

          jsp技術(shù)作為曾經(jīng)一度火爆的技術(shù),在最近幾年確實(shí)使用率越來(lái)越低了,這篇文章帶你一塊探究一下jsp的從生到死。

          jsp技術(shù)的誕生

          在很久很久以前,那時(shí)候我們的開發(fā)都是通過(guò)servlet來(lái)完成的,這個(gè)servlet是什么呢?我們先來(lái)認(rèn)識(shí)一下:

          servlet用Java語(yǔ)言編寫的服務(wù)器端程序。主要功能是和瀏覽器進(jìn)行交互,生成頁(yè)面展示。

          長(zhǎng)下面這個(gè)樣子:

          public class HelloWorld extends HttpServlet {  public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  response.setContentType("text/html");  PrintWriter out = response.getWriter;  out.println("<html>");  out.println("<head>");  out.println("<title>Hello World</title>");  out.println("</head>");  out.println("<body>");  out.println("<h1>Hello World!</h1>");  out.println("</body>");  out.println("</html>");  }  }

          我們可以看到前端所展示的頁(yè)面,需要我們servlet去一個(gè)標(biāo)簽一個(gè)標(biāo)簽去生成,如果一個(gè)頁(yè)面超級(jí)復(fù)雜,動(dòng)不動(dòng)幾千行代碼,那這個(gè)servlet效率也就太低了。而且整個(gè)servlet代碼也會(huì)十分臃腫而且可讀性非常差。

          這時(shí)候怎么辦呢?sun公司很早就意識(shí)到了這個(gè)問(wèn)題,于是便倡導(dǎo)很多公司一塊來(lái)創(chuàng)建了一種能夠動(dòng)態(tài)生成html的新技術(shù),不久之后jsp便誕生了。有效率的解決了上面servlet所出現(xiàn)的問(wèn)題。

          jsp的發(fā)展

          既然jsp技術(shù)能夠解決剛剛servlet代碼里面所出現(xiàn)的技術(shù),我們來(lái)看一下是如何解決的:在這里我們舉一個(gè)小例子,就是前端jsp向服務(wù)器servlet發(fā)送請(qǐng)求圖書頁(yè)面的功能。

          首先我們看一下servlet:

          public class List_book extends HttpServlet {  public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  //聲明一個(gè)ArrayList.用來(lái)存放Book類中的數(shù)據(jù)  ArrayList<Book> list = new ArrayList<Book>;  for(int i=0;i<10;i++){ Book book = new Book;  book.setName(res.getString("name"+i));  book.setAuthor(res.getString("author"+i));  list.add(book);  } //將list數(shù)據(jù)發(fā)送到.jap文件中  request.getRequestDispatcher("ListBook.jsp").forward(request, response);  } }

          我們會(huì)發(fā)現(xiàn),現(xiàn)在的servlet沒(méi)有一點(diǎn)html代碼了。我們只需要把數(shù)據(jù)交給jsp。此時(shí)我們的頁(yè)面展示就交給jsp來(lái)做了。現(xiàn)在我們來(lái)看一下jsp長(zhǎng)什么樣子:

          <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath;%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="description" content="This is my page"> <script></script>  </head>  <body>  <% ArrayList list = (ArrayList) request.getAttribute("list"); %>  <h2 align = "center">圖書列表</h2>  <table border = 1px align = "center">  <tr><th>圖書名稱</th><th>圖書作者</th></tr>  <!-- 繼續(xù)使用jsp語(yǔ)句 循環(huán)放入存放于list中的Book實(shí)體類中的數(shù)據(jù) -->  <%  for(int i = 0;i<list.size;i++){  Book book =(Book)  list.get(i);%>  <tr><th><%=book.getName %></th><th><%=book.getAuthor%></th><tr> } %> </table>  </body> </html>

          這就是jsp,我們可以在html頁(yè)面中寫一些java代碼。對(duì)于我們程序員來(lái)說(shuō),在開發(fā)當(dāng)中靜態(tài)的頁(yè)面我們只需要用html和css寫一些標(biāo)簽來(lái)展示即可,對(duì)于那些動(dòng)態(tài)的部分我們就可以使用java代碼。

          那么jsp和servlet是不是就是這種協(xié)作的關(guān)系,本質(zhì)上有什么區(qū)別呢?

          其實(shí)jsp只是servlet的一種特殊形式,每一個(gè)jsp頁(yè)面就是一個(gè)servlet實(shí)例,通俗一點(diǎn)的話來(lái)說(shuō):jsp就是servlet,只不過(guò)servlet把一些業(yè)務(wù)功能剝離開來(lái)交給了或者是形成了jsp。明白了吧。在我們的項(xiàng)目編譯的時(shí)候就是把jsp編譯成了servlet。

          你們會(huì)發(fā)現(xiàn),這樣做其實(shí)挺好的,市場(chǎng)也驗(yàn)證了一切,很快jsp技術(shù)流行開來(lái),可是隨著時(shí)間的流逝,業(yè)務(wù)越來(lái)越復(fù)雜,jsp也開始跟不上時(shí)代了。

          jsp的危機(jī)

          我們先看一個(gè)對(duì)話場(chǎng)景:

          java程序員:終于寫完了功能,是時(shí)候在界面上展示了。

          前端程序員:你功能寫完了,我沒(méi)有數(shù)據(jù),在頁(yè)面什么沒(méi)法展示呀

          java程序員:數(shù)據(jù)我寫好了,你在jsp中調(diào)用XX方法就能獲取了,

          前端程序員:我已經(jīng)在jsp中寫好了這個(gè)方法,你為什么自己寫了?

          于是乎,無(wú)窮無(wú)盡的爭(zhēng)吵還在繼續(xù)當(dāng)中。

          這就是jsp的弊端,為什么呢?我們可以來(lái)總結(jié)一下:

          (1)動(dòng)態(tài)和靜態(tài)資源放在一起,一旦服務(wù)器出現(xiàn)狀況,前后臺(tái)一起玩完,用戶體驗(yàn)極差。

          (2)一旦jsp出現(xiàn)了問(wèn)題,就需要前端后端發(fā)開人員一塊來(lái)分析解決,效率低。

          (3)jsp無(wú)法使用nginx等。

          (4)jsp頁(yè)面復(fù)雜,難以修改。

          (5)第一次加載jsp需要編譯成servlet,時(shí)間久,而且業(yè)務(wù)量大的時(shí)候,jsp負(fù)擔(dān)太大。

          (6)jsp對(duì)于開發(fā)人員簡(jiǎn)直就是一個(gè)揮之不去的痛,太難了!!!

          鑒于以上缺點(diǎn),于是另外一套機(jī)制橫空出世了,這就是前后端分離。什么是前后端分離呢?

          前后端分離其實(shí)就是后端工程師只關(guān)注于后端頁(yè)面的開發(fā),不再處理前端問(wèn)題。前端工程師只關(guān)注于自己的頁(yè)面開發(fā)。需要數(shù)據(jù)交互的時(shí)候,兩者會(huì)有一份接口文檔。

          就這樣這種思想架構(gòu)很快的流行開來(lái),這也就是為什么jsp落寞的真正原因。從此java從jsp轉(zhuǎn)向了restful結(jié)構(gòu),springMCV也開始流行開來(lái),并逐漸占領(lǐng)了市場(chǎng)。前后端分離有什么優(yōu)點(diǎn)呢?我們來(lái)總結(jié)一下:

          (1)動(dòng)態(tài)和靜態(tài)資源分開存儲(chǔ)。

          (2)出現(xiàn)bug能很快定位是前端還是后端。

          (3)支持nginx。在高并發(fā)狀態(tài)下極其優(yōu)秀。

          (4)直接請(qǐng)求頁(yè)面,不用編譯,速度效率都提上來(lái)了。

          (5)從此前端和后端是相親相愛的一家人了!!!!

          jsp的落幕

          又隨著時(shí)間的推移,jsp的時(shí)代基本上一去不復(fù)返了,因?yàn)槲覀冇肿呷肓艘苿?dòng)互聯(lián)時(shí)代,這時(shí)候的客戶端可不是前端頁(yè)面了,還包括手機(jī)、汽車、電視等等各種設(shè)備,這種情況下,前后端必須要分離了。jsp基本上徹底告別了它的舞臺(tái)。

          servlet是sun推出的用于實(shí)現(xiàn)CGI(通用網(wǎng)關(guān)接口)的Java語(yǔ)音版本,他不但有跨平臺(tái)的特性,而且還以多線程的方式為用戶提供服務(wù),而不必為每個(gè)請(qǐng)求都啟動(dòng)一個(gè)進(jìn)程,因此它的效率要比傳統(tǒng)的CGI程序高很多。
          從結(jié)構(gòu)上講,一個(gè)Wb應(yīng)用分為3層數(shù)據(jù)層,應(yīng)用層、表現(xiàn)層。數(shù)據(jù)層負(fù)責(zé)數(shù)據(jù)的存取,應(yīng)用層
          用來(lái)處理業(yè)務(wù)邏輯,表現(xiàn)層則用來(lái)向用戶提供操作界面,輸出應(yīng)用層的處理結(jié)果和向應(yīng)用層傳遞用戶的
          操作信息。
          Servlet用在應(yīng)用層,其作用是很強(qiáng)大的,但是如果將它用在表現(xiàn)層將會(huì)非常不方便,因?yàn)?Servlet和傳統(tǒng)的CG1一樣也是以輸出HTML語(yǔ)言來(lái)實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)的,如果全部使用Java程序來(lái)輸出所有靜態(tài)和動(dòng)態(tài)信息,那代碼量將是十分龐大的,這勢(shì)必會(huì)給開發(fā)和維護(hù)帶來(lái)沉重的負(fù)擔(dān)。然而,JSP就是用來(lái)解決表現(xiàn)層的問(wèn)題。
          JSP和 Microsoft的ASP類似,它把JSP標(biāo)簽嵌入到HTML格式的網(wǎng)頁(yè)中,這樣一來(lái),網(wǎng)頁(yè)仍然可
          以很方便地用可視化軟件進(jìn)行編輯美化,JSP程序只需要關(guān)心網(wǎng)頁(yè)中的動(dòng)態(tài)部分,并使用相關(guān)的標(biāo)簽語(yǔ)句輸出即可。
          因?yàn)镴SP就是主要為表現(xiàn)層而設(shè)計(jì)的,所以讀者在編寫JSP程序時(shí)一定要注意,應(yīng)把業(yè)務(wù)相關(guān)的代
          碼要寫在 Javabean中,而不要直接寫在JP頁(yè)面中。
          實(shí)際上, Servlet只是繼承了 Httpservlet的Java類,而JSP最終會(huì)被 Servlet引擎翻譯成 Servlet并編譯執(zhí)行,JSP的存在主要是為了方便表現(xiàn)層。此外,不同的 Servlet引擎處理相關(guān)的JSP代碼的方式可能會(huì)不一樣,但處理的結(jié)果都是Java代碼。

          sp

          page指令

          使用此屬性,可以定義一個(gè)jsp頁(yè)面的相關(guān)屬性


          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          

          設(shè)置該頁(yè)面的類型為text/html類型,其中編碼為Unicode 類型的UTF-8 語(yǔ)言為java

          從Tomcat安裝目錄中可以找到可以使用的MIME類型


          <mime-mapping>
           <extension>ait</extension>
           <mime-type>application/vnd.dvb.ait</mime-type>
          </mime-mapping>
          


          錯(cuò)誤頁(yè)設(shè)置

          設(shè)置page指令的errorPage屬性,設(shè)置錯(cuò)誤頁(yè)


          <%--
           Created by IntelliJ IDEA.
           User: ming
           Date: 19-3-6
           Time: 下午9:29
           To change this template use File | Settings | File Templates.
          --%>
          <%@ page contentType="application/vnd.dvb.ait;charset=UTF-8" language="java" %>
          <%@ page errorPage="error.jsp" %>
          <html>
           <head>
           <title>$Title$</title>
           </head>
           <body>
           <%
           // 運(yùn)行錯(cuò)誤
           int result = 10 / 0;
           %>
           </body>
          </html>
          


          設(shè)置如果出現(xiàn)錯(cuò)誤,跳轉(zhuǎn)到error.jsp文件

          > 錯(cuò)誤頁(yè)的跳轉(zhuǎn)屬于服務(wù)器端跳轉(zhuǎn)

          數(shù)據(jù)庫(kù)連接操作

          maven安裝驅(qū)動(dòng)

          訪問(wèn)網(wǎng)址


          https://search.maven.org/artifact/mysql/mysql-connector-java/8.0.15/jar
          


          輸入依賴


          <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.15</version>
          </dependency>
          


          jsp書寫代碼,并網(wǎng)頁(yè)展示



          <%@ page import="java.sql.*" %>
          <html>
          <body>
          <h2>Hello World!</h2>
          <%!
           // 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序
           public static final String DBDRIVER = "com.mysql.cj.jdbc.Driver";
           // 數(shù)據(jù)庫(kù)連接地址
           public static final String DBURL = "jdbc:mysql://47.94.95.84:32786/test";
           // 用戶名
           public static final String DBUSER = "root";
           // 密碼
           public static final String DBPASS = "ABCcba20170607";
          %>
          <%
           // 聲明數(shù)據(jù)庫(kù)連接對(duì)象
           Connection connection = null;
           // 連接
           PreparedStatement preparedStatement = null;
           // 結(jié)果集
           ResultSet resultSet = null;
           String sql = "SELECT * from emp";
          %>
          <%
           try{
           Class.forName(DBDRIVER);
           // 數(shù)據(jù)庫(kù)連接
           connection = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
           // 實(shí)例化sql
           preparedStatement = connection.prepareStatement(sql);
           // 查詢
           resultSet = preparedStatement.executeQuery();
           while(resultSet.next()){
           int empon = resultSet.getInt(1);
           String ename = resultSet.getString(2);
           String job = resultSet.getString(3);
           %>
           <%=empon%>
           <%=ename%>
           <%=job%>
           <%
           }
           }catch (Exception e){
           System.out.println(e);
           }finally {
           resultSet.close();
           preparedStatement.close();
           connection.close();
           }
          %>
          </body>
          </html>
          


          包含指令

          網(wǎng)頁(yè)分為頭尾中

          靜態(tài)包含

          在jsp編譯的時(shí)候插入一個(gè)包含文本或代碼的文件。包含過(guò)程為靜態(tài)的,代碼文件包含,生成一個(gè)完整的jsp文件,再次包含生成class文件,加載進(jìn)入容器。


          <html>
          <body>
           <%@include file="info.html"%>
           <%@include file="info.inc"%>
          </body>
          </html>
          


          動(dòng)態(tài)包含



          <%--
           Created by IntelliJ IDEA.
           User: ming
           Date: 19-3-9
           Time: 下午3:43
           To change this template use File | Settings | File Templates.
          --%>
          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          參數(shù)1<%=request.getParameter("name")%>
          參數(shù)2<%=request.getParameter("info")%>
          



          <%--
           Created by IntelliJ IDEA.
           User: ming
           Date: 19-3-9
           Time: 下午4:51
           To change this template use File | Settings | File Templates.
          --%>
          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
          <head>
           <title>Title</title>
          </head>
          <body>
           <%
           String username = "LiHua";
           %>
           <h1>動(dòng)態(tài)傳遞參數(shù)</h1>
           <jsp:include page="./receive_param.jsp">
           <jsp:param name="name" value="<%=username%>"/>
           <jsp:param name="info" value="ming"/>
           </jsp:include>
          </body>
          </html>
          


          運(yùn)行以后可以發(fā)現(xiàn)顯示出結(jié)果

          > 兩種包含,靜態(tài)包含是先包含,后處理,動(dòng)態(tài)包含為先處理后包含

          跳轉(zhuǎn)指令

          此跳轉(zhuǎn)為服務(wù)端跳轉(zhuǎn)

          即一個(gè)request傳遞到另外一個(gè)page


          <%--
           Created by IntelliJ IDEA.
           User: ming
           Date: 19-3-9
           Time: 下午5:14
           To change this template use File | Settings | File Templates.
          --%>
          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <h1>這是跳轉(zhuǎn)后的頁(yè)面</h1>
          <h2><%=request.getParameter("name")%></h2>
          <h2><%=request.getParameter("info")%></h2>
          

          <%--
           Created by IntelliJ IDEA.
           User: ming
           Date: 19-3-9
           Time: 下午5:11
           To change this template use File | Settings | File Templates.
          --%>
          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%
           String username = "LiHua";
          %>
          <jsp:forward page="forward_demo02.jsp">
           <jsp:param name="name" value="<%=username%>"/>
           <jsp:param name="info" value="ming"/>
          </jsp:forward>
          

          jsp 實(shí)栗 jsp + jdbc 實(shí)現(xiàn)登錄


          實(shí)現(xiàn)思路

          一個(gè)表單頁(yè),輸入用戶登錄和密碼,然后信息提交到j(luò)sp頁(yè)面進(jìn)行驗(yàn)證,如果可以服務(wù)器跳轉(zhuǎn)到登錄成功頁(yè),失敗,跳轉(zhuǎn)到錯(cuò)誤頁(yè)

          > 跳轉(zhuǎn)的時(shí)候窗口的URL地址會(huì)發(fā)生變化

          代碼如下

          編寫登錄代碼

          登錄



          <!DOCTYPE html>
          <html lang="zh_CN">
          <head>
           <meta charset="UTF-8">
           <title>登錄</title>
          </head>
          <body>
           <h1>登錄操作</h1>
           <form action="login_check.jsp" method="post">
           <h1>用戶登錄</h1>
           <p>
           登錄id
           <input type="text" name="id"/>
           </p>
           <p>
           登錄密碼
           <input type="password" name="password"/>
           </p>
           <input type="submit" value="登錄"/>
           <input type="reset" value="重置"/>
           </form>
          </body>
          </html>
          


          登錄處理



          <%@ page import="java.sql.*" %>
          <%--
           Created by IntelliJ IDEA.
           User: ming
           Date: 19-3-9
           Time: 下午5:50
           To change this template use File | Settings | File Templates.
          --%>
          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
          <head>
           <title>Title</title>
          </head>
          <body>
          <%!
           // 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序
           public static final String DBDRIVER = "com.mysql.cj.jdbc.Driver";
           // 數(shù)據(jù)庫(kù)連接地址
           public static final String DBURL = "jdbc:mysql://47.94.95.84:32786/test";
           // 用戶名
           public static final String DBUSER = "root";
           // 密碼
           public static final String DBPASS = "ABCcba20170607";
          %>
          <%
           // 連接對(duì)象
           Connection connection = null;
           // 操作
           PreparedStatement preparedStatement = null;
           // 結(jié)果
           ResultSet resultSet = null;
           // 標(biāo)志位
           boolean falge = false;
           // 用戶真實(shí)姓名
           String name = null;
          %>
          <%
           try{
           Class.forName(DBDRIVER);
           // 獲得連接
           connection = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
           // 編寫sql驗(yàn)證ID 密碼
           String sql = "SELECT name FROM user WHERE userid = ? AND password = ?";
           // 實(shí)例化操作對(duì)象
           preparedStatement = connection.prepareStatement(sql);
           // 設(shè)置查詢內(nèi)容
           preparedStatement.setString(1, request.getParameter("id"));
           preparedStatement.setString(2, request.getParameter("password"));
           // 執(zhí)行查詢
           resultSet = preparedStatement.executeQuery();
           // 如果可以查詢到,表示合法用戶
           if(resultSet.next()){
           name = resultSet.getString(1);
           // 修改標(biāo)志位
           falge = true;
           }
           }catch (Exception e){
           e.printStackTrace();
           }finally {
           try{
           resultSet.close();
           preparedStatement.close();
           connection.close();
           }catch (Exception e){
           e.printStackTrace();
           }
           }
          %>
          <%
           // 登錄成功
           if(falge){
           // 進(jìn)行服務(wù)器端跳轉(zhuǎn)
          %>
           <jsp:forward page="./login_sucess.jsp">
           <jsp:param name="uname" value="<%=name%>"/>
           </jsp:forward>
          <%
           }else{
          %>
           <jsp:forward page="./login_failure.html"/>
          <% 
           }
          %>
          </body>
          </html>
          


          登錄完成



          <%--
           Created by IntelliJ IDEA.
           User: ming
           Date: 19-3-9
           Time: 下午10:22
           To change this template use File | Settings | File Templates.
          --%>
          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <html>
          <head>
           <title>Title</title>
          </head>
          <body>
          <h1>登錄成功</h1>
          <%=request.getParameter("uname")%>
          </body>
          </html>
          


          登錄失敗



          <%-- Created by IntelliJ IDEA. User: ming Date: 19-3-9 Time: 下午10:22 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body><h1>登錄成功</h1><%=request.getParameter("uname")%></body></html>
          


          效果演示


          主站蜘蛛池模板: 日本在线观看一区二区三区| 亚洲av日韩综合一区久热| 韩国精品一区视频在线播放| 国产一区麻豆剧传媒果冻精品| 久久精品成人一区二区三区| 香蕉久久一区二区不卡无毒影院| 福利片福利一区二区三区| 国产亚洲综合一区二区三区| 日韩一区二区三区射精| 亚洲日韩AV一区二区三区中文| 国产91大片精品一区在线观看| 色偷偷久久一区二区三区| 国产精品熟女一区二区| 久久久精品一区二区三区| 久久精品国产一区| 性无码免费一区二区三区在线 | 九九无码人妻一区二区三区| 91精品国产一区| 国产精品视频一区二区三区经 | 上原亚衣一区二区在线观看| 亚洲国产综合无码一区二区二三区| 国产主播一区二区三区| 变态调教一区二区三区| 中文字幕在线观看一区二区三区| 亚洲一区精品伊人久久伊人| 国产剧情国产精品一区| 日韩免费无码一区二区三区 | 国产一区二区久久久| 亚洲av乱码中文一区二区三区| 国产精品久久久久久一区二区三区| 亚洲AV无码国产精品永久一区| 韩国精品一区视频在线播放| 一区二区三区91| 无码毛片视频一区二区本码 | 任你躁国语自产一区在| 亚洲国产精品无码第一区二区三区| 精品日韩一区二区| 国产成人精品无码一区二区三区 | 动漫精品一区二区三区3d| 中文字幕一区精品| 亚洲乱色熟女一区二区三区蜜臀|