JSP基本使用


什么是jsp

  JSP 全名為 Java Server Pages,即 java 服務器頁面,是一種動態網頁開發技術。它使用 JSP 元素在HTML 網頁中插入 Java 代碼,從而形成后綴名為.jsp 的 JSP 文件。JSP 元素通常以<%開頭,以%>結束。
  JSP 是一種 Java servlet,主要用於實現 Java web 應用程序的用戶界面部分。網頁開發者們通過結合HTML 代碼、XHTML 代碼、XML 元素以及嵌入 JSP 操作和命令來編寫 JSP。JSP 通過網頁表單獲取用戶輸入數據、訪問數據庫及其他數據源,然后動態地創建網頁。

  JSP 元素有多種功能,比如訪問數據庫、記錄用戶選擇信息、訪問 JavaBean 組件等,還可以在不同的
  網頁中傳遞控制信息和共享信息。

為什么使用JSP

  1、性能更加優越,因為 JSP 可以直接在 HTML 網頁中動態嵌入元素而不需要單獨引用 CGI 文件。服務器調用的是已經編譯好的 JSP 文件,而不像 CGI/Perl 那樣必須先載入解釋器和目標腳本。
  2、JSP 基於 Java Servlet API,因此,JSP 擁有各種強大的企業級 Java API,包括 JDBC,JNDI,EJB,JAXP 等等。
  3、JSP 頁面可以與處理業務邏輯的 servlets 一起使用,這種模式被 Java servlet 模板引擎所支持。最后,JSP 是 Java EE 不可或缺的一部分,是一個完整的企業級應用平台。這意味着JSP 可以用最簡單的方式來實現最復雜的應用。

JSP的優勢

  1、與 ASP 相比:JSP 有兩大優勢。首先,動態部分用 Java 編寫,而不是 VB 或其他MS 專用語言,所以更加強大與易用。第二點就是 JSP 易於移植到非 MS 平台上。
  2、與純 Servlet 相比:JSP 可以很方便的編寫或者修改 HTML 網頁而不用去面對大量的 println 語句。
  3、與 JavaScript 相比:雖然 JavaScript 可以在客戶端動態生成 HTML,但是必須使用 A JAX 與服務器交互,因此不能提供復雜的服務,比如訪問數據庫和圖像處理等等。
  4、與靜態 HTML 相比:靜態 HTML 不包含動態信息。

JSP的結構

  在一個 jsp 頁面上,既可以包含靜態 HTML 代碼,也可以包含 Java 代碼。

image

image

JSP 處理過程

  1、當訪問JSP,tomcat加載jsp
  2、使用模板引擎進行翻譯: 默認jsp中內容都當做字符串,使用IO流輸出到客戶端.被<%%>包裹的內容當做Java代碼單獨處理.
  3、將翻譯后java文件,進行編譯,產生class文件
  4、 tomcat將編譯后的文件加載JVM中進行執行.

注意:

  1、JSP只有第一次訪問時會進行翻譯.

  2、由於JSP是由一次訪問時進行翻譯,容易出現緩存問題.所以一般項目發布時,建議先備份項目,清理緩存,發布新項目.

JSP9大內置的對象(9大隱式對象)

  為什么在JSP頁面,可以直接使用request.getParamter("name"),注意,getParamter是一個方法,被request調用了.說明request是對象.但是我們沒有創建request對象,但是可以直接使用.

由於jsp中書寫所有代碼,在翻譯后,都在_jspService方法中,而該方法,都默認有:

  HttpServletRequest request 請求對象

  HttpServletResponse response 響應對象

  PageContext pageContext 當前頁面上下文對象

  HttpSession session 會話對象(每次對話)

  ServletContext application 應用對象(表示當前應用) 全局只有一個

  ServletConfig config 配置對象

  spWriter out 輸出對象

  java.lang.Object page 當前類對象

  Throwable exception 異常對象

內置對象分類

作用域對象(四大作用域)

  PageContext pageContext 當前頁面

  HttpServletRequest request 一次請求

  HttpSession session 一次會話(多次請求)

  ServletContext application 整個應用

共同特征:

  四個作用域在一定程度上就是四個容器,都可以存儲數據.就可以使用做個作用域進行數據的傳遞.

  1.設置作用域中數據:

    setAttribute(key, value)

  2.從作用域中獲取數據

    getAttribute(key)

  3.從作用域中刪除數據

    removeAttribute(key)

  4.從作用域中獲取所有數據對應的key值

    getAttributeNames()

響應對象

  HttpServletResponse response 響應對象

  表示服務器與客戶端會話時,做出響應的對象.

輸出對象

  out 向當前頁面輸出信息

當前類相關對象

  ServletConfig config 配置對象 配置當前Servlet

  java.lang.Object page 當前類對象 this

異常對象

  Throwable exception 異常對象

 當頁面發生異常時,該對象由程序自動生成.

內部轉發和重定向

內部轉發:

  request.getRequestDispatcher("轉發的地址").forward(request,response);

重定向:

  response.sendRedirect("重定向地址");

image

重定向和內部轉發對比:

相同點:

  重定向和內部轉發都能實現當前瀏覽器窗口內容發生改變,都是頁面跳轉.

不同點:

  1、內部轉發只需要請求一次,服務器內部自己將請求信息和響應地址轉交給下一個資源信息處理。而重定向,則是服務器告訴瀏覽器,重新請求新的資源地址.

  2、內部轉發URL地址不會發生改變,重定向由於是由瀏覽器重新發起的請求,URL地址會發生改變
  3、由於內部轉發,雖然頁面發生改變,但是請求始終是一次,可以使用request作用域傳輸數據.但是重定向是多次請求,所以無法使用request作用域傳遞數據.

注意:

  1.在使用request對象傳遞數據時,可以傳遞任意對象.而使用重定向傳遞數據時,只能在URL地址上進行拼接處理.即重定向傳遞數據只能當做字符串傳遞.本質上是告訴瀏覽器請求新的資源信息時,帶的參數.

  2.在實際的開發使用中,能使用重定向的盡量使用重定向.因為內部轉發時,如果頁面進行刷新,內部轉時期間所有的相關業務會重新執行一遍,加大服務器壓力,且容易引起業務異常.而重定向只是請求當前需要資源,刷新頁面時,只會請求當前資源,相對而言壓力較小.

JSP 指令

  JSP 指令用來設置整個 JSP 頁面相關的屬性,如網頁的編碼方式和腳本語言。
  指令可以有很多個屬性,每個屬性以鍵值對的形式存在,多個屬性之間用空格隔開。
JSP 中的三種指令標簽:

指令 描述
<%@ page ... %> 定義網頁依賴屬性,比如腳本語言、error 頁面、緩存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入標簽庫的定義

注意:

   include 指令: 引入其他文件, 引入時,被引入的文件會和當前文件一起編譯.

JSP動作

JSP動作簡介

  與 JSP 指令元素不同的是,JSP 動作元素在請求處理階段起作用。JSP 動作元素是用 XML 語法寫成的。
利用 JSP 動作可以動態地插入文件、重用 JavaBean 組件、把用戶重定向到其它的頁面、為 Java 插件生成 HTML 代碼。動作元素只有一種語法,如下:

<jsp:action_name attribute="value" />

  動作元素基本上都是預定義的函數,JSP 規范定義了一系列的標准動作,它用 JSP 作為前綴,可用的標
准動作元素如下:

語法 描述
jsp:include 在頁面被請求的時候引入一個文件。
jsp:useBean 尋找或者實例化一個 JavaBean。
jsp:setProperty 設置 JavaBean 的屬性。
jsp:getProperty 輸出某個 JavaBean 的屬性。
jsp:forward 把請求轉發到一個新的資源。
jsp:plugin 根據瀏覽器類型為 Java 插件生成 OBJECT 或 EMBED 標記。
jsp:element 定義動態 XML 元素
jsp:attribute 設置動態定義的 XML 元素屬性。
jsp:text 在 JSP 頁面和文檔中使用寫入文本的模板

注意:

  jsp:include 引入指定文件.但是被引入的文件會和當前文件分別進行編譯.

處理Form表單提交的數據

  在tomcat 8之后,tomcat默認的編碼格式設置為了UTF-8編碼,這種編碼只對get請求生效.此時使用get提交中文,不會出現亂碼.若使用post提交,則會出現亂碼.

  注意:tomcat 8 以下,要進行編碼配置:

<Connector port="8080" protocol="HTTP/1.1"	connectionTimeout="20000"
               redirectPort="8443"  URIEncoding="UTF-8" />

解決方案:

1.設置編碼格式

2.對字符串進行轉碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="formController.jsp"   method="post">
		<p>
			普通文本框:<input type="text" name="userName"  />
		</p>
		<p>
			密碼框:<input type="password" name="password"  />
		</p>
		<p>
			下拉框:
			<select name="selectName">
				<option value="值1">顯示的文本1</option>
				<option value="值2">顯示的文本2</option>
				<option value="值3">顯示的文本3</option>
			</select>
		</p>
		<p>
			復選框:
			<input type="checkbox" name="like"  value="籃球">籃球
			<input type="checkbox" name="like"  value="足球">足球
			<input type="checkbox" name="like"  value="羽毛球">羽毛球
		</p>
		<p>
			單選按鈕:
			<input type="radio" name="sex"  value="男">男
			<input type="radio" name="sex"  value="女">女
			<input type="radio" name="sex"  value="不知道">不知道
		</p>
		<textarea rows="10" cols="10" name="textName"></textarea>

		<input type="submit"   value="提交"/>
	</form>
</body>
</html>
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 設置編碼格式
	// request.setCharacterEncoding("UTF-8");
	String userName = request.getParameter("userName");
	// 先按照本身的編碼格式進行轉化為字節,按照新的編碼格式進行編碼  
	userName = new String(userName.getBytes("ISO-8859-1"),"UTF-8");
	String password = request.getParameter("password");
	String selectName = request.getParameter("selectName");
	String like = request.getParameter("like");
	// 根據名稱 獲取數組值
	String[] likes = request.getParameterValues("like");
	String sex = request.getParameter("sex");
	String textName = request.getParameter("textName");

	System.out.println("userName:"+userName);
	System.out.println("password:"+password);
	System.out.println("selectName:"+selectName);
	System.out.println("likes:"+Arrays.toString(likes));
	System.out.println("sex:"+sex);
	System.out.println("textName:"+textName);
%>

EL表達式

  JSP為了更好的獲取作用域中的數據,提供了EL表達式的技術.可以寫在JSP頁面任何地方.注意,寫在JS里面時,只能獲取字符串.

這個EL表達式的這個技術,最核心的功能是獲取作用域中的數據.語法:

${name值}

  EL表達式,優先從: pageContext --> request ---> session --> application,如果以上作用域中,查找key對應的值,都找不到,則返回空字符串.

EL表達式獲取JavaBean類型

語法:

  ${key.對象屬性名}

示例:

<%@page import="com.sxt.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	User user = new User(1,"韓梅梅");
	request.setAttribute("userKey", user);
%>
${userKey.id}
${userKey.name}
</body>
</html>

注意:

  1.el表達式,在獲取對象的屬性值是,調用的get方法,其本質與屬性是沒有關系的.而是調用get方法,將對象屬性名首字母大寫,與get字符串進行拼接,組成了get方法.調用該方法,獲取值.只是,在開發中,每個屬性其get和set方法,按照規則生成的.所以EL表達式,利用這個規則,獲取屬性值.

  2.基於第一點,在實際開發中,可以對數據進行格式化.

package com.sxt.bean;

import java.text.SimpleDateFormat;
import java.util.Date;

public class User {
	
	private Integer id;
	private String name;	
	private Integer sex; // 1 男   2 女	
	private Date  date;	
	
	public User() {}
	public User(Integer id, String name, Integer sex) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
	}

	public Integer getId() {
		System.out.println("我是ID屬性的get方法");
		return id+10;
	}
	public String getName() {
		System.out.println("我是name屬性的get方法");
		return name;
	}
	public Integer getSex() {
		return sex;
	}
	public String getSexFormat() {
		if(sex != null) {
			return sex == 1?"男":"女";
		}
		return "未知";
	}
    
	public void setSex(Integer sex) {
		this.sex = sex;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getDate() {
		return date;
	}
    public void setDate(Date date) {
		this.date = date;
	}
    
	public String getDateFormate() {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		return simpleDateFormat.format(date);
	}
}

<%@page import="java.util.Date"%>
<%@page import="com.sxt.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	User user = new User(1,"韓梅梅",2);
	user.setDate(new Date());
	request.setAttribute("userKey", user);
%>
${userKey.id}
${userKey.name}

${userKey.sex}
${userKey.sexFormat}
${userKey.date}
<!-- 調用get中的方法時把get去除后首字母小寫進行調用 -->
${userKey.dateFormate}
</body>
</html>

image

EL表達式獲取Map數據

語法:

  ${key.map中key}

示例:

<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Date"%>
<%@page import="com.sxt.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	Map<String,String>  map = new HashMap<String,String>();
	map.put("key1", "value1");
	map.put("key2", "value2");
	Map<String,User>  userMap = new HashMap<String,User>();
	
	userMap.put("userKey",new User(1,"韓梅梅",2));
	
	request.setAttribute("mapKey", map);
	request.setAttribute("userMapKey", userMap);
	//
	Map<String,String>  data = new HashMap<String,String>();
	data.put("1","1的值");
	request.setAttribute("data", data);
%>
${mapKey}<br>
${mapKey.key1}<br>
${mapKey.key2}<br>
<hr>
${userMapKey.userKey.id}
${userMapKey.userKey.name}
${userMapKey.userKey.sex}
${userMapKey.userKey.sexFormat}
<hr>
<!-- 不推薦這樣使用   -->    
${data['1']}
</body>
</html>

EL表達式獲取List中的數據

語法:

  ${key[下標]}

示例:

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Date"%>
<%@page import="com.sxt.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	List<String> strs = new ArrayList<String>();
	strs.add("韓梅梅");
	strs.add("李磊");
	strs.add("李華");
	strs.add("Jim");
	request.setAttribute("listKey", strs);
	
	List<User> users = new ArrayList<User>();
	users.add(new User(1,"韓梅梅",2));
	users.add(new User(2,"李磊",1));
	request.setAttribute("usersKey", users);
	
%>
${listKey}<br>
${listKey[0]}<br>
${listKey[1]}<br>
${listKey[2]}<br>
${listKey[3]}<br>
<hr>
${usersKey[0].name}<br>
${usersKey[1].name}<br>
</body>
</html>

EL表達式運算符

算術運算符

  EL表達式支持數學運算符號

\+         \-       \*    \\

示例:

<h1>算術運算符</h1>
${1 + 2}<br>
${1 - 2}<br>
${1 * 2}<br>
${1 / 2}<br>

邏輯運算符

&& and
|| or
! not

示例:

<h1>邏輯運算符</h1>
<!-- 
	&&     and
	||     or
	!      not
 -->
 ${true&&false}<br>
 ${true and false}<br>
 ${false || true}<br>
 ${false or true}<br>
 ${!false}<br>
 ${not false}<br>

比較運算符

> gt
< lt
>= ge
<= le
== eq
!= ne
 <h1>比較運算符</h1>
 ${1 > 2 } <br>
 ${1 gt 2 } <br>
 ${1 >= 1 } <br>
 ${1 ge 1 } <br>
 ${1 < 1 } <br>
 ${1 lt 1 } <br>
 ${1 <= 1 } <br>
 ${1 le 1 } <br>
 ${1 == 1 } <br>
 ${1 eq 1 } <br>
 ${1 != 1 } <br>
 ${1 ne 1} <br>
 

三元運算符

 <h1>三元運算符</h1>
 ${1>2?'我是1':'我是2'}

empty運算符

 判斷字符串或者List是否是null或者空.若是null或者空則返回true,否則false

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL表達式運算符</title>
</head>
<body>
<%
	String str = null;
	String str1 = "";
	String str2 = "我是字符串";
	
	List<String>  list1 = null;
	List<String>  list2 = new ArrayList<String>();
	List<String>  list3 = new ArrayList<String>();
	list3.add("字符串");
	
	request.setAttribute("str", str);
	request.setAttribute("str1", str1);
	request.setAttribute("str2", str2);
	
	request.setAttribute("list1", list1);
	request.setAttribute("list2", list2);
	request.setAttribute("list3", list3);
%>
${empty str}<br>
${empty str1}<br>
${empty str2}<br>
${empty list1}<br>
${empty list2}<br>
${empty list3}<br>
</body>
</html>

EL表達式的不足

  1、無法很好處理數數組結構的數據,例如:List

  2、當作用域中的數據發生重疊覆蓋時,默認是從最小作用域pageContext取值。

 使用JSTL彌補EL表達式的不足

EL表達式從指定作用域取值

  當4大作用域,屬性發生重疊時,可以使用指定作用域關鍵字獲取值

pageContext pageScope
request requestScope
session sessionScope
application applicationScope
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL從指定作用域取值</title>
</head>
<body>
<%
	pageContext.setAttribute("name", "韓梅梅");
	request.setAttribute("name", "李磊");
	session.setAttribute("name", "Lucy");
	application.setAttribute("name", "Lily");
	/*
	pageScope 表示 page作用域
	requestScope 表示 request 作用域
	sessionScope 表示session 作用域
	applicationScope 表示application 作用域
	*/
%>
${pageScope.name}<br>
${requestScope.name}<br>
${sessionScope.name}<br>
${applicationScope.name}<br>
</body>
</html>

JSTL

  由於EL表達式存在一些不足,例如:

   條件分支,循環分支等等.JSTL進行補充.在使用JSTL時,是第三方擴展包.首先要引入jstl相關jar包.JSTL是一套標簽庫.

   由於JSTL標簽庫,一般約定使用字母c作為前綴,所以jstl標簽也被稱之為c標簽

使用步驟

1、導入相關jar包

jstl-1.2.jar standard-1.1.2.jar

jstl-1.2.jar
standard-1.1.2.jar

2、引入jstl標簽庫

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

其核心功能:

條件分支

<c:if test="el表達式">
    內容
</c:if>

語法解釋:

  當test中的表達式運算結果為true ,則執行被包裹的內容,否則不執行

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
	c:if  test="表達式"
		內容
	/c:if
 -->
 <%
 	request.setAttribute("v", 1);
 
 %>
 <c:if test="${v != 1}">
 	顯示的內容
 </c:if>
</body>
</html>

多條件分支

語法:

<c:choose>
    <c:when></c:when>
    <c:when></c:when>
    <c:otherwise></c:otherwise>
</c:choose>

語法解釋:

  自上而下,滿足when中的條件時,則執行相應的代碼,且后面的不執行.若都不滿足則執行otherwise

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:choose>
	<c:when test="${1!=1}">
		我是第13行
	</c:when>
	<c:when test="${1!=1}">
		我是第16行
	</c:when>
	<c:otherwise>
		我是第19行
	</c:otherwise>
</c:choose>
</body>
</html>

循環分支

語法:

<c:forEach> </c:forEach>
屬性 解釋
item 待循環的數據項
var 具體待循環項的別名
step 步長 每次循環自增值 默認1
begin 開始循環下標
end 結束循環下標
varStatus 循環屬性對象
index 索引下標
count 循環的次數
first 是否第一個
last 是否最后一個

示例:

<%@page import="java.util.ArrayList"%>
<%@page import="com.sxt.bean.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	List<User> users = new ArrayList<User>();
	users.add(new User(1,"韓梅梅"));
	users.add(new User(2,"李磊"));
	users.add(new User(3,"Lily"));
	users.add(new User(4,"Lucy"));
	request.setAttribute("usersKey", users);
%>
<c:forEach items="${usersKey}"  var="user" step="1" begin="0" end="1" varStatus="state">
${state.index}&nbsp;${state.count}&nbsp;${state.first}&nbsp;${state.last}&nbsp;${user.name}<br>
</c:forEach>
</body>
</html>

格式化

  引入格式化標簽庫:

時間格式化:

<%@page import="java.util.Date"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.sxt.bean.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	Date  d = new Date();
	request.setAttribute("d", d);
%>
<fmt:formatDate value="${d}" pattern="yyyy年MM月dd日 HH:mm:ss" var="time"/>
${time}<br>
${time}<br>
</body>
</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM