1. 程式人生 > >Servlet + JSP

Servlet + JSP

 

Servlet

是伺服器端執行的java小程式,起到一個橋樑的作用,用於瀏覽器和應用程式之間進行溝通。

1. 常見的java伺服器

tomcat(FREE apache)
jetty(FREE eclipse)
jboss (jboss)
weblogic (bea, oracle)
websphere (ibm)

 

2. 常用的伺服器tomcat

目錄結構
bin 可執行指令碼目錄
conf 配置檔案目錄 預設埠8080, server.xml 搜尋8080 然後修改
logs 日誌目錄
webapps 應用程式目錄

 

3. 啟動和停止

前提條件: 1. 要安裝jdk, 2. 要配置JAVA_HOME 環境變數

啟動: bin/startup.bat (windows下)
停止: bin/shutdown.bat (windows下)
或者
在啟動的黑視窗下 CTRL+C (停止程式,不是拷貝)

可以用瀏覽器檢查它是否真正啟動:
在瀏覽器位址列輸入 http://localhost:8080 當埠號為80時可以省略不寫

 

4. 修改埠號

在conf/server.xml 檔案中搜索8080 找到後修改為其它埠號即可

 

5. 在idea 裡配置tomcat

 5.1  點選Run/Debug Configuration選單:

                 按圖中步驟依次選擇DefaultsTomcat Server(Local)ConfigurationTomcat Home                                                                    在Tomcat Home

中選中Tomcat的解壓目錄即可

                    

 

                    

5.2  再點選左上角+號新增本專案的Tomcat 執行

      以後用Shift+Alt+F10彈出選單中選擇要執行配置即可

                    

    

6. 編寫第一個servlet

6.1首先新建一個 java Enterprise 專案 點選 Web Applicaton,next

 

6.2 編寫一個Servlet

/**
 * 1. 繼承 HttpServlet父類
 * 2. 使用註解 @WebServlet(urlPatterns = "瀏覽器訪問路徑")
 * 3. 覆蓋父類中  service 方法
 */
@WebServlet(urlPatterns = "/hello")
public class MyServlet extends HttpServlet {

    @Override
    // Request : 代表請求
    // Response : 代表響應
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("你好,世界");
        // 用servlet可以返回一段html程式碼,給瀏覽器

        // 對於中文,需要設定響應採用utf-8字符集,否則會使用英文字符集(iso-8859-1)返回響應,會有亂碼問題
        resp.setContentType("text/html;charset=utf-8");

        // 向resp物件物件的字元輸出流中寫入的html程式碼都會返回給瀏覽器
        resp.getWriter().println("<html><body>你好,世界</body></html>");
    }
}

 

6.3 :寫好程式碼後,通過Shift+Alt+F10彈出選單啟動tomcat,在瀏覽器位址列輸入http://localhost:8080/s1

 

7. 瀏覽器傳送請求

語法:
http://ip地址:埠號/servlet地址?引數名1=引數值1&引數名2=引數值2...

?name=張三&pass=123 // name是引數名,張三是引數值, pass是引數名, 123 是引數值

伺服器要獲取請求引數:
String 請求引數的值 = request.getParameter("請求引數名");

注意:
如果某個引數沒有傳遞,使用request.getParameter()返回的是null值
request.getParameter()返回的總是字串,需要自己做資料型別轉換

 

8. 請求型別

  1. get 請求 直接通過瀏覽器地址傳送的請求
  2. post 請求
    表單form既可以傳送get請求,也可以傳送post請求
    區別: 1) get請求會把所有請求引數跟在位址列之後,不適合傳送敏感資訊
                       而post請求不會把請求引數跟在位址列之後
                2) 不要以為post請求是安全的,通過一些網路監測工具仍然可以看到post中的引數資訊
                       http 是不安全的,都是明文傳送給伺服器的
                       https 是安全的,會把資訊傳送給伺服器的過程中進行加密
                       https 和post結合可以保證向伺服器傳輸資料的安全性
                3)   get請求傳輸的資料有限制, post請求沒有限制(任意大小的資料都可以傳送給伺服器)
                4)   get 意味著獲取資訊(對應查詢操作)
                      post 意味著增,改,刪等操作

對於post請求,會有中文亂碼問題,解決方法是呼叫:
// 手工進行解碼, 需要放在所有 req.getParameter方法之前呼叫
req.setCharacterEncoding("utf-8");

注意: tomcat 8 已經對get請求中的中文按utf-8進行解碼了, 所以程式設計師不需要對get請求的中文進行額外處理, tomcat 7, tomcat 6 ... 對get請求中的中文還需要特殊處理

 

 

9. servlet 的生命週期

整個生命週期中,servlet只有一個例項(單例的)

  1. 構造方法首先執行(只執行一次)
  2. 初始化方法init (只執行一次)
  3. 服務方法 service (反覆被執行)來一次請求執行一次
  4. 銷燬方法 destroy (只執行一次)在伺服器停止前,或重新部署時

 

10. doGet與doPost

覆蓋service方法,可以處理所有型別的請求
覆蓋doGet方法,僅能處理get方式的請求
覆蓋doPost方法,僅能處理post方式的請求

練習,把資料庫中的資料展現在頁面上

一個java web專案:
|-
     |-WEB-INF (受保護不能直接訪問)
         |-classes 放自己編寫的java類
             |-lib 放第三方的jar包
     |-css 放樣式表
     |-js 放js指令碼
     |-jsp 放網頁檔案
     |-index.jsp 首頁面 如果沒有寫具體的地址,會按 index.html, index.jsp

注意:在一個專案內,多個servlet的urlPatterns不能重複,要確保唯一

使用serlvet生成html標籤,程式碼難以維護,可讀性差,容易出錯。

 

jsp

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

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

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

上面的程式碼稱為 page 指令,主要作用就是指明此頁面是一個jsp頁面,並且通過contentType說明他的字元編碼和格式
jsp 中有

  1. 指令: <%@ 指令名 %>
  2. 指令碼: <% 可以是任意java程式碼 %>
  3. 表示式: <%= 表示式 %> 把執行結果顯示在頁面上

 

1.  EL表示式語言

expression language 在jsp用來展示結果的語言
語法
${ 表示式語言 }

要用el表示式顯示覆雜的內容,需要把內容提前放入作用域, el再從作用域中把內容取出來顯示
// 設定屬性
pageContext.setAttribute("名稱", Object); // 把內容起一個名字放入作用域

之後就可以通過EL表示式
${pageScope.名稱}

el表示式可以通過
${物件.屬性名} 但這裡的屬性名,依據是物件的get方法,而不是私有屬性名
把get方法中get去掉(或把is方法的is去掉),剩餘的單詞首字母小寫,作為物件的屬性名,例如

getName() ==> name
getUsername() ==> username
getHelloWorld() ==> helloWorld
isClose() ==> close

 

2. JSTL

java 標準標籤庫
java standard tag library

主要的工具就是配合el表示式,實現迴圈,條件判斷等功能
前提: 加入jstl-1.2的jar包
匯入標籤庫
<%@ taglib uri="標籤庫唯一標識" prefix="字首" %>

 常用:
  <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

2.1 forEach

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

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

 

2.2 if

<c:if test="布林條件">內容</c:if>

 

2.3 choose
類似於 if else

<c:choose>
  <c:when test="條件1">內容1</c:when>
  <c:when test="條件2">內容2</c:when>
  ...
  <c:when test="條件n">內容n</c:when>
  <c:otherwise>以上條件都不成立時</c:otherwise>
</c:choose>

 

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

<c:out escapeXML="false" value="${作用域變數}"> 不忽略html
<c:out escapeXML="true" value="${作用域變數}"> 忽略html,(當做普通文字)

 

2.5 formatDate
格式化日期

<fmt:formatDate value="日期物件" pattern="日期格式"/>

 

2.6 formatNumber
格式化數字
數字格式 `#` 和 `0` 其中0可以用來前置補零或後置補零

<fmt:formatNumber value="數字物件" pattern="數字格式"/>

 

3. MVC 思想

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

由servlet器查詢資料,把資料放入作用域,跳轉至jsp檢視
jsp檢視從作用域中獲取資料,並展示

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

這些數字稱為響應狀態碼

 

4. jsp表示式

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

<%= 表示式 %>

 

5. jsp指令

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

exception只能配合jsp表示式和jsp指令碼使用

 

6. 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

 

7. 大隱式物件

無需宣告即可使用

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

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

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

page作用域:        變數作用範圍僅限於當前頁面
request作用域:     變數的作用範圍在一次請求內有效