【JavaWeb】JSP基礎和應用

JSP基礎

JSP簡介

JSP全稱是Java Server Page,它和Servlet同樣,也是sun公司推出的一套開發動態web資源的技術,稱爲JSP/Servlet規範。JSP的本質其實就是一個Servlet。html

JSP和HTML以及Servlet的適用場景

類別 適用場景
HTML 只能開發靜態資源,不能包含java代碼,沒法添加動態數據。
Servlet 寫java代碼,能夠輸出頁面內容,可是很不方便,開發效率極低。
JSP 它包括了HTML的展現技術,同時具有Servlet輸出動態資源的能力。可是不適合做爲控制器來用。

JSP說明

寫在以前: 明確JSP就是一個Servlet。是一個特殊的Servlet。java

JSP的原理:web

1)客戶端提交請求apache

2)Tomcat服務器解析請求地址瀏覽器

3)找到JSP頁面緩存

4)Tomcat將JSP頁面翻譯成Servlet的java文件tomcat

5)將翻譯好的.java文件編譯成.class文件服務器

6)返回到客戶瀏覽器上。session

執行過程分析圖

image

Http服務器調用JSP文件步驟:
1)Http服務器將JSP文件內容編輯爲一個Servlet接口實現類(.java)
2)Http服務器將Servlet接口實現類編譯爲class文件(.class)
3)Http服務器負責建立這個class的實例對象,這個實例對象就是Servlet實例對象
4)Http服務器經過Servlet實例對象調用jspServlet方法,將JSP文件內容寫入響應體mvc

Http服務器編輯與編譯JSP文件位置:
個人計算機下是:
C:\Users\lenovo\.IntelliJIdea2019.3\system\tomcat\Tomcat_9_0_30_javaweb04\work\Catalina\localhost\ROOT\org\apache\jsp

標誌答案:
C:\Users\Windows系統用戶名\.IntelliJIdea2019.3\system\tomcat\網站工做空間\work\Catalina\localhost\ROOT\org\apache\jsp

JSP的.java文件內容分析

當咱們打開index.jsp翻譯的java文件看到的就是public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase類的聲明

image

在Tomcat的源碼中找到HttpJspBase類的聲明,以下圖:

image

這張圖一出場,就代表咱們寫的JSP它本質就是一個HttpServlet了。

JSP它是一個特殊的Servlet,主要是用於展現動態數據。它展現的方式是用流把數據輸出出來,而咱們在使用JSP時,涉及HTML的部分,都與HTML的用法一致,這部分稱爲jsp中的模板元素,在開發過程當中,先寫好這些模板元素,由於它們決定了頁面的外觀。

JSP應用

JSP語法

Java代碼塊

在jsp中,可使用java腳本代碼。形式爲:<% 此處寫java代碼 %>

可是,在實際開發中,極少使用此種形式編寫java代碼。同時須要注意的是:

<%
	在裏面寫java程序腳本須要注意:這裏面的內容由tomcat負責翻譯,翻譯以後是service方法的成員變量
%>

示例:

<!--Java代碼塊-->
<% out.println("這是Java代碼塊");%>
<hr/>

JSP表達式

在jsp中,可使用特定表達式語法,形式爲:<%=表達式%>

jsp在翻譯完後是out.print(表達式內容);

因此:<%out.print("當前時間");%><%="當前時間"%> 是同樣的。

在實際開發中,這種表達式語法用的也不多使用。

示例:

<!--JSP表達式-->
<%="這是JSP表達式"%><br/>
就至關於<br/>
<%out.println("這是沒有JSP表達式輸出的");%>

JSP聲明

在JSP中也能夠聲明一些變量,方法,靜態方法,形式爲:<%! 聲明的內容 %>

使用JSP聲明須要注意:

<%! 
	須要注意的是: 寫在裏面的內容將會被tomcat翻譯成全局的屬性或者類方法。
%>

示例:

<!--JSP聲明-->
<%! String str = "聲明語法格式";%>
<%=str%>

JSP註釋

在使用JSP時,它有本身的註釋,形式爲:<%--註釋--%>

須要注意的是:

​ 在Jsp中可使用html的註釋,可是隻能註釋html元素,不能註釋java程序片斷和表達式。同時,被html註釋部分會參與翻譯,而且會在瀏覽器上顯示

​ jsp的註釋不只能夠註釋java程序片斷,也能夠註釋html元素,而且被jsp註釋的部分不會參與翻譯成.java文件,也不會在瀏覽器上顯示。

示例:

<%--JSP註釋--%>
<!--HTML註釋-->

JSP指令

page指令

language:告知引擎,腳本使用的是java,默認是java,支持java。不寫也行。

extends:告知引擎,JSP對應的Servlet的父類是哪一個,不須要寫,也不須要改。

import:告知引擎,導入哪些包(類)。

注意:引擎會自動導入:java.lang.*,javax.servlet.*,javax.servlet.http.*,javax.servlet.jsp.*

導入的形式:

<%@page import=」java.util.Date,java.util.UUID」%>或者:

<%@page import=」java.util.Date」%>

<%@page import=」java.util.UUID」%>

session:告知引擎是否產生HttpSession對象,便是否在代碼中調用request.getSession()。默認是true。

buffer:JspWriter用於輸出JSP內容到頁面上。告知引擎,設定他的緩存大小。默認8kb。

errorPage:告知引擎,當前頁面出現異常後,應該轉發到哪一個頁面上(路徑寫法:/表明當前應用)

小貼士:當在errorpage上使用了isErrorPage=true以後,ie8有時候不能正常顯示

配置全局錯誤頁面:web.xml

<error-page>    
    <exception-type>java.lang.Exception</exception-type>    			
    <location>/error.jsp</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/404.html</location>
</error-page>

當使用了全局錯誤頁面,就無須再寫errorPage來實現轉到錯誤頁面,而是由服務器負責跳轉到錯誤頁面。

isErrorPage:告知引擎,是否抓住異常。若是該屬性爲true,頁面中就可使用exception對象,打印異常的詳細信息。默認值是false。

contentType:告知引擎,響應正文的MIME類型。contentType="text/html;charset=UTF-8"

​ 至關於response.setContentType("text/html;charset=UTF-8");

pageEncoding:告知引擎,翻譯jsp時(從磁盤上讀取jsp文件)所用的碼錶。pageEncoding="UTF-8"至關於告知引擎用UTF-8讀取JSP

isELIgnored:告知引擎,是否忽略EL表達式,默認值是false,不忽略。

include指令

語法格式:<%@include file="" %> 該指令是包含外部頁面。

屬性:file,以 / 開頭,就表明當前應用。

使用示例

image

靜態包含的特色

image

taglib指令

語法格式:<%taglib uri="" prefix=""%>

做用:該指令用於引入外部標籤庫。html標籤和jsp標籤不用引入。

屬性:

uri:外部標籤的URI地址。

prefix:使用標籤時的前綴。

JSP細節

九大隱式對象

什麼是隱式對象呢?它指的是在jsp中,能夠不聲明就直接使用的對象。它只存在於jsp中,由於java類中的變量必需要先聲明再使用。其實jsp中的隱式對象也並不是是未聲明,只是它是在翻譯成.java文件時聲明的。因此咱們在jsp中能夠直接使用。

隱式對象名稱 類型 備註
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.HttpSession Page指令能夠控制開關
application javax.servlet.ServletContext
page Java.lang.Object 當前jsp對應的servlet引用實例
config javax.servlet.ServletConfig
exception java.lang.Throwable page指令有開關
out javax.servlet.jsp.JspWriter 字符輸出流,至關於printwriter
pageContext javax.servlet.jsp.PageContext 很重要

PageContext對象

簡介

它是JSP獨有的對象,Servlet中沒有這個對象。自己也是一個域(做用範圍)對象,可是它能夠操做其餘3個域對象中的屬性。並且還能夠獲取其餘8個隱式對象。

生命週期

它是一個局部變量,因此它的生命週期隨着JSP的建立而誕生,隨着JSP的結束而消失。每一個JSP頁面都有一個獨立的PageContext。

經常使用方法

image

在上圖中,咱們發現沒有頁面域操做的方法,實際上是定義在了PageContext的父類JspContext中,以下圖所示:

image

四大域對象

域對象名稱 範圍 級別 備註
PageContext 頁面範圍 最小,只能在當前頁面用 因範圍過小,開發中用的不多
ServletRequest 請求範圍 一次請求或當期請求轉發用 當請求轉發以後,再次轉發時請求域丟失
HttpSession 會話範圍 屢次請求數據共享時使用 屢次請求共享數據,但不一樣的客戶端不能共享
ServletContext 應用範圍 最大,整個應用均可以使用 儘可能少用,若是對數據有修改須要作同步處理

MVC模型

Servlet:擅長處理業務邏輯,不擅長輸出顯示界面。在web開發中多用於控制程序邏輯(流程)。因此咱們稱之爲:控制器。

JSP:擅長顯示界面,不擅長處理程序邏輯。在web開發中多用於展現動態界面。因此咱們稱之爲:視圖。

例如: image

M:model ,一般用於封裝數據,封裝的是數據模型。

V:view ,一般用於展現數據。動態展現用jsp頁面,靜態數據展現用html。

C:controller ,一般用於處理請求和響應。通常指的是Servlet。

綜合案例-學生管理系統

登陸功能實現

建立一個web項目,在 web 目錄下建立一個 index.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>學生管理系統首頁</title>
</head>
<body>
    <%--
        獲取會話域中的數據
        若是獲取到了則顯示添加和查看功能的超連接
        若是沒獲取到則顯示登陸功能的超連接
    --%>
    <% Object username = session.getAttribute("username");
        if(username == null) {
    %>
        <a href="/stu/login.jsp">請登陸</a>
    <%} else {%>
        <a href="/stu/addStudent.jsp">添加學生</a>
        <a href="/stu/listStudentServlet">查看學生</a>
    <%}%>
</body>
</html>

在 web 目錄下建立一個 login.jsp。實現登陸頁面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>學生登陸</title>
</head>
<body>
    <form action="/stu/loginStudentServlet" method="get" autocomplete="off">
        姓名:<input type="text" name="username"> <br>
        密碼:<input type="password" name="password"> <br>
        <button type="submit">登陸</button>
    </form>
</body>
</html>

建立 LoginStudentServlet,獲取用戶名和密碼

package com.itheima.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    學生登陸
 */
@WebServlet("/loginStudentServlet")
public class LoginStudentServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.獲取用戶名和密碼
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //2.判斷用戶名
        if(username == null || "".equals(username)) {
            //2.1用戶名爲空 重定向到登陸頁面
            resp.sendRedirect("/stu/login.jsp");
            return;
        }

        //2.2用戶名不爲空 將用戶名存入會話域中
        req.getSession().setAttribute("username",username);

        //3.重定向到首頁index.jsp
        resp.sendRedirect("/stu/index.jsp");
    }

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

添加功能實現

在 web 目錄下建立一個 addStudent.jsp,實現添加學生的表單項

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加學生</title>
</head>
<body>
<form action="/stu/addStudentServlet" method="get" autocomplete="off">
    學生姓名:<input type="text" name="username"> <br>
    學生年齡:<input type="number" name="age"> <br>
    學生成績:<input type="number" name="score"> <br>
    <button type="submit">保存</button>
</form>
</body>
</html>

建立 AddStudentServlet,獲取學生信息並保存到文件中

package com.itheima.servlet;

import com.itheima.bean.Student;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*
    實現添加功能
 */
@WebServlet("/addStudentServlet")
public class AddStudentServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.獲取表單中的數據
        String username = req.getParameter("username");
        String age = req.getParameter("age");
        String score = req.getParameter("score");

        //2.建立學生對象並賦值
        Student stu = new Student();
        stu.setUsername(username);
        stu.setAge(Integer.parseInt(age));
        stu.setScore(Integer.parseInt(score));

        //3.將學生對象的數據保存到d:\\stu.txt文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\stu.txt",true));
        bw.write(stu.getUsername() + "," + stu.getAge() + "," + stu.getScore());
        bw.newLine();
        bw.close();

        //4.經過定時刷新功能響應給瀏覽器
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("添加成功。2秒後自動跳轉到首頁...");
        resp.setHeader("Refresh","2;URL=/stu/index.jsp");
    }

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

查看學生功能

建立 ListStudentServlet,讀取文件中的學生信息到集合中

一、將集合添加到會話域中

二、重定向到 listStudent.jsp 頁面上
package com.itheima.servlet;

import com.itheima.bean.Student;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

/*
    實現查看功能
 */
@WebServlet("/listStudentServlet")
public class ListStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.建立字符輸入流對象,關聯讀取的文件
        BufferedReader br = new BufferedReader(new FileReader("d:\\stu.txt"));

        //2.建立集合對象,用於保存Student對象
        ArrayList<Student> list = new ArrayList<>();

        //3.循環讀取文件中的數據,將數據封裝到Student對象中。再把多個學生對象添加到集合中
        String line;
        while((line = br.readLine()) != null) {
            //張三,23,95
            Student stu = new Student();
            String[] arr = line.split(",");
            stu.setUsername(arr[0]);
            stu.setAge(Integer.parseInt(arr[1]));
            stu.setScore(Integer.parseInt(arr[2]));
            list.add(stu);
        }

        //4.將集合對象存入會話域中
        req.getSession().setAttribute("students",list);

        //5.重定向到學生列表頁面
        resp.sendRedirect("/stu/listStudent.jsp");

    }

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

在 web 目錄下建立一個 listStudent.jsp

<%@ page import="com.itheima.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>查看學生</title>
</head>
<body>
    <table width="600px" border="1px">
        <tr>
            <th>學生姓名</th>
            <th>學生年齡</th>
            <th>學生成績</th>
        </tr>
        <% ArrayList<Student> students = (ArrayList<Student>) session.getAttribute("students");
            for(Student stu : students) {
        %>
            <tr align="center">
                <td><%=stu.getUsername()%></td>
                <td><%=stu.getAge()%></td>
                <td><%=stu.getScore()%></td>
            </tr>
        <%}%>
    </table>
</body>
</html>
相關文章
相關標籤/搜索