1. 程式人生 > >jsp(Java server page)

jsp(Java server page)

1. jsp

java server page
用途:主要用來生成html標籤

在表現形式上類似於html 但多了一行

<%@ page contentType="text/html;charset=utf-8" %>

上面的程式碼稱為 page 指令,主要作用就是指明此頁面是一個jsp頁面,並且通過contentType說明他的字元編碼和格式
jsp 中有
1. 指令: <%@ 指令名 %>
2. 指令碼: <% 可以是任意java程式碼 %>
3. 表示式: <%= 表示式 %> 把執行結果顯示在頁面上

## 2. EL表示式語言 expression language 在jsp用來展示結果的語言 語法 `${ 表示式語言 }` 要用el表示式顯示覆雜的內容,需要把內容提前放入`作用域`, el再從`作用域`中把內容取出來顯示
</head
>
<body> <% `<% pageContext.setAttribute("number" ,1000);%> %> ${number} </body> </html> ....
## 3. JSTL java 標準標籤庫 java standard tag library 主要的工具就是配合el表示式,實現迴圈,條件判斷等功能 前提: 加入jstl-1.2的jar包 匯入標籤庫

3.1 forEach

<c:forEach items="要遍歷的集合" var="臨時變數名" begin="起始數字"
end="結束數字"> ${臨時變數名} </c:forEach>

要遍歷的集合 必須使用${} 從作用域獲取

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="a" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    ArrayList<Object>  list = new
ArrayList<>(); list.add("專案1"); list.add("專案2"); list.add("專案3"); list.add("專案4"); pageContext.setAttribute("c1" ,list); %>
<ul> <a:forEach items="${c1}" var="i"> <li>${i}</li> </a:forEach> </ul> <a:forEach begin="1" end="10" var="i"> <input type="button" value="${i}"> </a:forEach> <a:forEach begin="1" end="10" var="i"> <a href="#" > ${i}</a> </a:forEach> </body> </html>

3.2 if

<c:if test="布林條件">內容</c:if>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="a" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    ArrayList<Object>  list = new ArrayList<>();
    list.add("專案1");
    list.add("專案2");
    list.add("專案3");
    list.add("專案4");
    pageContext.setAttribute("c1" ,list);
    %>
    <a:if test="${c1.size()==4}">
<ul>
    <a:forEach items="${c1}" var="i">
        <li>${i}</li>
        </a:forEach>
</ul>
 </a:if>
</body>
</html>

3.3 choose 類似於 if elseif else

語法:

<a:choose>
  <a:when test="條件1">內容1</a:when>
  <a:when test="條件2">內容2</a:when>
  ...
  <a:when test="條件n">內容n</a:when>
  <a:otherwise>以上條件都不成立時</a:otherwise>
</a:choose>
 req.setAttribute("salary", 8000.00);
<a:choose>
    <a:when test="${salary < 2000}">低收入</a:when>
    <a:when test="${salary >=2000 and salary <=5000}">中等收入</a:when>
    <%--<c:when test="${salary > 5000}">高收入</a:when>--%>
    <a:otherwise>高收入</c:otherwise>
</c:choose>

3.4 out 用來輸出特殊內容

它可以對${}輸出的內容進行控制,可以控制是否忽略html程式碼

req.setAttribute("text", "<span style='color:red;font-size:4em;'>文字</span>");
<a:out escapeXML="true" value="${作用域變數}"> 忽略html,(當做普通文字, 原樣輸出)
<a:out value="${text}" escapeXml="false"></a:out>(解析後輸出)

3.5 fmt:formatDate(格式化日期)與fmt:formatNumber(格式化數字)(屬於<%@ taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt” %>標籤庫)

req.setAttribute("birthday", new Date());
req.setAttribute("number", 3333.45556666);
<fmt:formatDate value="${birthday}" pattern="yyyy-MM-dd HH:mm:ss.SSS"></fmt:formatDate>
<fmt:formatDate value="${birthday}" pattern="yyyy年MM月dd日"></fmt:formatDate>
<hr>
<fmt:formatNumber value="${number}" pattern="###,###.###"></fmt:formatNumber>
<fmt:formatNumber value="${number}" pattern="000,000.###"></fmt:formatNumber>

4. MVC 思想

Model 模型 ==> 資料(例如從資料庫查詢出來的list集合, 裡面包含java物件)
View 檢視 ==> 資料的展現形式 (jsp就是一種檢視技術)
Controller 控制器 ==> 把模型和檢視聯絡起來 (servlet 充當控制器作用)

由servlet器查詢資料,把資料放入作用域,跳轉至jsp檢視
jsp檢視從作用域中獲取資料,並展示
查詢為例:開發流程
Servlet: 執行查詢

 public void service(HttpServletRequest request, HttpServletResponse response) {
    // 1) jdbc 程式碼,連線資料庫,執行sql,查詢結果
        // 2) 存入作用域
    request.setAttribute("變數名", 查詢結果);

    // 3) 由servlet跳轉至jsp                    轉發
    request.getRequestDispatcher("目標jsp路徑").forward(request, response);
}

jsp: 顯示結果
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 4) 利用jstl標籤和el表示式技術顯示結果 -->
<c:if test="條件"></c:if>
<c:forEach items="${變數名}" var="臨時變數名">  ${臨時變數名} </c:forEach>

注意: 伺服器常見的錯誤型別
500 Internal Server Error 伺服器內部錯誤,由於應用程式自己沒有正確處理異常,異常拋給了tomcat,這時就會出現500
404 Not Found 資源未找到錯誤,發生於要訪問的資源不存在(資源可能是servlet, jsp, html)
405 Method Not Allowed 方法不支援,
當沒有覆蓋doGet但傳送了get請求時
當沒有覆蓋doPost但傳送了post請求時
200 OK 表示這次請求正常,沒有錯誤
304 這個檔案沒有修改,請瀏覽器使用上一次快取的檔案
這些數字稱為響應狀態碼

5. 如何接收各種不同表單引數

<form action="/s1" method="post">
    <!-- name 是引數名 -->
    <input type="date" name="birthday" value="2018-09-15">
    <hr><!-- MALE  FEMALE -->
    <input type="radio" name="sex" value="男" checked><input type="radio" name="sex" value="女">

    <hr>
    唱歌<input type="checkbox" name="hobby" value="1">
    跳舞<input type="checkbox" name="hobby" value="2">
    睡覺<input type="checkbox" name="hobby" value="3">
    玩遊戲<input type="checkbox" name="hobby" value="4">

    <hr>
    <!-- option 標籤如果不提供 value屬性, 把標籤之間的文本當成value
         如果提供了value屬性,以value為準
    -->
    <select name="city">
        <option>北京</option>
        <option>天津</option>
        <option value="shanghai">上海</option>
        <option>武漢</option>
    </select>

    <hr>
    個人簡介:
    <textarea name="intro" cols="30" rows="10"></textarea>
    <input type="submit" value="提交">
</form>
@WebServlet(urlPatterns = "/s1")
public class Servlet1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 處理漢字亂碼
        req.setCharacterEncoding("utf-8");

        // 1) 日期型別的接收,需要注意轉換字串為java中的Date型別
        String birthday = req.getParameter("birthday");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(birthday);
            System.out.println(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        // 2) 處理單選按鈕
        String sex = req.getParameter("sex");
        System.out.println(sex);

        // 3) 處理複選框, 注意處理null值(都沒有勾選時,就是null值)
        String[] hobbies = req.getParameterValues("hobby");
//        System.out.println(Arrays.toString(hobbies));
        if(hobbies != null) {
            for (String hobby : hobbies) {
                System.out.println(hobby);
            }
        }

        // 4)處理下拉列表
        String city = req.getParameter("city");
        System.out.println(city);

        // 5)處理文字域
        String intro = req.getParameter("intro");
        System.out.println(intro);
    }
}

6 jsp 語法

6.1 jsp的指令碼

<%
    任意java程式碼
%>

jsp的弊端在於當代碼越來越多時,使用jsp指令碼的方式,會造成專案程式碼難以維護
現在絕大多數公司都禁止在jsp出現指令碼程式碼

6.2 jsp表示式 <%= 表示式 %>


  <%
        Connection conn = Utils.getConnection();
        PreparedStatement stmt = conn.prepareStatement("select * from dept");
        ResultSet rs = stmt.executeQuery();
        while(rs.next()) {
           System.out.println(rs.getInt("deptno") + " " +rs.getString("dname") +" "+rs.getString("loc"));
           out.println(rs.getInt("deptno") + " " +rs.getString("dname") +" "+rs.getString("loc")+"<br>");
    %>
    <%= rs.getString("dname") %> 
     <br/>
    <%
        }
        rs.close();
        stmt.close();
        conn.close();
    %>

作用是向頁面顯示值, 表示式不能以;結束

6.3 jsp指令(**)

<%@ page contentType="頁面的內容型別和編碼" 
    import="要匯入的java類"
    isELIgnored="是否忽略EL表示式的處理" 
    errorPage="出現錯誤時,要跳轉的頁面"
    isErrorPage="用在錯誤頁面上,取值為true表示是錯誤頁面,這時候才能在頁面中使用exception變數"
    %>
<%@ include file="另一個jsp頁面" %>

作用,重用頁面上的一些標籤和程式碼

3.4 jsp宣告

<%! 
    可以宣告變數和方法
%>

jsp的原理:

jsp 要工作,也必須編譯為java類

public class 類名 extends HttpJspBase{ // HttpJspBase 又是繼承了HttpServlet

    public int i = 100;

    public int sum(int a, int b) {
        return a+b;
    }

    public void _jspService(HttpServletRequest request,
        HttpServletResponse response) {
        int i = 10;

        out.println(i++);
    }
}

1) 當首次訪問此jsp時,tomcat會把jsp轉譯為*.java的類(間接繼承自HttpServlet)
2) 再把.java類編譯為.class位元組碼
3) 把載入到虛擬機器執行,生命週期類似於servlet的生命週期

jsp的本質仍是一個servlet

        int i = 100; //  在宣告部分的i變數, 是例項變數(優先順序低於區域性變數)

        public int sum(int a , int b) {
            return a +b;
        }
  %>
  <%
        int i = 10; //  在指令碼部分的i變數, 是一個區域性變數
  %>
  <%
     out.print(i);
   %>
  <%= i++ %> <!-- 如果是宣告中的i,每次請求會不斷增長(100,101,102...), 如果是指令碼中的i,每次重置為初始的10 -->

3.5 9大隱式物件

無需宣告即可使用。

request 代表請求物件(可以獲取請求引數,將變數存入request作用域)
response 代表響應物件(返回響應)
out 代表響應的字元輸出流
pageContext 頁面上下文物件,可以間接獲得request等物件,並可以將變數存入page作用域

config jsp的配置資訊
page 當前jsp物件(this)
exception 代表的是異常資訊(當頁面isErrorPage=”true”時有效)

session 變數作用範圍是一次會話內有效
application 變數作用範圍是整個應用程式有效

page作用域: 變數作用範圍僅限於當前頁面
request作用域: 變數的作用範圍在一次請求內有效,跳轉到其他頁面依然有效

  5.jsp
   <%
    // 向page作用域存入變數
       pageContext.setAttribute("a", "hello world");
      request.setAttribute("b", "ok");
    %>
      <%
       // 從page作用域獲取變數
        Object str = pageContext.getAttribute("a");
       out.print(str);
        %>
  <%
    // 請求轉發
    request.getRequestDispatcher("6.jsp").forward(request, response);
%>


     6.jsp
 <%
// 從page作用域獲取變數
Object str = pageContext.getAttribute("a");
out.print(str);
Object b = request.getAttribute("b");
out.println(b);
%>