目錄
一、文件下載
二、ServletConfig對象
三、Web.xml文件使用總結
四、server.xml文件
五、JSP動態網頁技術
1.概念:
2.動態網頁:
3.特點:
4.JSP的訪問原理:
5.JSP的文檔說明:
6.jsp實際運行文件:
7.JSP文件運行原理:
8.JSP的語法和指令:
9.JSP的三種注釋:
10.JSP中寫Java代碼的區域:
11.JSP的靜態引入和動態引入
12.JSP內置對象:
六、EL表達式
七、jstl標簽庫學習
一、文件下載
1.文件下載的方式
(1)彈窗是使用附件的方式下載。
2.從服務器下載文件
(1)Content-Disposition是MIME協議的擴展,MIME協議指示MIME用戶代理如何顯示附加的文件。當Internet Explorer接收到頭時,它會激活文件下載對話框。
(2)設置響應頭:"Content-Disposition","attachment;filename="+filename。
3.案例:
package com.web.servlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;@WebServlet("/download")
public class DownLoadServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext sc = this.getServletContext();//獲取到當前服務器中要下載的文件的絕對路徑String realPath = sc.getRealPath("datas/1.jpg");System.out.println("realPath:" + realPath);//通過FileInputStream從服務器中讀取文件數據(用一根管道懟到服務器上)FileInputStream in = new FileInputStream(realPath);//把這個數據讀取之后響應給瀏覽器//從服務器中文件的路徑獲取文件的文件名File file = new File(realPath);String fileName = file.getName();//設置響應頭,以附件(彈窗)的方式下載resp.setHeader("Content-Disposition","attachment;filename=" + fileName);//相當于輸出流懟到瀏覽器上ServletOutputStream out = resp.getOutputStream();//把in流讀到的數據寫入到out流中byte[] bytes = new byte[1024];int len;while ((len = in.read(bytes)) != -1){out.write(bytes,0,len);}out.close();//緩沖流中有flush動作,在緩沖流中close()會先flush再closein.close();}
}
二、ServletConfig對象
1.ServletConfig對象可以獲取web.xml中的配置信息。
2.ServletConfig對象是Servlet的專屬配置對象,每個Servlet都單獨擁有一個ServletConfig對象,用來獲取web.xml中的局部配置信息。
3.可以再web.xml文件中的servlet標簽下面配置某一個Servlet的獨有的配置信息,通過ServletConfig對象獲取,再這里設置的值,一般是在SpringMVC框架中給servlet類中的屬性賦值。
4.獲取ServletConfig對象:
(1)this.getServletConfig()。
(2)返回的是一個ServletConfig類型。
5.獲取配置信息中的值:
(1)ServletConfig對象.getInitParameter("key");
6.ServletConfig和ServletContext的區別:
(1)ServletConfig是局部的,ServletContext是全局的。
(2)每個Servlet都有一個ServletConfig對象,而ServletContext對象在整個項目中只有一個。
(3)ServletConfig只能獲取局部的配置信息,而ServletContext可以獲取全局的配置信息。
7.案例:
(1)web.xml中的配置信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.web.servlet.MyServlet</servlet-class><!--這是對指定的servlet獨有的配置信息在這里設置的值,以后學習SpringMVC時會通過這種方式給servlet類中的屬性賦值--><init-param><param-name>city</param-name><param-value>beijing</param-value></init-param></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/my</url-pattern></servlet-mapping>
</web-app>
(2)MyServlet中的代碼
package com.web.servlet;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class MyServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletConfig servletConfig = this.getServletConfig();String city = servletConfig.getInitParameter("city");System.out.println("city:" + city);}
}
三、Web.xml文件使用總結
1.每個web項目下都具備web.xml文件,這個文件是我們程序員和tomcat服務器打交道的文件。
2.tomcat下還有一個web.xml文件,這個文件的作用是:存儲項目的相關的全局配置信息,保護Servlet。解耦一些數據對程序的依賴。
3.使用位置:
(1)每個web項目下的web.xml文件:每個web項目中。
(2)tomcat下的web.xml文件:Tomcat服務器中(在服務器目錄conf目錄中)。
4.區別:
(1)Web項目下的web.xml文件為局部配置,針對本項目的位置;tomcat下的web.xml文件為全局配置,配置公共信息,針對部署到tomcat中的所有項目有效。
(2)Web項目和Tomcat下都配置相同的信息,就近原則,取web項目下web.xml文件中的配置信息。
(3)內容(核心組件):
- 全局上下文配置(全局配置參數)<context-param></context-param>。
- Servlet配置
- 過濾器配置
- 監聽器配置
(4)加載順序:
- web容器會按:ServletContext -> context-param -> listener -> filter -> servlet這個順序加載組件,這些元素可配置在web.xml文件中的任意位置
5.加載時機:Web項目下的web.xml和Tomcat下的web.xml都是在服務器啟動時加載的。
6.可以使用<welcome-file-list><welcome-file></welcome-file></welcome-file-list>標簽配置默認的訪問頁面。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><welcome-file-list><!--設置服務器啟動時默認訪問頁面--><welcome-file>welcome.html</welcome-file></welcome-file-list>
</web-app>
四、server.xml文件
1.可以在里面設置服務器的訪問端口。
2.可以在<Connector>標簽中更改服務器端口。
五、JSP動態網頁技術
1.概念:
(1)JSP全名為Java Server Pages,中文名叫java服務器頁面,其根本是一個簡化的Servlet設計,ta是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。
2.動態網頁:
(1)JSP部署于網絡服務器上,可以響應客戶端發送的請求,并根據請求內容動態地生成HTML、XML或其他格式文檔的Web網頁,然后返回給請求者。JSP技術以Java語言作為腳本語言,為用戶的HTTP請求提供服務,并能與服務器上的其它Java程序共同處理復雜的業務需求。
3.特點:
(1)本質上還是Servlet。
(2)跨平臺,一次編寫到處運行。
(3)組件跨平臺。
(4)健壯性和安全性。
4.JSP的訪問原理:
(1)瀏覽器發起請求,請求JSP,請求被Tomcat服務器接收,執行JspServlet將請求的JSP文件轉義成為對應的java文件(也是Servlet),然后執行轉義好的java文件。
5.JSP的文檔說明:
(1)格式:<%@ page contentType="text/html;charset=UTF-8" language="java" %>。
(2)contentType:文檔響應的編碼格式。
(3)language:使用的語言。
6.jsp實際運行文件:
(1)C:\Users\用戶名\AppData\Local\JetBrains\IntelliJIdea2023.1\tomcat目錄下的文件。
7.JSP文件運行原理:
(1)可以在Tomcat的web.xml中找到一個jsp的文件映射,就是servlet中的訪問路徑,當你訪問*.jsp文件時會自動訪問一個JspServlet,這個servlet會把jsp文件轉譯成一個servlet文件,最終在tomcat中運行的是這個轉譯后的servlet文件而不是之前的jsp文件,所以從始至終tomcat服務器根本就沒有見過jsp這個文件。
8.JSP的語法和指令:
(1)page的作用:
- 配置jsp文件的轉譯相關的參數。
(2)JSP的page指令介紹:
- 案例:
-
<%@ page contentType="text/html;charset=UTF-8"language="java" pageEncoding="UTF-8" import="java.util.Date,java.io.FileInputStream" session="true" errorPage="error.jsp" %>
- <%@ %>:包括jsp文件相關描述信息的標簽,可以含有各種屬性。
- page屬性:描述當前jsp文件。
- contentType:當前文件響應編碼等同于servlet中resp.setContentType。
- language:表示當前jsp是用java語言作為腳本。
- pageEncoding:表示當前jsp文件的編碼,同時也是設置響應編碼,與contentType有相同的效果,所以可以只寫pageEncoding。
- import="java.util.Date":用來導入java類的,如果有多個使用逗號隔開。
- session:設置當前jsp頁面是否支持session,默認不支持,session="true"開啟session的支持。
- errorPage:如果當前jsp頁面有錯,就會跳轉到errorPage指定的頁面。
9.JSP的三種注釋:
(1)前端語言注釋:<!-- 會被轉譯,也會被發送,但是不會被瀏覽器執行 -->。
(2)java語言注釋://會被轉譯,但是不會被servlet執行。
(3)jsp注釋:<%-- 不會被轉譯 --%>。
10.JSP中寫Java代碼的區域:
(1)<% 寫在service方法中,局部的數據 %>
(2)<%! 全局的數據 %>
- 注意:全局代碼塊聲明的代碼,需要使用局部代碼塊調用
(3)<%=變量或者方法名%>:腳本段,可以放在html標簽中,相當于resp.getWriter().write();,會直接把腳本段中的內容寫在前端頁面中。
(4)嵌套:可以在一個局部代碼塊中寫入一半的java代碼,在局部代碼下面加入一些html的內容,最后在html內容的下面使用局部代碼塊將剩余的java代碼寫完。
<%for(int i = 0;i < 10;i++){
%>
<i><%=i%></i>
<%}
%>
(5)案例:
<%--Created by IntelliJ IDEA.To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8"language="java" pageEncoding="UTF-8" import="java.util.Date,java.io.FileInputStream" session="true" errorPage="error.jsp"
%>
<html><head><title>$Title$</title></head><body><%--寫java代碼的區域,在service方法內:局部代碼塊--%><%
// System.out.println(10/0);%><%--寫java代碼的區域,在service方法外:全局代碼塊--%><%!int a = 10;int b = 20;%><%System.out.println("a:" + a);System.out.println("a+b:" + (a + b));%>第一個jsp頁面<a href="https://www.baidu.com">百度</a><%--java代碼可以與html代碼混合寫--%><b><%=b%><br></b><%for(int i = 0;i < 10;i++){%><i><%=i%></i><br><%}%></body>
</html>
11.JSP的靜態引入和動態引入
(1)JSP的靜態引入:<%@include file="要引入的jsp文件的相對路徑"%>
- 特點:會將引入的jsp文件和當前jsp文件轉譯成一個java(Servlet)文件使用。在網頁中也就顯示了合并后的顯示效果。
- 注意:靜態引入的jsp文件不會單獨轉譯成java(Servlet)文件。當前文件和靜態引入的jsp文件中不能夠使用java代碼塊聲明同名變量。
(2)JSP的動態引入:<jsp:include page="要引入的jsp文件的相對路徑"></jsp:include>
- 特點:會將引入的jsp文件單獨轉譯,在當前文件轉譯好的java文件中調用引入的jsp文件的轉譯文件。在網頁中顯示合并后的顯示效果。
- 注意:動態引入允許文件中聲明同名變量。
- 優點:降低jsp代碼的冗余,便于維護升級。
(3)案例:
<%--Created by IntelliJ IDEA.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><%--靜態引入--%><%@include file="b.jsp"%><hr>我是a.jsp頁面<hr><%@include file="c.jsp"%><%--動態引入--%><jsp:include page="d.jsp"></jsp:include>
</body>
</html>
12.JSP內置對象:
(1)可以通過jsp的內置對象request獲取到后端Servlet中的request對象攜帶的數據。
(2)可以通過jsp的內置對象session獲取到后端Servlet中在session中設置的數據。
六、EL表達式
1.什么是EL表達式:
(1)全稱:Expression Language,一種寫法非常簡潔的表達式。語法簡單易懂,便于使用。表達式語言的靈感來自于ECMAScript和XPath表達式語言,可以從作用域中取數據。
2.EL表達式的作用:
(1)作用:讓jsp書寫起來更加的方便。簡化在jsp中獲取作用域或者請求數據的寫法。也會搭配jstl來進行使用。
3.使用EL表達式:
(1)語法結構:$(expression),提供.和[]兩種運算符來存取數據。
4.使用EL表達式獲取作用域數據:
(1)取的是pageContext、request、session、application四個對象中的數據,其他數據一概不理會。
(2)EL表達式如果找到了數據則獲取返回,如果沒有找到則什么也不做,也不報錯。
5.EL表達式是為了簡化咋們的jsp代碼,具體一點就是為了簡化在jsp里面寫的那些java代碼
(1)格式:${表達式}。
6.如果取存在作用域中的對象里面的屬性,那么可以直接使用${key. 屬性名}來獲取
7.如果取存在作用域中List集合里面的數據,可以通過下標來取:${key[數據對應的下標,從0開始]}
(1)注意:如果集合中裝的是對象,那么可以通過${key[下標].屬性名}來獲取。
8.如果取map集合中的數據,可以通過${session的key.map集合的key}來獲取map集合中的數據
(1)注意:map集合的key不需要加雙引號。
9.作用域對象有:
(1)request:一次請求中共享數據。
(2)session:同一用戶下共享數據。
(3)application:不同用戶下共享數據,整個工程中只有一個。
(4)pageContext:jsp中特有的,在當前頁面中共享數據。
10.案例:
<%--Created by IntelliJ IDEA.To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.web.pojo.T_User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<html>
<head><title>Title</title>
</head>
<body><%request.setAttribute("city","北京");%><%--取作用域中的數據--%>${city}<br><%session.setAttribute("city2","天津");T_User user = new T_User();user.setUname("小麗");user.setPwd("123");session.setAttribute("user",user);ArrayList<String> list = new ArrayList<>();list.add("上海");list.add("廣州");list.add("南京");session.setAttribute("citys",list);HashMap<String,Integer> map = new HashMap<>();map.put("a",20);map.put("b",22);map.put("c",23);session.setAttribute("m",map);ArrayList<T_User> users = new ArrayList<>();users.add(new T_User("靜靜","123"));users.add(new T_User("小麗","333"));users.add(new T_User("海王","321"));session.setAttribute("users",users);%>${city2}<br>${user.uname}--${user.pwd}<br>${citys[0]}--${citys[1]}--${citys[2]}<br>${m.a}--${m.b}--${m.c}<br>${users.get(0).uname}--${users.get(0).pwd}${users.get(1).uname}--${users.get(1).pwd}${users.get(2).uname}--${users.get(2).pwd}<hr>${users[0].uname}--${users[0].pwd}<br>${users[1].uname}--${users[1].pwd}<br>${users[2].uname}--${users[2].pwd}<br><h5>作用域對象有:request,session,application(ServletContext),pageContext</h5>在四種作用域中放入相同的數據<%
// request.setAttribute("a","request");session.setAttribute("a","session");application.setAttribute("a","application");
// pageContext.setAttribute("a","pageContext");%><h5>測試優先順序:application>request>session>application</h5>${a}
</body>
</html>
七、jstl標簽庫學習
1.jstl提供了一些標簽,可以在jsp頁面中遍歷取作用域中的數據。
2.在jsp中導入jstl的包:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.使用<c:forEach items="${作用域中存儲的要遍歷的集合的key}" var="遍歷出來的單個值的變量名">${"遍歷出來的單個值的變量名"}</c:forEach>
4.案例:
<%--Created by IntelliJ IDEA.To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.web.pojo.T_User,java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html>
<head><title>Title</title>
</head>
<body><%ArrayList<T_User> users = new ArrayList<>();users.add(new T_User("靜靜","123"));users.add(new T_User("小麗","333"));users.add(new T_User("海王","321"));session.setAttribute("users",users);%><h3>jstl提供了一些標簽,可以在jsp頁面中--->遍歷取作用域中的數據</h3><c:forEach items="${users}" var="u">${u.uname}--${u.pwd}<br></c:forEach>
</body>
</html>