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
public class User{
private String uid;
private String username;
private String password;
@Setter @Getter
private String phone;
}
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 {
Cookie cookie=new Cookie("lk","it666");
resp.addCookie(cookie);
}
}
Cookie預設儲存時間:
1)預設cookie為會話級別:開啟瀏覽器關閉瀏覽器為y依次會話。
如果不設定持久化時間,cookie會儲存在瀏覽器記憶體中,瀏覽器關閉cookie資訊銷燬。
2)設定cookie在客戶端儲存時間:
cookie.setMaxAge(int second);
設定的時間為秒;如果設定持久時間 cookie的資訊會持久到瀏覽器磁碟檔案中,過期會自動刪除。
3)設定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自己名稱的那一個。
Cookie[] cookies=request.getCookies();
if(cookies!=null){
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 c=new Cookie("lastTime",currentTime);
response.addCookie(c);
String lastTime=null;
Cookie[] cookies=request.getCookies();
if(cookies!=null){
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註釋
3)jsp註釋<%--..--%> 可見範圍:jsp原始碼
3、jsp指令