JSP與servlet之間的參數(shù)傳遞

四大作用域

要先知道四大作用域是什么,怎么運(yùn)作的陵珍。
什么是四大作用域非竿?(這部分知識(shí)在jsp基礎(chǔ)里面有提到過(guò),jsp里面有九個(gè)內(nèi)置對(duì)象酬凳,其中就有四個(gè)域?qū)ο螅?br> JSP中的四大作用域

page作用域
request作用域
session作用域
application作用域

這四個(gè)域?qū)ο缶褪窃趈sp和servlet類文件之間保存數(shù)據(jù)惠况、獲取數(shù)據(jù)、傳遞數(shù)據(jù)的對(duì)象
這四個(gè)域?qū)ο蟮淖饔梅秶煌校虼朔Q作四個(gè)作用域稠屠。

四個(gè)域?qū)ο笤斀?/h1>

想記清楚作用域,需要明白域?qū)ο蟮脑眙嵘弧6胍宄驅(qū)ο笕ú海梢酝ㄟ^(guò)看jsp實(shí)際在服務(wù)器上編譯成的java文件。

Tips:如何找到j(luò)sp的java文件煎谍?
在部署在服務(wù)器上的項(xiàng)目目錄下攘蔽,例如我的就在我的tomcat服務(wù)器下:
D:\Tomacat\apache-tomcat-8.5.43\work\Catalina\localhost\http_req_resp\org\apache\jsp\

首先先看我的test.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("3", 3);
%>
<%request.getRequestDispatcher("d1").forward(request, response); %>
</body>
</html>

它的java文件代碼是這樣的:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.43
 * Generated at: 2019-08-14 08:05:37 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class testArea_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;//pageContext是一個(gè)Servlet包中的pageContext的實(shí)例
    javax.servlet.http.HttpSession session = null;//session是一個(gè)HttpSession實(shí)例
    final javax.servlet.ServletContext application;//application是一個(gè)ServletContext實(shí)例
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;//這個(gè)是真正的page域?qū)ο?

    try {
      response.setContentType("text/html; charset=ISO-8859-1");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                null, true, 8192, true);//把頁(yè)面的信息用pageContext來(lái)引用
      _jspx_page_context = pageContext;//真正的page域?qū)ο螅。?      application = pageContext.getServletContext();//把原本服務(wù)器中的servletContext實(shí)例用application來(lái)引用
      config = pageContext.getServletConfig();
      session = pageContext.getSession();//把會(huì)話中new的session對(duì)象用session來(lái)引用
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"ISO-8859-1\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("<h1>ddddd</h1>\r\n");

request.setAttribute("3", 3);

      out.write('\r');
      out.write('\n');
request.getRequestDispatcher("d1").forward(request, response); 
      out.write("\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);//釋放掉page域?qū)ο蟆?    }
  }
}

可從上看出:

  • application只是單純的引用了系統(tǒng)中已經(jīng)存在的servletContext對(duì)象呐粘;session只是單純的引用了每次會(huì)話中都只創(chuàng)建一次的session對(duì)象满俗;page域?qū)ο笠仓皇且粋€(gè)單純的引用,但是因?yàn)樗詈蟊会尫帕俗麽灰虼怂麄兊淖饔梅秶@而易見
  • pageContext對(duì)象是jsp的上下文唆垃,可以獲取到servletContext、session等已經(jīng)存在的對(duì)象痘儡,這樣就能實(shí)現(xiàn)他們的作用范圍
  • request對(duì)象和response對(duì)象是用戶的請(qǐng)求和應(yīng)答降盹,可以被轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)還是那個(gè)對(duì)象;但是如果是重定向了蓄坏,那就是傳回客戶端再次請(qǐng)求的過(guò)程价捧,就不是同一個(gè)request了。

常說(shuō)的jsp往servlet三種傳值方式

  1. Form表單傳值涡戳,
  2. url傳值
    3.session傳值
    實(shí)際上application也就是servletContext也可以作為傳值结蟋,但是不太好;而request域?qū)ο笕绻獋髦悼梢允强梢杂嬲茫钱?dāng)你在jsp頁(yè)面上轉(zhuǎn)發(fā)到servlet的時(shí)候這個(gè)jsp界面所有東西都會(huì)一下子閃過(guò)嵌屎,內(nèi)容不會(huì)停留在瀏覽器上,這樣這個(gè)jsp就沒(méi)有存在的必要恍涂。

servlet給jsp傳值

  1. 重定向
    這種方式要傳值出去的話宝惰,只能在url中帶parameter或者放在session中,無(wú)法使用request.setAttribute來(lái)傳遞再沧。

  2. 轉(zhuǎn)發(fā)
    使用這種方式跳轉(zhuǎn)尼夺,傳值可以使用三種方法:使用url中帶parameter或使用session或使用request.setAttribute

總結(jié)

  • 其實(shí)通過(guò)四個(gè)域?qū)ο髠鲄⒌脑砗芎?jiǎn)單:
    同一個(gè)對(duì)象數(shù)據(jù)就不會(huì)丟,不同的對(duì)象就不能傳參啦炒瘸!
  • 平常開發(fā)就使用常用的幾種傳值方式就好
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淤堵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子顷扩,更是在濱河造成了極大的恐慌拐邪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘截,死亡現(xiàn)場(chǎng)離奇詭異扎阶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)婶芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門乘陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人雕擂,你說(shuō)我怎么就攤上這事〖” “怎么了井赌?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贵扰。 經(jīng)常有香客問(wèn)我仇穗,道長(zhǎng),這世上最難降的妖魔是什么戚绕? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任纹坐,我火速辦了婚禮,結(jié)果婚禮上舞丛,老公的妹妹穿的比我還像新娘耘子。我一直安慰自己果漾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布谷誓。 她就那樣靜靜地躺著绒障,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捍歪。 梳的紋絲不亂的頭發(fā)上户辱,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音糙臼,去河邊找鬼庐镐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛变逃,可吹牛的內(nèi)容都是我干的必逆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼韧献,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼末患!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锤窑,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤璧针,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后渊啰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體探橱,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年绘证,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隧膏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚷那,死狀恐怖胞枕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魏宽,我是刑警寧澤腐泻,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站队询,受9級(jí)特大地震影響派桩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚌斩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一铆惑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦员魏、人聲如沸丑蛤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盏阶。三九已至,卻和暖如春闻书,著一層夾襖步出監(jiān)牢的瞬間名斟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工魄眉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砰盐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓坑律,卻偏偏與公主長(zhǎng)得像岩梳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晃择,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • JSP總結(jié)(經(jīng)典) day1 JSP 定義: 1)Java Server Page, Java EE 組件冀值,本...
    java日記閱讀 3,442評(píng)論 0 13
  • Part 1 @Description:Report of Servlet Basic, Part 1 @Date...
    susu2016閱讀 638評(píng)論 0 3
  • 1.學(xué)習(xí)內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對(duì)象&標(biāo)簽介紹 EL表達(dá)式&EL的內(nèi)置對(duì)象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,136評(píng)論 1 18
  • Jsp技術(shù)總結(jié) 1. 什么是JSP JSP即Java Server Pages,它和servlet技術(shù)一樣...
    java日記閱讀 1,654評(píng)論 0 18
  • 本文包括:1宫屠、Listener簡(jiǎn)介2列疗、Servlet監(jiān)聽器3、監(jiān)聽三個(gè)域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器4浪蹂、監(jiān)聽三個(gè)域?qū)?..
    廖少少閱讀 6,065評(píng)論 6 28