B/S 架構(gòu):瀏覽器 / 服務(wù)器 耗啦。
C/S 架構(gòu):客戶端 / 服務(wù)器 哈打。
- 修改Tomcat域名:
- 第一步:可以通過修改Tomcat文件下的conf/server.xml文件斑粱,找到<Host>氧吐,里面有name屬性褪秀,可以自定義去修改空猜,如www.cwx.com,不要去修改<Engine>里的localhost绽慈,這是引擎不能亂動恨旱!
- 第二步:在C盤下的windows/system32/drivers/etc/hosts文件下,添加127.0.0.1 www.cwx.com坝疼,保存后即可通過訪問http://www.cwx.com8080訪問Tomcat主頁面搜贤。
網(wǎng)站是如何訪問的?
- 第一步:輸入一個域名钝凶,回車仪芒。
- 第二步:檢查本機的C:\Windows\System32\drivers\etc\hosts文件中是否有這個域名映射。
- 如果有:直接返回對應(yīng)的IP地址耕陷,這個地址中有我們需要訪問的web程序
- 如果沒有:則會去DNS服務(wù)器里面去找掂名,找到的話就返回,找不到就返回找不到該網(wǎng)頁哟沫。
Tips:DNS服務(wù)器是全球范圍內(nèi)的域名管理服務(wù)器饺蔑。
- http默認端口:80,https(安全的)默認端口:443
- http1.0:客戶端可以與web服務(wù)器連接后南用,只能獲得一個web資源膀钠,在斷開連接。
- http1.1:客戶端可以與服務(wù)器連接后裹虫,可以獲得多個web資源肿嘲。
- 狀態(tài)碼:
- 200:請求響應(yīng)成功。
- 3xx:請求重定向(讓用戶重新定位到自己設(shè)置的地址)筑公。
- 404:找不到網(wǎng)頁雳窟,403:被禁止。
- 5xx:服務(wù)器代碼錯誤匣屡,502:網(wǎng)關(guān)錯誤封救。
Maven的核心思想:約定大于配置(有約束,不要去違反)
Servlet
- 簡介:servlet是sun公司提供開發(fā)動態(tài)web的一門技術(shù)捣作。
- Sun在這些API中提供了一個接口servlet誉结,想要開發(fā)一個Servlet程序,只需要完成兩個步驟:
- 編寫一個類券躁,實現(xiàn)servlet接口
- 把開發(fā)好的Java類部署到web服務(wù)器中
- Sun公司提供了兩個默認的實現(xiàn)了servlet接口的類:HttpServlet惩坑,GenericServlet,我們可以直接繼承這個HttpServlet類也拜。要實現(xiàn)doGet()和doPost()方法以舒,兩方法之間可以互相調(diào)用,只是請求方式不一樣慢哈,業(yè)務(wù)邏輯是一樣的蔓钟。
- 編寫Servlet的映射(在web.xml中)
- 為什么需要映射:我們寫的是java程序,但是要通過瀏覽器訪問卵贱,而瀏覽器需要連接web服務(wù)器滥沫,所以我們需要在web服務(wù)器中注冊我們寫的Servlet侣集,還需要給他一個訪問路徑。
<!-- 注冊servlet--> <servlet> <servlet-name>hello(要與下面的name一致才能被找到)</servlet-name> <servlet-class></servlet-class> </servlet> <!--Servlet的請求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern><!--這是請求的路徑兰绣,訪問該路徑才能實現(xiàn)自己寫的Servlet的功能--> </servlet-mapping>
Tips:這里寫路徑可以用*通配符肚吏,但是它前面不能加任何東西。只能寫
*hello
,不能寫成hello*
狭魂。
Servlet原理
- 流程:首先瀏覽器發(fā)送http請求,到web容器(相當于Tomcat服務(wù)器)中党觅,此時web容器會產(chǎn)生兩個對象request雌澄、response,這兩個對象會調(diào)用service(ServletRequest rq,ServletResponse rp)方法杯瞻,request會從service方法中拿到請求并把請求之后的響應(yīng)傳給response镐牺,web容器就會讀取響應(yīng)信息,讀到后就將信息響應(yīng)到瀏覽器魁莉。
ServletContext
web容器在啟動的時候睬涧,它會為每一個web程序都創(chuàng)建一個對應(yīng)的ServletContext對象,這個對象就代表了每個web應(yīng)用旗唁。這樣有什么作用畦浓?
- 共享數(shù)據(jù)(不常用這種方法,經(jīng)常使用session等其他方式實現(xiàn)):我們在這個Servlet中保存的數(shù)據(jù)检疫,可以在另外一個Servlet中拿到(相當于每個web應(yīng)用都有一個小的ServletContext讶请,但是還有一個全局的ServletContext,這里面包含所有的數(shù)據(jù))屎媳。
public class helloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletResponse resp,HttpServletRequest req ) throws servletException, IOException {
ServletContext context = this.getServletContext();
String name = "cwx";
context.setAttribute("name",name);//數(shù)據(jù)保存在ServletContext中夺溢,名字為name,值為cwx
}
@Override
protected void doGet(HttpServletResponse resp,HttpServletRequest req ) throws servletException, IOException {
doGet(resp,req);
}
}
讀取的方法操作這個類似烛谊,在另一個servlet中調(diào)用context.getAttribute("設(shè)置的名稱")
- 獲取初始化參數(shù)(很少用)
<!--配置一些web應(yīng)用初始化參數(shù)-->
<context-param>
<param-name>url</param-name>
<param-value>這是初始化的參數(shù)</param-value>
</context-param>
protected void doGet(HttpServletResponse resp,HttpServletRequest req ) {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
- 請求轉(zhuǎn)發(fā)(一般我們會使用request方法轉(zhuǎn)發(fā)风响,而不用context.getRequestDispatcher("/xxx").forward(resp,req)方法,這里作為了解)丹禀。
Tips:轉(zhuǎn)發(fā)只是頁面變成了我們想要轉(zhuǎn)發(fā)的頁面状勤,URL地址不會變,重定向則會改變URL湃崩。
轉(zhuǎn)發(fā)和重定向的區(qū)別:例如荧降,A想獲得C的資源,但是A不能直接訪問到C攒读,這時A通知B自己的請求朵诫,B再獲得C資源,再給A薄扁,A只和B發(fā)生了交流這是轉(zhuǎn)發(fā)剪返。重定向是A要獲得C資源废累,先向B請求,B再通知A到C里拿資源脱盲,A和B和C都發(fā)生了交流邑滨,這是重定向。
- 讀取資源文件
- Properties文件
- 在java目錄下新建properties(需要在pom文件<build>中設(shè)置掃描的路徑)
- 在resources目錄下新建properties(不需要在<bulid>中設(shè)置钱反,默認有的)
發(fā)現(xiàn):這些properties文件都被打包到了同一個路徑下:classes掖看,我們俗稱這個路徑為classpath(類路徑);
//例子: 通過ServletContext獲得properties資源文件
protected void doGet(HttpServletResponse resp,HttpServletRequest req ) {
ServletContext context = this.getServletContext();
InputStream in = context.getResourceAsStream("/WEB-INF/classes/db.properties")//將文件變成流面哥,想要獲得文件就必須通過流來連接
Properties propertie = new Properties();
propertie.load(in);
ptopertie.getProperty("name");//獲得文件里name的值
}
中文亂碼的問題
- 后臺寫的數(shù)據(jù)有中文哎壳,傳到頁面上出現(xiàn)亂碼
//這里是在實現(xiàn)Servlet類的類中寫的,主要是記住哪兩個方法 response.setContextType("text/html"); response.setCharacterEncoding("utf-8");
- 請求的數(shù)據(jù)中有中文尚卫,傳到后臺出現(xiàn)亂碼
request.setCharacterEncoding("utf-8");
HttpServletResponse(響應(yīng))
- 下載文件:
1.獲取文件下載的路徑 归榕,下載的文件名是啥?
2.讓瀏覽器支持下載我們的文件
3.獲取下載文件的輸入流
4.創(chuàng)Buffer建緩沖區(qū)吱涉,獲取OutputStream對象
5.將FileOutputStream流寫入到buffer緩沖區(qū)
6.使用OutputStream將緩沖區(qū)里的數(shù)據(jù)輸出到客戶端protected void doGet(HttpServletResponse resp,HttpServletRequest req )throws IOException { // 1.獲取文件下載的路徑 刹泄,下載的文件名是啥? String realPath = "文件的絕對地址"; String fileName = realPath.substring(realPath.lastIndexOf("http://") + 1);//獲得文件名怎爵,通過獲得最后一個'/'后面的數(shù)據(jù)作為文件名 // 2.讓瀏覽器支持下載我們的文件 resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));//防止中文名出現(xiàn)亂碼 // 3.獲取下載文件的輸入流 FileInputStream in = new FileInputStream(realPath); // 4.創(chuàng)Buffer建緩沖區(qū)特石,獲取OutputStream對象 int len=0; byte[] buffer = new byte[1024]; // 5.將FileOutputStream流寫入到buffer緩沖區(qū),使用OutputStream將緩沖區(qū)里的數(shù)據(jù)輸出到客戶端 ServletOutputStream out = new resp.getOutputStream(); while ((len=in.read(buffer))!=-1){ out.write(buffer,0,len); } in.close(); out.close(); }
- 驗證碼功能
protected void doGet(HttpServletResponse resp,HttpServletRequest req )throws IOException { resp.setHeader("reflesh","3");//實現(xiàn)三秒刷新一次網(wǎng)頁 //內(nèi)存中創(chuàng)建一個圖片,長80疙咸,寬20 BufferImage image = new BufferImage(80,20,BufferImage.TYPE_INT_RBG); Graphics2D g = (Graphics2D ) image.getGraphics();//g 就相當于筆县匠,用于畫圖 //設(shè)置圖片的顏色 g.setColor(Color.white); //填充白色背景顏色 g.fillRect(0,0,80,20); //給圖片寫數(shù)據(jù) g.setColor(Color.bule); g.setFont(new Font(null,Font.BLOD,20)); g.draw(makeNum(),0,20);//開始畫數(shù)字 //告訴瀏覽器用圖片方式打開 resp.setContentType("image/jpg"); //網(wǎng)站存在緩存,取消網(wǎng)站的緩存 resp.setDateHeader("expries",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把這個圖片寫入到瀏覽器中 ImageIO.write(image,"圖片",resp.getOurputStream); } //生成四位隨機數(shù)方法 private String makeNum(){ Random random = new Random(); String num = random.nextInt("9999")+"";//隨機生成四位數(shù) StringBuffer sb = new StringBuffer(); for(int i=0; i<4-random.length();i++){ num.append("0");//當位數(shù)不夠使自動將0填滿 } num= sb.toString()+num; return num; }
- 實現(xiàn)重定向
- 常見場景:用戶登錄
//實現(xiàn)重定向的原理 /* resp.setHeader("Location","/xxx");//設(shè)置重定向的URL地址 resp.setStatus(302);//設(shè)置重定向的狀態(tài)碼 */ resp.sendRedirect("/xxx"); //調(diào)用重定向的方法
HttpServletRequest(請求)
- jsp中利用
{pageContext.request.getContextPath()}
獲得當前URL地址撒轮,req.getParmeter("名稱")
獲得發(fā)送請求的參數(shù)req.getParmeterValues("名稱")
獲得多個參數(shù)乞旦。
Cookie、Session
-
Session(會話):用戶打開一個瀏覽器题山,點擊了很多超鏈接兰粉,訪問了多個web資源,關(guān)閉瀏覽器顶瞳,這個過程可稱之為會話玖姑,會話是服務(wù)器技術(shù),數(shù)據(jù)存儲在服務(wù)端慨菱。
- 服務(wù)器會為每一個用戶(瀏覽器)創(chuàng)建一個Session焰络,只要瀏覽器沒關(guān)Session就存在,例如:用戶登錄某個網(wǎng)站后符喝,不論訪問哪個頁面都會顯示用戶處于登錄狀態(tài)闪彼,說明Session保存了用戶信息。
- 獲得session:
Session session = req.getSession()
- 添加session:
session.setArttribute(name,object)
- 設(shè)置session的有效時間:在
<session-config>
中的<session-timeout>
設(shè)置(web.xml中)。 - 銷毀session:
session.removeAttribute("name");session.invalidate();
- Cookie:客戶端技術(shù)畏腕,數(shù)據(jù)只會存儲在客戶端缴川。
//舉例:在客戶端設(shè)置一個cookie記錄上次訪問網(wǎng)站的時間
protected void doGet(HttpServletResponse resp,HttpServletRequest req )throws IOException {
Cookie[] cookies = req.getCookies();
if(cookies!=null){
resp.getWriter().print("你上一次訪問的時間是:");
for(int i=0; i<cookies.length(); i++){
Cookie cookie=cookies[i];
if(cookie.getName().equals("lastLoginTime")){
long lastLoginTime = long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
resp.getWriter().print(date.toLocaleString());//將時間類型轉(zhuǎn)換為字符串類型
}
}
}else
{
resp.getWriter().print("這是你第一次訪問該網(wǎng)站!");
}
//服務(wù)器給客戶端響應(yīng)一個cookie
Cookie cookie =new Cookie("lastLoginTime",System.currentTimeMillis()+"")//cookie只能存字符串類型描馅!
//設(shè)置cookie的一天有效時間
cookie.setMaxage(24*60*60);
resp.addCookie(cookie);//response 響應(yīng)給客戶端
}
- 一個網(wǎng)站cookie是否存在上限把夸?
1.一個web站點可以給瀏覽器發(fā)送多個cookie,最多存放為20個铭污。
2.整個瀏覽器最多存放300個cookie
3.每個cookie限制大小為4kb