Servlet基礎使用完成轉發和重定向
要知道servlet的使用需要了解servlet的工作基礎
什麼是servlet:sun公司制訂的一種用來擴充套件web伺服器功能的元件規範。
servlet之前是使用cgi(common gateway interface),收到請求會呼叫cgi,後面servlet就因運而生,是一種更好的技術,需要符合一定的元件規範,即實現部分軟體模組,元件需要部署到容器的內部,servlet本身就是一種容器。
下面是基於瀏覽器和客戶端的請求詳細圖解:
編寫一個簡單servlet程式,在Eclipse中新建一個web工程:
首先需要在src目錄下新建一個類繼承HttpServlet,可以重寫HttpServlet中的service方法實現相應的功能,還需要在WEB-INF目錄下找到web.xml,在其中配置
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.heying.web.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern >
</servlet-mapping>
Java code:
public class HelloServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
public void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8" );
PrintWriter out = resp.getWriter();
out.print("hello servlet !<br>");
out.print("i am a programmer !<br>");
out.close();
}
}
這個程式使用的是PrintWriter 來輸出一個頁面資料返回型別是text/html
這邊是一個簡單的servlet程式,需要完成複雜的功能還需要後面繼續學習
為了更好的瞭解servlet需要知道幾個簡單知識點:
什麼是Http協議:由w3c制訂的一種網路應用層協議,規定了瀏覽器與web伺服器之間如何通訊以及相應的資料格式。目前已經出現Https協議(加密的)。
通訊步驟大致分為:
1.瀏覽器建立與伺服器之間的連線。
2.瀏覽器將請求資料打包併發送。
3.伺服器將響應資料打包併發送。
4.伺服器立即關閉連線。
一次請求一次連線,高效
資料格式:
請求行:請求方式 請求資源路徑 協議型別和版本
訊息頭:是一些鍵值對,表示特定的含義,瀏覽器與伺服器之間都可以傳送。比如,瀏覽器可以傳送一個”User-Agent”訊息頭,告訴伺服器,瀏覽器的型別和版本。
實體內容:只有當請求方式為post的時候,實體內容才有資料(請求引數),如果請求方式是get,請求引數會新增到請求資源路徑的後面。
狀態行: 協議及版本 狀態碼 狀態描述,比如404 500等錯誤程式碼
get和post請求:
get請求:
1.會將請求引數新增到請求資源路徑的後面,因為請求行最多隻能存放2k左右的資料,所以,get請求只能傳送少量的請求引數。
2.會將請求引數顯示在瀏覽器位址列,不安全比如,路由器會記錄訪問地址。
post請求:
設定了表單的method=”post”。
1.將請求引數放到實體內容裡面,所以,可以提交大量的資料給伺服器。
2.不會將請求引數顯示在瀏覽器位址列,相對安全(不會加密,對於敏感資料,需要加密)。
輸出中文:
java語言使用unicode字符集來儲存字元。
編碼:將unicode字符集對應的位元組陣列轉換成某種本地字符集(gbk,utf-8等等)對應的位元組陣列。
解碼:某種本地字符集(gbk,utf-8等等)對應的位元組陣列轉換成unicode字符集對應的位元組陣列。
路徑問題:
相對路徑
不以”/”開頭的路徑。
絕對路徑
以”/”開頭的路徑。
不要直接寫絕對路徑,要使用以下方法獲得應用名:request.getContextPath()
cookie技術:
伺服器臨時儲存在瀏覽器端的少量的資料。
當瀏覽器向伺服器傳送請求時,伺服器會將少量的資料以set-cookie訊息頭的方式傳送給瀏覽器,瀏覽器會將這些資料臨時儲存下來;當瀏覽器再次訪問伺服器時,會將之前儲存的資料以cookie訊息頭的方式傳送給伺服器。
使用new Cookie(String name,String value)來設定 response.addCookie(…);
幾個簡單的知識先了解後,來簡單說明下servlet的工作原理和過程servlet的生命週期:
1. 例項化
器收到請求之後,建立servlet物件,需要給這個servlet配置引數。該引數是一個大於等於0的整數。值越小,優先順序越高(先被建立)
2. 容器在建立好servlet物件之後,會立即呼叫該物件的init方法,初始化方法(init)只會執行一次。一般情況下,我們不用寫init方法,因為GenericServlet已經提供了init方法的實現
實現過程:
將容器傳遞進來的ServletConfig物件儲存下來,並且提供了一個getServletConfig方法來獲得這個物件。
3. 初始化引數
company
xxxx
ServletConfig.getInitParameter(“company”);
4. 就緒狀態會依據請求型別分別呼叫doGet或者doPost方法,可以
override HttpServlet的service方法 或 override HttpServlet的doGet/doPost
5.銷燬
容器在刪除servlet物件之前,會呼叫該物件的destroy方法,destroy方法只會執行1次,一般不需要寫自己的destroy方法,GenericServlet已經提供了實現。
引入jsp技術
jsp:sun公司制訂的一種伺服器端動態頁面技術規範。
因為使用servlet,雖然也可以生成動態頁面,但是,過於繁瑣(需要使用out.println語句),並且難以維護(修改頁面,就需要修改java原始碼),所以,sun公司才制訂了jsp規範。
jsp其實就是一個以”.jsp”為字尾的檔案,該檔案的內容主要是html和少量的java程式碼。jsp檔案會被容器轉換成一個servlet然後執行,在tomcat的容器中有個work目錄下就是jsp轉換為servlet的臨時目錄,頁面被編譯為printwriter中輸出。
jsp語法:
<% java程式碼 %>
<%= java表示式 %>
隱含物件:
session ,pagecontext,request,response等
導包:
<%@page import=”java.util.*”%>
<%@page import=”java.util.,java.text.“%>
servlet容器如何處理請求資源路徑:
精確匹配:
要求的值必須是/abc.bcd。
萬用字元匹配:
使用”*”匹配0個或者多個字元。
/*
字尾匹配:
*.do
下面是以前我寫的交友網站為例:
在web.xml使用*.do 字尾模糊匹配多個類是請求:checkcode是驗證碼的servlet
<servlet>
<servlet-name>ActionServlet</servlet-name>
<servlet-class>web.ActionServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>CheckcodeServlet</servlet-name>
<servlet-class>web.CheckcodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>CheckcodeServlet</servlet-name>
<url-pattern>/checkcode</url-pattern>
</servlet-mapping>
擷取uri請求地址路徑:
String uri = request.getRequestURI();
String action = uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf("."));
在jsp頁面的form表單的action使用不同的請求地址:
把頁面資料繫結到request上:
request.setAttribute(..,..);
繫結資料到頁面
request.getRequestDispatcher("login.jsp")
.forward(request, response);
比如需要的使用刪除後重新整理,需要使用到重定向:
response.sendRedirect("login.jsp");
驗證碼頁面程式碼:
<img id="img1" border="1" src="checkcode" onclick="this.src='checkcode?' + Math.random();"/>
<a href="javascript:;" onclick="document.getElementById('img1').src='checkcode?'+ Math.random();">看不清,換一個</a>
java:
package web;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class CheckcodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 一、繪圖
*/
/*
* step1,建立一個記憶體映像物件(畫布) BufferedImage(寬度,高度,型別)
*/
BufferedImage image = new BufferedImage(80, 30,
BufferedImage.TYPE_INT_RGB);
/*
* step2,獲得一個畫筆
*/
Graphics g = image.getGraphics();
/*
* step3,給筆設定顏色
*/
Random r = new Random();
g.setColor(new Color(255, 255, 255));
/*
* step4,給畫布設定背景顏色 fillRect(x,y,width,height)
*/
g.fillRect(0, 0, 80, 30);
/*
* step5,繪圖
*/
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
// Font(字型,風格,大小)
g.setFont(new Font(null, Font.ITALIC, 22));
String number = getNumber(5);
// 將number綁訂到session物件上
HttpSession session = request.getSession();
session.setAttribute("number", number);
// drawString(String,x,y) x,y是左下角的座標
g.drawString(number, 2, 23);
// step6,加一些干擾線
for (int i = 0; i < 12; i++) {
g.drawLine(r.nextInt(80), r.nextInt(30), r.nextInt(80), r
.nextInt(30));
}
/*
* 二、將圖片壓縮併發送給瀏覽器
*/
// 設定content-type訊息頭,告訴
// 瀏覽器返回的是圖片
response.setContentType("image/jpeg");
// 一定要獲得位元組輸出流
OutputStream ops = response.getOutputStream();
// write方法會對原始圖片(image)按照
// 指定的壓縮演算法(jpeg)進行壓縮,並且
// 將壓縮之後的資料輸出到指定的流(ops)。
javax.imageio.ImageIO.write(image, "jpeg", ops);
ops.close();
}
/*
* 生成一個驗證碼,該驗證碼由"A~Z","0~9"中 隨機選取5個字元組成
*/
private String getNumber(int size) {
String rs = "";
String strs = "ABCDEFGHIJKLMNOPQ" + "RSTUVWXYZ0123456789";
Random r = new Random();
for (int i = 0; i < size; i++) {
rs += strs.charAt(r.nextInt(strs.length()));
}
return rs;
}
}
相關推薦
Servlet基礎使用完成轉發和重定向
要知道servlet的使用需要了解servlet的工作基礎 什麼是servlet:sun公司制訂的一種用來擴充套件web伺服器功能的元件規範。 servlet之前是使用cgi(common gateway interface),收到請求會呼叫cgi,後面se
servlet轉發和重定向
strong 技術 過程 std 進行 logs font request java 1 轉發 RequestDispatcher getRequestDispatcher(java.lang.String path) 1)地址欄不會改變 2)轉發只能轉發到當前web應用內
JavaWeb(一)Servlet中亂碼解決與轉發和重定向的區別
這也 charset 都是 war 不一定 調用 技術 請求方式 註冊 前言 前面其實已經把Servlet中所有的內容都介紹完了,這篇講補充一點亂碼和重定向與轉發之間的區別! 一、request請求參數出現亂碼問題 1.1、get請求 1)亂碼示例 g
servlet學習(四)請求轉發和重定向
一、請求轉發和重定向兩者之間的區別 請求轉發:一次請求,位址列資訊不變。 重定向:兩次請求,位址列資訊會發生改變。 使用時機: 1.如果表單中有資料,而資料又比較重要,不能重複提交,建議使用重定向。 2.如果servlet接受後
servlet和JSP中轉發和重定向知識複習
1:servlet中轉發 、包含、和重定向 請求轉發:(源元件留頭不留體,目標元件留體不留頭) Servlet(源元件)先對客戶請求做一些預處理操作(一般是對響應頭進行處理),然後把請求轉發給其他Servlet(目標元件)來完成包括生成響應結果在內的後續操作。 實現方法:re
Servlet(五):請求轉發和重定向
請求轉發: 問題: 伺服器在接收到瀏覽器的請求後,僅僅使用一個 Servlet進行請求處理,會造成不同的Servlet邏輯程式碼 冗餘,Servlet的職責不明確。 解決: 使用請求轉發。 特點: 一次請求 位址列資訊不改變。 Request 物件作用域
Servlet跳轉到JSP頁面,轉發和重定向
web專案名為0809 轉發 request.getRequestDispatcher("/jsp/zhuanfa.jsp").forward(request, response); 重定向 response.sendRedirect("/0809/jsp/chong
WEB基礎問題:請求轉發和重定向的區別是什麼?
看了網上很多回答,基本都講的比較長和詳細,但是該問題一般在面試中問的比較多, 先總結如下: 基本的區別是:請求轉發是在伺服器內部轉發,重定向約等於於從外部訪問伺服器 請求轉發因為是從伺服器內部轉發,所以請求轉發能夠訪問WEB-INF資料夾下的資源 這點重定向無法辦
WEB專案-使用重定向完成登入功能(轉發和重定向的區別)
使用重定向 使用狀態碼302和location頭完成重定向 程式碼: @WebServlet("/demo3") public class ServletDemo3 extends HttpServlet { private static final long serialVersio
深入理解Servlet轉發和重定向
一、轉發 轉發的原理,可以通過下圖展示: 瀏覽器的請求傳送給元件1,元件1經過一些處理之後,將request和response物件“傳遞”給元件2,由元件2繼續處理,然後輸出響應(當然,也可以繼續向其他元件“傳遞”),這個傳遞的過程稱之為“轉發”。整
Servlet的轉發和重定向的區別
response.sendredirect("http://www.foo.com/path/error.html"); 重定向和轉發有一個重要的不同:當使用轉發時,JSP容器將使用一個內部的方法來呼叫目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面
Servlet中Request請求轉發和重定向遇到的亂碼問題
已經把專案的文字編碼格式改成了utf-8,但還是在轉發的時候遇到亂碼。 先把我的程式碼拷上來 package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.
Request作為域物件存取資料 Request作為域物件;請求轉發和重定向都可以完成頁面跳轉
Request作為域物件存取資料 Request作為域物件 Request作為域物件的API Attribute:屬性 標誌的意思 向Request域中儲存資料:setAttribute(Stri
Servlet之轉發和重定向的區別
邏輯 jsp 一個 地址 span 目標 主頁 servlet status 應該是出自github上的項目JavaGuide 轉發是服務器行為,重定向是客戶端行為。轉發(Forword) 通過RequestDispatcher對象的forward(HttpServl
javaweb之Servlet,http協議以及請求轉發和重定向
本文是作者原創,版權歸作者所有.若要轉載,請註明出處. 一直用的框架開發,快連Servlet都忘了,此文旨在幫自己和大家回憶一下Servlet主要知識點.話不多說開始吧 用idea構建Servlet專案 專案結構如下 什麼是 Servle
jsp學習之——關於請求轉發和重定向的形象理解
本質 url 博文 客戶端 style 讓我 esp 方法 rect 1.重定向:是屬於客戶端行為,實現方法:response.sendRedirect() 從本質上講等同於兩次請求,前一次的請求對象不會保留,在瀏覽器上的直觀表現是——地址欄的URL地址會改變。 2.請求轉
SpringMVC核心技術---轉發和重定向
mvc 定向 return span attr pre DDU color redirect @Controller public class Mycontroller { //轉發 @RequestMapping("/adduser") publ
SpringMVC筆記(六)SpringMVC的轉發和重定向
配置文件 turn 返回 請求 字符串類型 情況 spring 讓我 ota 一、轉發和重定向 一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理 如果返回的字符串中帶 forward: 或 redirect: 前綴 時,SpringMVC 會對他們進行特殊處理
轉發和重定向的區別
角色 行為 轉發 裏來 for 根據 邏輯 目標地址 一個 forward(轉發): 是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因為這個跳轉過程實在服務器實現的,
JSP轉發和重定向的區別
div mage alt send p s 分享圖片 ima 一次 nbsp 重定向: response.sendRedirect("地址"); a. 頁面地址顯示最終頁面 b. 不可向後傳遞參數 c. 跳到外部站點 轉