G_05_JAVAWEB

LiLi,發表於2020-10-09
	1、TOMCAT啟動
		1)配置環境:
			將jdk檔案目錄 bin的上一目錄地址加入到JAVA_HOME當中
		2)開啟TOMCAT目錄下的bin中的startup.bat
		3)啟動後不要將startup.bat關掉
		4)測試是否啟動成功
			http://localhost:8080
	2、啟動過程出現埠衝突解決辦法
		1)cmd->netstat -aov
		2)查詢佔用8080埠的程式的pid
		3)ctrl+alt+delete開啟工作管理員->將對應PID的程式關閉
	3、TOMCAT WEB應用目錄結構
		webName:
			1)html jsp js
			2)WEB-INF
				i、classes目錄:java類位元組碼檔案
				ii、lib目錄:java類執行時需要的jar包
				iii、web.xml檔案:當前整個web應用的核心配置檔案
								可以到ROOT當中複製一個過來
				WEB-INF下的資源bbu不能直接通過瀏覽器訪問,是保護的外界不能直接訪問
	4、再javaee中建立web專案
		1)new->other->web->dynamic web project->選擇tomcat伺服器->2.5版本
	5、再eclipse中配置server伺服器
		window->preferences->server->runtime environments->新增tomcat伺服器
	6、再eclipse底欄 中留下server
		如果eclipse底欄無可通過以下步驟新增
			window->show view->將需要顯示的勾選
	7、我們再workspace中建立javaweb專案,所以需要將其加入到webapps中
		右擊server-》add and remove
		說明:
			1)會再tomcat的webapps目錄下建立一個m名稱mypro的目錄
			2)會把WEB-CONTENT當中所有內容f放入到webapps目錄下
			3)不會把java程式碼放入,執行時只需要位元組碼
		雙擊server
		選擇Use Tomcat installation 
		Deploy path :webapps
		右擊server-》start
	8、Tomcat啟動速度優化
		Dynamic web model version選擇2.5是考慮可以自動建立web.xml
		1)Dynamic web model version選擇3.0
		2)將Dynamic web model version選擇2.5建立的web.xml檔案複製過來
		3)將web.xml約束檔案改成3.0版本的 並再約束後面加<absolute-ordering/>
	9、釋出程式詳解:
		開啟Servers下的server.xml
		<Context docBase="mypro2" path="/mypro2" reloadable="true" source="org.eclipse.jst.jee.server:mypro2"/>
		表示將mypro2釋出到server中,
		Context:
			docBase:相對我門當初部署時webapps的檔案路徑
			path:表示url地址http://localhost:8080/mypro2 中8080後跟的內容
			reloadable:位元組碼變化伺服器是否重新載入web應用
	10、虛擬主機
		Host檔案:windows/System32/drivers/etc
			

二、Servlet和Servlet配置

	1、第一個Servlet程式
		1)建立一個web程式
		2)再src下c建立一個包名:com.it666.servlet
		3)再包當中建立一個class 起名為FirstServlet
		4)FirstServlet實現Servlet介面(重點看service)
		5)再web.xml進行配置
			<servlet>
				<servlet-name>abc</servlet-name>
				<servlet-class>com.it666.servlet.FirstServlet</servlet-class>
			</servlet>
			<servlet-mapping>
				<servlet-name>abc</servlet-name>
				<url-pattern>/first</url-pattern>
			</servlet-mapping>
	2、獲取位元組碼檔案
		Class clazz1=Class.forName("...");
		Class clazz2=Person.class;
		Person p=new Person()
		Class clazz3=p.getClass();
	3、通過位元組碼建立物件:
		Person p=(Person) clazz1.newInstance();
	3、通過有引數的構造器建立物件
		Constructor c=clazz1.getConstructor(String.class,Integer.class);
		Person p2=(Person)c.newInstance("魯班",6);
	4、獲取公共欄位
		Field f=clazz1.getField("name");
		f.set(p2,"李白");
	5、獲取私有欄位
		Field f=clazz1.getDeclaredField("age");
		f.setAccessible(true);
		f.set(p,20);
	6、獲取公共方法:
		Method m1=clazz1.getMethod("show");
	7、獲取私有方法
		Method m2=clazz1.getDeclaredMethod("eat",String.class);
		m2.setAccessible(true);
		m2.invoke(p2,"米飯");
	8、通過反射繞過集合泛型檢測
		ArrayList<Integer> list=new ArrsyList<>();
		list.add();
		 
		 Class<?>clazz=Class.forName("java.util.ArrayList");
		 Method m=clazz.getMethod("add",Object.class);
		 m.invoke(list,"dasd");
	9、Tomcat反射載入Servlet
	10、Servlet方法呼叫時機:
		1)init:當servlet建立時呼叫
		2)service:每一次傳送請求時呼叫
		3)destroy:servlet銷燬時呼叫(伺服器關閉時呼叫)
		啟動優先順序:
			<servlet>
				<servlet-name>abc</servlet-name>
				<servlet-class>com.it666.servlet.FirstServlet</servlet-class>	
				<load-on-startup>3</load-on-startup>
			</servlet>
			<servlet-mapping>
				<servlet-name>abc</servlet-name>
				<url-pattern>/first</url-pattern>
			</servlet-mapping>
	11、Servlet訪問流程
	12、init方法引數介紹:
		ServletConfig config:
		1)可以獲取一些配置資訊
			//1、可以獲取Servlet名稱(web.xml中的servlet-name中的值)
			String name=config.getServletName();
			//2、hhu獲取一些初始化引數web.xml
			String value=config.getInitParameter("myxq");
			<servlet>
				<servlet-name>abc</servlet-name>
				<servlet-class>com.it666.servlet.FirstServlet</servlet-class>	
				<init-param>
					<param-name>myxq</param-name>
					<param-value>1234</param-value>
				</init-param>
			</servlet>
			<servlet-mapping>
				<servlet-name>abc</servlet-name>
				<url-pattern>/first</url-pattern>
			</servlet-mapping>
			//3、獲取ServletContext
			ServletContext sc=config.getServletContext();
	13、使用註解建立servlet
		在web.xml的約束中,將metadata-complete="true"改成false,即進行註解掃描
		@WebServlet("/lkServlet")  括號中的內容是url-pattern
		public class LkServlet extends HttpServlet{	
		}
	14、doGet doPost:
		@WebServlet("/lkServlet")  括號中的內容是url-pattern
		public class LkServlet extends HttpServlet{
			private static final long serialVersionUID=1L;
			//一旦你寫了service就不會再找doGet doPost
			protected void service(HttpServletRequest request,HttpServletResponce responce)
			{}
			protected void doGet(HttpServletRequest request,HttpServletResponce responce)
			{}
			protected void doPost(HttpServletRequest request,HttpServletResponce responce)
			{}
		}
	14、ServletContext
	
		

三、Responce響應

	1、相應行:設定狀態碼
	response.setState(int code);
	2、響應頭:新增響應頭
	response.addHeader("name","it666");
	response.addIntHeader("age",10);
	response.addDateHeader("my-Date",new Date().getTime());
	3、修改響應頭
	response.setHeader("name","lk");
	response.setIntHeader("age",20);
	4、response重定向
		到伺服器中找servlet1結果servlet1當中沒有這個資源,告訴你去找servlet2,再去傳送一個請求到servlet2
		1)狀態碼:302
		2)特點:要訪問兩次伺服器
		第一次訪問是人為的去訪問,第二次是自動訪問。瀏覽器位址列已經發生變化
		3)設定重定向
			//設定狀態碼
			response.setStatus(302);
			//設定響應頭
			response.setHeader("location","/bei/servlet2");
			//內部封裝的重定向
			response.sendRedirect("/bei/servlet2");
			//定時重新整理重定向 隔3秒才去轉發
			response.setHeader("refresh","3;url=/bei/servlet2");
	5、設定響應體
		//寫字元
		response.getWriter().write("it666");
		//如果字元當中有html瀏覽器會幫你解析
		response.getWriter().write("<h1>it666</h1>");
		//解決中文亂碼,再中文之前ssh設定緩衝區編碼UTF-8
		response.setCharacterEncoding("UTF-8);
		response.getWriter().write("我叫");
		//上述設定編碼可以解決伺服器中文編碼,但有時瀏覽器編碼非utf-8也會發生亂碼,以下再servlet中告訴瀏覽器用何種編碼接收
		response.setHeader("Content-Type","text/html;charset=UTF-8");
		簡寫:
		response.setContentType("text/html;charset=UTF-8");
	6、FileInputSteam讀取一個字元
		String path=this.getServletContent().getRealPath("a.txt");
		FileInputStream in=new FileInputStream(path);
		//讀取位元組碼
		//讀取一個字元
		System.out.println(in.read());
		System.out.println(in.read());
		System.out.println(in.read());
		in.close();
	7、FileInputStream讀取多個字元
		String path=this.getServletContent().getRealPath("a.txt");
		FileInputStream in=new FileInputStream(path);
		byte[] buffer=new byte[3];
		//len返回當前讀取了幾個字元 如果一個字元都沒讀返回-1
		len=in.read(buffer);
	8、FileInputStream讀取整個檔案
		ine len=0;
		while((len=in.read(buffer))!=-1){
			System.out.println(Arrays.toString(buffer);
			System.out.println(new String(buffer,0,len));
		}
	9、Response響應圖片
		String path=this.getServletContent().getRealPath("a.png");
		FileInputStream in=new FileInputStream(path);
		//獲取一個輸出流
		ServletOutPutStream out=response.getOutputStream();
		byte[] buffer=new byte[1024];
		while((len=in.read(buffer))!=-1){
			System.out.println(Arrays.toString(buffer);
			out.write(buffer,0,len);
		}
	10、檔案下載
		1)a標籤下載
			<a href="/26-Servlet/download/a.mp4">a.mp4</a>
			<a href="/26-Servlet/download/code.png">code.png</a>
			<a href="/26-Servlet/download/c.rar">c.rar</a>
		2)傳送servlet下載
			在html中填寫:
			<a href="/26-Servlet/DownloadServlet?filename=a.mp4">a.mp4</a>
			<a href="/26-Servlet/DownloadServlet?filename=code.png">a.mp4</a>
			<a href="/26-Servlet/DownloadServlet?filename=c.rar">a.mp4</a>
			在servlet的service中填寫:
			String name=request.getParameter("filename");
			//根據檔名來獲取mime型別
			String mimeType =this.getServletContent().getMimeType(name);
			//設定mimeType
			response.setContentType(mimeType);
			//告訴瀏覽器是以附件形式來下載,不要解析
			response.setHeader("Content-Disposition","attachment;filename="+name);
			String path=this.getServletContext().getRealPath("download/"+name);
			根據path載入檔案
			FileInputStream in= new FileInputStream(path);
			ServletOutputStream out=response.getOutputStream();
			byte[] buffer =new byte[1024];
			int len=0;
			while((len=in.read(buffer))!=-1){
				out.write(buffer,0,len);
			}
		
	

四、request

	1、獲取請求
		1)在index.html當中
		<form action="/27-Request/RequestServlet">
			<input type="text" placeholder="請輸入一些資訊...">
			<input type="submit" value="提交" placeholder="請輸入一些資訊...">
		</from>
		2)servlet
		@WebServlet("/RequestServlet")
		public class RequestServlet extends HttpServlet{
			private static final long serialVersionUID=1L;
			protected void service(HttpServletRequest request,HttpServletResponse response){
				//請求行
				//1、獲取請求方式
				String method =request.getMethod();
er				StringBuffer requestURL=request.getRequestURL();
				String requestURI=request.getRequestURI();
				//3、獲取get請求引數
				String queryString=request.getQueryString();
				//4、獲取當前web應用名稱
				String contextPath=request.getContextPath();

				//請求頭
				//1、獲取所有的請求頭名稱
				Enumeration<String> headNumbers=request.getHeaderNames();
				while(headerNames.hasMoreElements()){
					System.out.println("name="+headerNames.nextElement());
				}
				//2 根據名稱獲取指定
			}
		}

五、登入註冊功能

	1、每次建立domain都要建立getter和setter方法,比較冗餘,可以安裝lombok
		1)lombok
			官方地址::https://projectlombok.org/
			github:https://github.com/rzwitserloot/lombok
			是一款小巧的程式碼生成工具
			自動生成getter 和setter方法
			提高開發效率
			程式碼簡潔 直觀 減少大量冗餘程式碼
			減少後期的維護成本
		2)Ideal中lombok安裝
			下載:http://projectlombok.org/download
			網盤地址:https://pan.baidu.com/s/1nJseVJGq8llSKDPQ2IEyeA 
					提取碼:zily 
		3)eclipse安裝lombok     
			1)下載lombok.jar  http://projectlombok.org/download
			2)開啟下載的lombok資料夾
				按住shift同時滑鼠右鍵 點選命令視窗
			3)執行lombok.jar
				在lombok.jar所在目錄中開啟cmd  輸入java-jar .\lombok.jar
			4)執行後會出現新的介面
				介面中會自動找到eclipse.exe所在路徑 
				如果沒找到自己指定位置即點選Specify location 找到eclipse.exe所在目錄
			5)點選install/upstate即安可安裝
		4)ideal安裝lombok
			[lombok安裝教程](https://jingyan.baidu.com/article/0a52e3f4e53ca1bf63ed725c.html)
		4)eclipse中lombok匯入jar包方式
			1)第一種方式
			將lombok.jar放入WEB-INF下的lib目錄下
			點選buildPath
			弊端:每個工程都要匯入
			2)第二種方式
			右擊專案名->選擇BuildPath ->Config Build Path
			點選Add library 選擇user library 點選按鈕User Libraries 點選new  輸入名字(例如lombok)  點選add External JARs  找到lombok.jar並開啟  點選Apply andClose
			使用時
			右擊專案名->選擇BuildPath->ConfigBuild Path->add library->UserLibrary->選擇lombok
			
		@getter@setter
		public class logit {
    		private String uid;
    		private String username;
		}
	2、lombok其它註解
		1)作用域
		@Getter @Setter//寫到類上表名所有欄位都新增Getter Setter方法
		public class User{
			private String uid;
			private String username;
			private String password;
			@Setter @Getter
			private String phone;//在某一個欄位前面新增Getter Setter可以只對某一個欄位新增Getter Setter
		}
		2)其它註解方法
		@ToString
		@EqualsAndHashCode
		@NoArgsConstructor   無參構造器
		@AllArgsConstructor  有參構造器

六、Cookie與Session

	1、會話技術:
		使用者開啟一個瀏覽器-》點開多個超連結 訪問伺服器多個web資源-》給關閉瀏覽器
		這個過程稱為一個會話
	2、會話技術解決什麼問題:
		保持各個客戶端自己的資料
		每個使用者在使用瀏覽器與伺服器會話過程中,不可避免會產生一些資料,程式要先辦法為每個使用者儲存這些資料
	3、Ideal當中沒有找到Servlet檔案建立位置解決辦法
		1、按住 ctrl shift alt S  進入Libraries ->按住左上角+->新增java->將tomcat bin目錄下的servlet-api.jar匯入
		2、選擇Modules-》點選左上角+->選擇Web-->選擇你要操作的專案->Source Roots勾選上
		3、點選Facets->左上角+->點選Web-》選擇你對應的專案
		[無Servlet解決辦法](https://blog.csdn.net/qq_36927265/article/details/103508689?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param)
	4、Cookie
	@WebServlet(name = "CookieServlet")
	public class CookieServlet extends HttpServlet {
   	 	private static final long serialVersionUID=1L;
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、建立Cookie
        Cookie cookie=new Cookie("lk","it666");
        //2、響應給瀏覽器
        resp.addCookie(cookie);
    	}
	}
	Cookie預設儲存時間:
		1)預設cookie為會話級別:開啟瀏覽器關閉瀏覽器為y依次會話。
			如果不設定持久化時間,cookie會儲存在瀏覽器記憶體中,瀏覽器關閉cookie資訊銷燬。
		2)設定cookie在客戶端儲存時間:
			cookie.setMaxAge(int second);
			設定的時間為秒;如果設定持久時間 cookie的資訊會持久到瀏覽器磁碟檔案中,過期會自動刪除。
		3)設定Cookie攜帶路徑
		//訪問某一個資源時要不要帶cookie資訊
		//如果不設定攜帶路徑,m預設情況下會訪問建立cookie的web資源相同路徑都攜帶cookie資訊。
		http://localhost:8080/29-Cookie-Session/CookieServlet
		http://localhost:8080/29-Cookie-Session/CookieServlet2
		在CookieServlet檔案建立的cookie在CookieServlet2也能訪問到,因為它們都屬於同一個目錄http://localhost:8080/29-Cookie-Session/下。

		http://localhost:8080/29-Cookie-Session/myxq/CookieServlet
		http://localhost:8080/29-Cookie-Session/CookieServlet2
		在http://localhost:8080/29-Cookie-Session/myxq/下的Servlet檔案中建立的cookie在CookieServlet2中無法看到
		//設定攜帶路徑
		cookie.setPath(String path);
		cookie.setPath("/CookiePro/cookieServlet");只有訪問cookieServlet才攜帶cookie資訊
		cookie.setPath("/CookiePro");//訪問指定的工程時都會攜帶
		cookie.setPath("/");//訪問伺服器下部署的所有工程都會攜帶
	4)刪除cookie
		如果想刪除客戶端已經儲存的cookie資訊;
		使用同名同路徑下的c持久化時間為0d的cookie進行覆蓋j即可
		Cookie cookie=new Cookie("lk","it666");
		cookie.setMaxAge(0);
		response.addCookie(cookie);
	5)從伺服器獲取cookie
		通過Request物件的getCookies()方法,獲取的是所有的cookie.要進行遍歷找到z自己名稱的那一個。
		//1、獲取所有的cookie物件
		Cookie[] cookies=request.getCookies();
		if(cookies!=null){
			//遍歷所有的cookie
			for(Cookie cookie :cookies){
				String name=cookie.getName();
				if(name.equals("lk"))
					System.out.println(cookie.getValue());
			}
		}
	6)獲取上次訪問時間
		response.setContentType("text/html;charset=utf-8");
		//獲取當前時間
		Date date=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
		String currentTime=sdf.format(date);
		//建立cookie
		Cookie c=new Cookie("lastTime",currentTime);
		response.addCookie(c);
		//獲取當前cookie
		String lastTime=null;
		Cookie[] cookies=request.getCookies();
		if(cookies!=null){
			//遍歷所有的cookie
			for(Cookie cookie :cookies){
				if(cookie.getName().equals("lastTime"))
					lastTime=cookie.getValue();
			}
		}
		if(lastTime!=null)
			response.getWriter().write("你上次的登入時間為:"+lastTime);
			else
			response.getWriter().write("你是第一次登入");
	5、Session
		1)Session簡介:
			Session技術是將s資料儲存在伺服器端的技術
			會為每個客戶端都建立一塊記憶體空間儲存客戶資料;
			客戶端需要每次都攜帶一個標識ID去f伺服器找尋屬於自己的記憶體空間
			Session需要藉助於Cookie儲存客戶的唯一標識SESSIONID
		2)Session域物件
			Session物件獲取:
				HttpSession session=request.getSession();
				獲取專屬於當前會話的Session物件
				如果伺服器沒有該會話的Session物件會建立一個新的Session返滬
				如果已經有了s屬於該會話的Sessionz直接將已有的Session返回
				本質就是根據SESSIONID發現伺服器是否有Session
				HttpSession session=request.getSession();
				session.setAttribute("lk","www.it666.com");
			Session也是一個域物件
				session.setAttribute(String name,Object obj);
				session.getAttribute(String name);
				session.removeAttribute(String name);
		3)Session生命週期
			建立:第一次執行request.getSession()建立
			銷燬:伺服器關閉時;session過期;手動銷燬;瀏覽器關閉session就關閉是錯誤的。
			i、手動配置session過期時間(從最後一次操作開始計時):
				在web.xml中新增
				<session-config>
					<session-timeout>30</session-timeout>
				</session-config>
			在server中的web.xlm中配置上述session過期時間會使所有工程會話都生效
			應該在需要生效的專案下的web.xml中進行配置
			ii、手動銷燬
			session.invalidate();
			iii、作用範圍:預設在一次會話中即y一次會話中任何資源公用一個session
		4)
		清楚瀏覽器快取:ctrl+sift+delete

在這裡插入圖片描述

七、JSP

	1、jsp編寫java
		1<%...%>
		2)<%! ....%>
		3)<%=...%>
	2、java編寫註釋
		1)html註釋<!--...-->  可見範圍:jsp原始碼 翻譯後的servlet 頁面
		2)java註釋//  /* */ 可見範圍:jsp原始碼 翻譯後的servlet 頁面看不見
		3)jsp註釋<%--..--%> 可見範圍:jsp原始碼
	3、jsp指令