1. 程式人生 > >Servlet基礎使用完成轉發和重定向

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接受後

servletJSP中轉發定向知識複習

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. 跳到外部站點 轉