JavaWeb基礎一
JavaWeb
IDEA 快捷鍵:
- 導包:alt + enter
- 看方法的具體:ctrl + b /滑鼠左鍵
- 重寫 父類方法:ctrl + o
- 補充左邊程式碼:ctrl + alt + v 或 alt + enter
- 程式碼規範:ctrl + alt + l
- :alt + insert
- 註釋:Ctrl + / 或 Ctrl +Shift+ /
基本
-
新的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" metadata-complete="true"> </web-app>
-
基本路徑
<!--路徑對映--> <servlet> <servlet-name>login</servlet-name> <servlet-class>com.requst.test.loginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
-
maven依賴包 pom.xml
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- jsp-api:專案依賴--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency>
-
編碼和解碼
// string 編碼為 utf-8 URLEncoder.encode("string","utf-8"); // string 解碼為 utf-8 URLDecoder.decode("string","utf-8");
1. 基本概念
1.1 前言
web開發
- 靜態web
- html,css
- 頁面不會發生改變
- 動態web
- 技術棧:Servlet/jsp。。。
- 資料會始終發生改變,不同的時間,不同的地點頁面都會不同
1.2 web應用程式
2. web伺服器
3. Tomcat
3.1下載tomcat
-
開啟tomcat官網:https://tomcat.apache.org/download-70.cgi
-
點選 Download
-
選擇包
-
下載完成後解壓,即可
3.2 啟動tomcat
-
現在暫時通過bin目錄下的 startup.bat 啟動 tomcat
-
訪問http://localhost:8080若出現如下圖,則表示啟動成功
3.3 tomcat配置
- tomcat預設埠號:8080
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- 伺服器預設名:localhost
- 預設網站應用存放的位置為:webapps
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
3.4 釋出網站
-
如何訪問:
- 將自己寫的網站,放到伺服器( Tomcat中指定的web應用的資料夾( webapps)下,就可以訪問了
- http://localhost:8080/myWeb/
-
網站結構:
--webapps:Tomcat伺服器的web目錄 -ROOT -webName:網站的目錄名 -WEB-工NF -c1asses:java程式 -lib:web應用所依賴的jar包 -web.xml:網站配置檔案 -index.htm預設的首頁
4. HTTP
5. Maven
5.1 需求:
- 1.在javaweb開發中,需要使用大量的jar包,我們手動去匯入;
- 2.如何能夠讓一個東西自動幫我匯入和配置這個ar包。
由此, Maven誕生了!
5.2 Maven專案架構管理工具
Maven的核心思想;約定大於配置
5.3 maven 下載 安裝
-
開啟 maven官網
-
選擇 Download
-
找到Files,下載 Binary 和 Source
-
解壓 第一個即可
5.4 maven 配置
- 開啟環境變數
- 在系統變數 中 新建
- 變數名:MAVEN_HOME
- 變數值:maven的目錄
- 在path中新增:%MAVEN_HOME%\bin
- 在cmd中輸入 mvn -version,若彈出如圖,則成功
5.5阿里雲映象
-
先開啟 setting.xml
-
找到 mirrors 標籤,配置
<id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url> http://maven.aliyun.com/nexus/content/groups/public class="hljs-tag"> </url>
5.6 本地倉庫
-
先新建 一個資料夾做為本地倉庫
-
再 開啟 setting.xml
-
找到 localRepository
<localRepository>你的本地倉庫路徑</localRepository>
- 如圖 我的配置
5.7 在 IDEA 中使用maven模板配置 Maven
- 開啟 IDE 新建專案
- 建立Maven專案
-
等待專案初始化完成
-
觀察 本地倉庫
-
IDEA 的 Maven 配置 注意
5.8 在 IDEA 中建立乾淨的Maven專案
-
新建專案
-
建立maven專案 不用選,直接Next
-
輸入專案名 ---》完成
-
如圖,這是乾淨的maven專案
5.9 標記檔案功能
方法一:
方法二:
-
先找到 專案結構
-
1 --> 2--> 3--> 4
5.10 IDEA 配置 Tomcat
5.11 啟動
-
點選 啟動
-
效果 如圖:
5.12 pom 檔案
Maven 功能
pom.xml 是maven核心
<?xml version="1.0" encoding="UTF-8"?>
<!--這裡就是Maven版本和標頭檔案-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--這裡是專案 組id,名稱 -->
<groupId>org.example</groupId>
<artifactId>javaweb-01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- packag:專案打包方式
jar:java 應用
war:javaWeb 應用
-->
<packaging>war</packaging>
<name>javaweb-01-maven Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!-- 配置-->
<properties>
<!-- 預設編碼格式-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 編碼版本-->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!-- 專案依賴-->
<dependencies>
<dependency>
<!-- 具體依賴的 jar包 配置檔案-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 專案構建的東西-->
<build>
<finalName>javaweb-01-maven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
6. Servlet
6.1 Servlet簡介
- Sun在這些AP中提供一個介面叫做:Servlet,如果你想開發一個 Servlet程式,只需要完成兩個小步驟:
- 編寫一個類,實現 Servlet介面
- 把開發好的ava類部署到web伺服器中。
把實現了 Servlet介面的ava程式叫做, Servlet
6.2 HelloServlet
-
構建一個普通的 Maven專案,刪掉裡面的src目錄,以後我們的學習就在這個專案裡面建立 Moudle;這個空的工程就是 Maven主工程;
-
再建立一個模板maven,作為子工程
-
關於 Maven 父子工程的理解:
-
父專案中會有:
<modules> <module>servlet_01</module> </modules>
-
子專案中會有:
<parent> <artifactId>javaWeb_study</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent>
父專案中的java,子專案可以直接使用
-
- 編寫一個Java類,繼承 HttpServlet (實現servlet介面)
public class HelloServlet extends HttpServlet {
public HelloServlet() {
super();
}
// 由於get或都post只是請求實現的不同的方式,所以可以相互呼叫,業多邏都一樣;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter pw = resp.getWriter();
pw.println("hello servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
-
編寫 servlet 對映
為什麼需要對映:
想要通過瀏覽器訪問Java程式,而瀏覽器需要連線web伺服器,所以我們需要在web服務中註冊我們寫的 Servlet,還需給他一個瀏覽器能夠訪問的路徑;
<!--註冊Servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.study.servlet.HelloServlet</servlet-class> </servlet> <!-- Servlet的請求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>hello</url-pattern> </servlet-mapping>
-
配置Tomcat
5.1 先建立Facets
5.2 建立 Artifacts
5.3 新增Tomcat
-
啟動測試
首頁:
通過對映的:
6.3 Servlet原理
6.4 Mapping
-
一個 servlet 指定一個對映路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/ppx</url-pattern> </servlet-mapping>
-
一個 servlet 指定多個對映路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/ppx</url-pattern> <url-pattern>/gkd</url-pattern> <url-pattern>/hello/*</url-pattern> <url-pattern>/ok</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/ppx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/gkd</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/ok</url-pattern> </servlet-mapping>
-
一個 servlet 指定通用對映路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
-
一個 servlet 指定對映路徑字尾
<!-- 注意: * 前面不能加 / 和 對映路徑 例:<url-pattern>/whh/*.ppx</url-pattern> tomcat會報錯 --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.ppx</url-pattern> </servlet-mapping>
-
優先順序問題:
指定了固有的對映路徑優先順序最高,如果找不到就會走預設的處理請求
6.5 ServletContext
Web容器在啟動的時候,它會為每個Web程式都建立一個對應的 ServletContext物件,它代表了當前的Web應用
1、共享資料
// HelloServlet 中
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
// this.getInitParameter();
// this.getServletConfig();
// this.getServletContext();
ServletContext context = this.getServletContext();
String uname = " ppx ";
context.setAttribute("username",uname); //將一個數據儲存在了 ServletContext中,名字為:username。值:uname
System.out.println("come to HelloServlet");
}
// GetServlet 中
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("名字是:" + username);
System.out.println("come to GetServlet,name --->"+username);
}
<!-- HelloServlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.study.servlet_03.HelloServlet_03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- GetServlet-->
<servlet>
<servlet-name>getC</servlet-name>
<servlet-class>com.study.servlet_03.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getC</servlet-name>
<url-pattern>/getC</url-pattern>
</servlet-mapping>
2、測試:
首先進入 GetServlet.java ,這時 ServletContext 的 username值為null
進入 HelloServlet ,將 username 的值 ppx 存入 ServletContext 中
再次進入 GetServlet.java ,這時 ServletContext 的 username值為 ppx
3、請求轉發
public class ServletDome_02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
// resp.getWriter().println("這裡是ServletDome_02");
ServletContext context = this.getServletContext();
// 請求轉發
context.getRequestDispatcher("/getC").forward(req,resp);
System.out.println("come to ServletDome_02");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
4、讀取資原始檔
Properties
- 在Java目錄下新建properties
- 在resources目錄下新建properties
發現都被打包到了classes目錄下,一般稱這個路徑為classpath
思路:同過檔案流來讀取
public class PropertiesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
System.out.println("come to PropertiesServlet ");
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is); //本地路徑
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
<!-- PropertiesServlet-->
<servlet>
<servlet-name>ps</servlet-name>
<servlet-class>com.study.servlet_03.PropertiesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ps</servlet-name>
<url-pattern>/ps</url-pattern>
</servlet-mapping>
測試結果:
6.6 HttpServletResponse
web伺服器接收到客戶端的http請求,針對這個請求,分別建立一個代表請求的 HttpServletRequest物件,代表響應的一個 HttpServletResponse物件
-
如果要獲取客戶端請求過來的引數:找 HttpServletRequest
-
如果要給客戶端響應一些資訊:找 HttpServletResponse
1、檔案下載
-
獲取檔案的下在路徑
-
下載的檔名稱
-
設定支援瀏覽器下載需要的東西
-
獲取下載檔案的輸入流
-
建立緩衝區
-
獲取OutputStream物件
-
將FileOutputStream流寫入到buffer緩衝區
-
使用OutputStream將緩衝區中的資料輸出到客戶端
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 獲取檔案的下在路徑 String realPath = "E:\\java 學習程式碼\\IDEAJavaProject\\javaWeb_study_01\\response_01\\target\\classes\\007.png"; // this.getServletContext().getRealPath("src/main/resources/007.png"); System.out.println("現在的檔案下載路徑為:"+realPath); // 2. 下載的檔名稱 String fileName = realPath.substring(realPath.lastIndexOf("\\")+1); // 3. 設定支援瀏覽器下載需要的東西 resp.setHeader("Content-Disposition","attachment; filename"+ URLEncoder.encode(fileName,"utf-8")); // 4. 獲取下載檔案的輸入流 FileInputStream in = new FileInputStream(realPath); // 5. 建立緩衝區 int len = 0; byte[] buffer = new byte[1024]; // 6. 獲取OutputStream物件 ServletOutputStream out = resp.getOutputStream(); // 7. 將FileOutputStream流寫入到buffer緩衝區,使用OutputStream將緩衝區中的資料輸出到客戶端 while((len = in.read(buffer)) != -1){ out.write(buffer,0,len); } // 8. 關閉流 out.close(); in.close(); }
2、簡單驗證碼
驗證實現
-
前段實現
-
後端實現
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 如何讓瀏覽器 3s 重新整理一次 resp.setHeader("refresh","3"); // 在記憶體中建立一張圖片 BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR); // 得到圖片 //得到筆 Graphics2D g = (Graphics2D) image.getGraphics(); //畫出背景 g.setColor(Color.WHITE); g.fillRect(20,20,80,20); // 畫出隨機數字 g.setColor(Color.BLUE); g.setFont(new Font(null,Font.BOLD,20)); g.drawString(makeNum(),0,20); // 告訴瀏覽器 用圖片方式開啟 resp.setC ontentType("image/jpeg"); // 網站存在快取 , 不讓圖片進行快取 resp.setDateHeader("expirse",-1); resp.setHeader("cache-control","no-cache"); resp.setHeader("pragma","no-cache"); // 把圖片寫給瀏覽器 ImageIO.write(image,"jpg",resp.getOutputStream()); } private String makeNum (){ Random random = new Random(); String num = random.nextInt(999999) + 100000 + ""; return num; }
3. 重定向
一個web資源收到客戶端請求後,他會通知客戶端去訪問另外一個web資源,這個過程叫重定向。一般是跳轉頁面。
測試:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
resp.setHeader("Location","/r/img");
resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
*/
resp.sendRedirect("/r/img"); //重定向
}
重定向和轉發的區別:
- 相同點:
- 頁面都會跳轉
- 不同點
- 請求轉發的時候,url 不會發生變化 ,編碼307
- 重定向時,url 會發生改變,編碼302
6.7 HttpServletRequest
HttpServletRequest代表客戶端的所有請求
獲取前端傳遞的引數,再轉發
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
// 獲取引數
String name = req.getParameter("username");
String pwd = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobbies");
// 列印引數
System.out.println("----------------------------");
System.out.println(name);
System.out.println(pwd);
System.out.println(Arrays.toString(hobbies));
System.out.println("----------------------------");
// 通過請求轉發
req.getRequestDispatcher("/succse.jsp").forward(req,resp);
}
7、Cookie、Session
7.1 會話
會話:使用者開啟一個瀏覽器,點選了很多超連結,訪問多個Web資源,關閉瀏覽器,這個過程可以稱之為會話 。
有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經來過,稱之為有狀態會話。
7.2 儲存會話的兩種技術
cookie
- 客戶端技術(響應、請求)
session
- 伺服器技術、利用這個技術、可以儲存使用者的會話資訊。我們把資訊放在Session 中
常見應用:網站會
7.3 Cookie
1、從請求得到 Cookie
2、伺服器相應給客戶端cookie
Cookie[] cookies = req.getCookies(); //獲得 cookie
cookie.getName(); //獲得cookie中的 key
cookie.getValue(); //獲得cookie中的 value
new Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis())); //新建一個 cookie
cookie.setMaxAge(60*60); //設定cookie的有效期 1小時
resp.addCookie(cookie); //響應給客戶端一個cookie
cookie:一般會儲存在本地的使用者目錄 appdate 下
刪除cookie:
- 不設定有效期,關閉瀏覽器,自動失效
- 設定有效期的時間為 0
7.4 Session(重點)
什麼是 Session :
- 伺服器會給每個瀏覽器建立一個 Session 物件;
- 一個Session 獨佔一個瀏覽器,只要瀏覽器沒有關閉,這個Session 就會一直存在
- 使用者登入後,整個網站都可以訪問。儲存使用者資訊
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解決亂碼問題
req.setCharacterEncoding("utf-16");
resp.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//給Session中存入資訊
session.setAttribute("name","皮皮蝦");
session.setAttribute("object",new preson("七仔",15));
//獲取Session 的 ID
String id = session.getId();
//判斷Session 是不是新建立的
if (session.isNew()){
resp.getWriter().write("\r\nSession 建立成功,ID為"+id);
}else{
resp.getWriter().write("\r\nSession 已經存在,ID為"+id);
}
}
//得到Session中的資訊
String name = (String) session.getAttribute("name");
resp.getWriter().println("name--->"+name);
// 移除 session 的值
session.removeAttribute("name");
//登出 Session
session.invalidate();
自動失效:
<!-- 設定 Session 的失效時間 ,以分鐘為單位-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
8、 JSP
8.1 什麼是 JSP
Java Server Pages:Java伺服器端頁面,也和 Servlet一樣,用於動態Web技術!
最大的特點:
- 寫JSP就像在寫HTML
- 區別:
- HTML只給使用者提供靜態的資料
- JSP頁面中可以嵌入JAVA程式碼,為使用者提供動態資料
8.2 JSP原理
思路:JSP是怎麼執行的
-
將html內容變為Java語法執行
-
伺服器內部工作
tomcat中有一個work目錄
本機地址:C:\Users\ASUS.IntelliJIdea2019.3\system\tomcat\Unnamed_javaWeb_study_02\work\Catalina\localhost\rq\org\apache\jsp
頁面轉變為了Java程式
JSP的本質是Servlet
//初始化
public void _jspInit() {
}
//銷燬
public void _jspDestroy() {
}
//JSPServer
public void _jspService(HttpServletRequest request,HttpServletResponse response)
1、判斷方法的程式碼
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允許 GET、POST 或 HEAD。Jasper 還允許 OPTIONS");
return;
}
2、內建的物件:
final javax.servlet.jsp.PageContext pageContext; //頁面上下文
javax.servlet.http.HttpSession session = null; //session
final javax.servlet.ServletContext application; //applicationContext
final javax.servlet.ServletConfig config; //config
javax.servlet.jsp.JspWriter out = null; //out
final java.lang.Object page = this; //page:當前
HttpServletRequest request //請求
HttpServletResponse response //響應
3、輸出頁面前增加的程式碼
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
4、內建的物件能在JSP中直接使用
訪問JSP頁面的流程:
在JSP頁面中;
只要是JAVA程式碼就會原封不動的輸出;
如果是HTML程式碼,就會被轉換為:
out.write("<h1>登入</h1>\r\n");
8.3 JSP基本語法
EL表示式:${ }
JSP表示式
<% = new java.util.Date() %>
JSP指令碼片段
<% for (int i = 0; i < 5; i++) { %>
<h2> Start ${i} </h2>
<% }%>
JSP宣告
<%! static {
System.out.println("這是 PIG");
}
private int value = 20;
public void domeFuncation(){
System.out.println("PIG AGE IS"+value);
}
%>
JSP宣告:會被編 譯到JSP生成Java的類中!其他的,就會被生成到 _jspService方法中!
JSP的註釋不會顯示在客戶端,而HTML會顯示
8.4 JSP 指令
1、定製錯誤頁面
<%--JSP裡:定製錯誤頁面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>
<%--web.xml裡:定製錯誤頁面--%>
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
2、404頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>404 ERROR</title>
</head>
<body>
<h1>糟糕,訪問丟失了...</h1>
<img src="../images/404.jfif" title="訪問丟失">
</body>
</html>
2、新增網頁頭和網頁尾
<%--第一種:兩個頁面和當前頁面 合在一起 --%>
<%@ include file="/common/Header.jsp"%>
<h2>Start</h2>
<%@ include file="/common/footer.jsp"%>
<%--第二種:3個頁面拼接在一起,本質還是3個--%>
<jsp:include page="common/Header.jsp"/>
<h2>Start</h2>
<jsp:include page="common/footer.jsp"/>
8.5 9大內建物件
- PageContext 存東西
- Request 存東西
- Response
- Session 存東西
- Application【ServletContext】 存東西
- config 【ServletConfig】
- out
- page
- exception
8.6 JSP標籤、JSTL標籤、EL表示式
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<!-- JSTL表示式 依賴-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<!-- standard 標籤庫-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表示式:$ { }
-
獲取資料
-
執行運算
-
獲取web開發的常用物件
JSTL標籤
JSTL標籤庫的使用就是為了彌補HTML標籤的不足;它自定義許多標籤,可以供我們使用,標籤的功能和Java程式碼一樣!
<jsp:forward page="dome03.jsp">
<jsp:param name="name" value="ppx"/>
<jsp:param name="age" value="18"/>
</jsp:forward>
格式化標籤
SQL 標籤
XML 標籤
JSTL 函式
核心標籤
JSTL標籤庫使用步驟:
-
引入對應的 taglib
-
使用其中的方法
-
在 Tomcat也需要引入jstl的包,否則會報錯:JSTL解析錯誤
JSTL:if測試
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心標籤庫,才能使用JSTL標籤--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSTL if測試</title>
</head>
<body>
<h2> 測試 DOME </h2>
<%-- <div>--%>
<form action="jstlDome01.jsp" method="get">
<input type="text" name="username" value="${param.username}" >
<input type="submit" value="Login...">
</form>
<%--
test:條件
var:儲存 變數名
value:賦值
--%>
<hr/>
<c:if test="${param.username == '123'}" var="isAdmin" >
<c:out value="jin ru le"></c:out>
</c:if>
<c:out value="${isAdmin}"></c:out>
</body>
</html>
JSTL:choose when 測試
<body>
<h1>choose when 判斷</h1>
<hr/>
<form action="jstlDome02.jsp" methon="get">
<input type="number" name="score" />
<input type="submit" value="start">
</form>
<hr/>
<c:choose>
<%-- param . name :可以取得 name 的值 --%>
<c:when test="${param.score >= 90}">優秀</c:when>
<c:when test="${param.score >= 80}">良好</c:when>
<c:when test="${param.score >= 60}">及格</c:when>
<c:when test="${param.score <= 59}">失敗</c:when>
</c:choose>
<hr/>
</body>
9、JavaBean
IDEA連線MySQL出現錯誤,解決地址:連線地址
10、 MVC三層架構
什麼是MVC:Model view Controller 模型、檢視、控制器
10.1 以前的架構
使用者直接訪問控制層,控制層就可以直接操作資料庫
servlet --> CRUD --> 資料庫
弊端:程式十分的臃腫,不利於維護
servlet的程式碼中:處理請求、響應、檢視跳轉、處理JDBC、處理業務程式碼、處理邏輯程式碼