緇忓父鏈夋湅鍙嬮棶璧鳳紝JSP鍜孲ervlet涔嬮棿鏈変粈涔堝尯鍒紝涓よ呬箣闂村張鏈変粈涔堣仈緋伙紵鍏跺疄Servlet鎶鏈殑鍑虹幇鏃墮棿寰堟棭錛屾槸褰撴椂涓轟簡Java鐨?a >鏈嶅姟鍣?/font>绔簲鐢ㄨ屽紑鍙戠殑銆傚ぇ瀹墮兘鐭ラ亾Applet鏄簲鐢ㄥ皬紼嬪簭錛孲ervlet灝辨槸鏈嶅姟鍣?/font>绔皬紼嬪簭浜嗐備絾鍦∕icrosoft鍏徃鐨凙SP鎶鏈嚭鐜板悗錛屼嬌鐢⊿ervlet榪涜鍝嶅簲杈撳嚭鏃朵竴琛岃鐨勮緭鍑鴻鍙ュ氨鏄懼緱闈炲父絎ㄦ嫏錛屽浜庡鏉傚竷灞鎴栬呮樉紺洪〉闈㈡洿鏄姝ゃ侸SP灝辨槸涓轟簡婊¤凍榪欑闇姹傚湪Servlet鎶鏈箣涓婂紑鍙戠殑銆傚彲瑙侊紝JSP鍜孲ervlet涔嬮棿鏈夌潃鍐呭湪鐨勮緙樺叧緋伙紝鍦ㄥ涔燡SP鏃訛紝濡傛灉鑳藉鎶撲綇榪欑鑱旂郴錛屽氨鑳芥洿娣卞埢鍦扮悊瑙SP鐨勮繍琛屾満鐞嗭紝杈懼埌浜嬪崐鍔熷嶇殑鏁堟灉銆?
鏈枃灝嗛氳繃瀵逛竴涓狫SP榪愯榪囩▼鐨勫墫鏋愶紝娣卞叆JSP榪愯鐨勫唴騫曪紝騫朵粠鍏ㄦ柊鐨勮瑙掗槓榪頒竴浜汮SP涓殑鎶鏈鐐廣?
HelloWorld.jsp
鎴戜滑浠omcat 4.1.17鏈嶅姟鍣?/font>涓轟緥錛屾潵鐪嬬湅鏈綆鍗曠殑HelloWorld.jsp鏄庝箞榪愯鐨勩?
浠g爜娓呭崟1錛欻elloWorld.jsp
HelloWorld.jsp
<%
String message = "Hello World!";
%>
<%=message%> |
銆銆榪欎釜鏂囦歡闈炲父綆鍗曪紝浠呬粎瀹氫箟浜嗕竴涓猄tring鐨勫彉閲忥紝騫朵笖杈撳嚭銆傛妸榪欎釜鏂囦歡鏀懼埌Tomcat鐨剋ebapps\ROOT\鐩綍涓嬶紝鍚姩Tomcat錛屽湪嫻忚鍣ㄤ腑璁塊棶http://localhost:8080/HelloWorld.jsp錛屾祻瑙堝櫒涓殑杈撳嚭涓衡淗elloWorld!鈥?
銆銆璁╂垜浠潵鐪嬬湅Tomcat閮藉仛浜嗕粈涔堛傝漿鍒癟omcat鐨刓work\Standalone\localhost\_鐩綍涓嬶紝鍙互鎵懼埌濡備笅鐨凥elloWorld_jsp.java錛岃繖涓枃浠跺氨鏄疶omcat瑙f瀽HelloWorld.jsp鏃剁敓鎴愮殑婧愭枃浠訛細
銆銆浠g爜娓呭崟2錛欻elloWorld_jsp.java
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
public class HelloWorld_jsp extends HttpJspBase {
......
public void _jspService(HttpServletRequest request,
HttpServletResponse response)throws java.io.IOException, ServletException
{
JspFactory _jspxFactory = null;
javax.servlet.jsp.PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=ISO-8859-1");
pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
String message = "Hello World!";
out.print(message);
} catch (Throwable t) {
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (pageContext != null) pageContext.handlePageException(t);
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
}
}
} |
銆銆浠庝笂闈㈠彲浠ョ湅鍑猴紝HelloWorld.jsp鍦ㄨ繍琛屾椂棣栧厛瑙f瀽鎴愪竴涓狫ava綾籋elloWorld_jsp.java錛岃綾葷戶鎵夸簬org.apache.jasper.runtime.HttpJspBase鍩虹被錛孒ttpJspBase瀹炵幇浜咹ttpServlet鎺ュ彛銆傚彲瑙侊紝JSP鍦ㄨ繍琛屽墠棣栧厛灝嗙紪璇戜負涓涓猄ervlet錛岃繖灝辨槸鐞嗚ВJSP鎶鏈殑鍏抽敭銆?
銆銆鎴戜滑榪樼煡閬揓SP欏甸潰涓唴緗簡鍑犱釜瀵硅薄錛屽pageContext銆乤pplication銆乧onfig銆乸age銆乻ession銆乷ut絳夛紝浣犲彲鑳戒細濂囨紝涓轟粈涔堝湪JSP涓殑浠g爜鐗囨柇涓彲浠ョ洿鎺ヤ嬌鐢ㄨ繖浜涘唴緗璞°傝瀵焈jspService()鏂規(guī)硶錛屽疄闄呬笂榪欏嚑涓唴緗璞″氨鏄湪榪欓噷瀹氫箟鐨勩傚湪瀵笿SP鏂囦歡涓殑浠g爜鐗囨柇榪涜瑙f瀽涔嬪墠錛屽厛瀵硅繖鍑犱釜鍐呯疆瀵硅薄榪涜鍒濆鍖栥?
銆銆棣栧厛錛岃皟鐢↗spFactory鐨刧etDefaultFactory()鏂規(guī)硶鑾峰彇瀹瑰櫒瀹炵幇錛堟湰鏂囦腑鎸嘥omcat 4.1.17錛夌殑涓涓狫spFactory瀵硅薄鐨勫紩鐢ㄣ侸spFactory鏄痡avax.servlet.jsp鍖呬腑瀹氫箟鐨勪竴涓娊璞$被錛屽叾涓畾涔変簡涓や釜闈欐佹柟娉晄et/getDefaultFactory()銆俿et鏂規(guī)硶鐢盝SP瀹瑰櫒錛圱omcat錛夊疄渚嬪寲璇ラ〉闈ervlet錛堝嵆HelloWorld_jsp綾伙級鐨勬椂鍊欑疆鍏ワ紝鎵浠ュ彲浠ョ洿鎺ヨ皟鐢↗spFactory.getDefaultFactory()鏂規(guī)硶寰楀埌榪欎釜JSP宸ュ巶鐨勫疄鐜扮被銆俆omcat鏄皟鐢╫rg.apache.jasper.runtime.JspFactoryImpl綾匯?
銆銆鐒跺悗錛岃皟鐢ㄨ繖涓狫spFactoryImpl鐨刧etPageContext()鏂規(guī)硶錛屽~鍏呬竴涓狿ageContext榪斿洖錛屽茍璧嬬粰鍐呯疆鍙橀噺pageConext銆傚叾瀹冨唴緗璞¢兘緇忕敱璇ageContext寰楀埌銆傚叿浣撹繃紼嬭涓婇潰鐨勪唬鐮侊紝榪欓噷涓嶅啀璧樿堪銆傝欏甸潰Servlet鐨勭幆澧冭緗畬姣曪紝寮濮嬪欏甸潰榪涜瑙f瀽銆侶elloWorld.jsp欏甸潰浠呬粎瀹氫箟浜嗕竴涓猄tring鍙橀噺錛岀劧鍚庣洿鎺ヨ緭鍑恒傝В鏋愬悗鐨勪唬鐮佸涓嬶細
銆銆浠g爜娓呭崟3錛欽SP欏甸潰瑙f瀽鍚庣殑浠g爜鐗囨柇
String message = "Hello World!";
out.print(message); |
銆銆瀹氬埗鏍囩鐨勮В鏋愯繃紼?/b>
銆銆鍦ㄤ竴涓腑澶у瀷鐨刉eb搴旂敤涓紝閫氬父浣跨敤JSP瀹氬埗鏍囩鏉ュ皝瑁呴〉闈㈡樉紺洪昏緫銆傚墫鏋愬鍣ㄥ瀹氬埗鏍囩鐨勮В鏋愯繃紼嬶紝瀵規(guī)垜浠繁鍏ョ悊瑙e畾鍒舵爣絳劇殑榪愯鏈虹悊闈炲父鏈夊府鍔┿備笅闈㈡垜浠互Struts1.1b涓檮甯︾殑struts-example搴旂敤鐨勪富欏佃繍琛屼負渚嬪姞浠ヨ鏄庛?
銆銆鍖呭惈瀹氬埗鏍囩鐨刬ndex.jsp
銆銆Struts1.1b鐨勪笅杞藉湴鍧鏄痟ttp://jakarta.apache.org/struts/index.html銆傚皢涓嬭澆鐨勫寘瑙e帇錛屽湪webapps鐩綍涓嬪彲浠ユ壘鍒皊truts-example.war銆傚皢璇ar鍖呮嫹璐濆埌Tomcat鐨剋ebapps鐩綍涓嬶紝Tomcat浼氳嚜鍔ㄥ畨瑁呮搴旂敤鍖呫傚湪嫻忚鍣ㄤ腑閫氳繃http://localhost:8080/struts-example璁塊棶struts-example搴旂敤錛屽皢鏄劇ず搴旂敤鐨勯欏碉紙瑙佸浘1錛夈?

銆銆鍥句竴 搴旂敤鐨勯欏?
銆銆浠g爜娓呭崟4錛歩ndex.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html locale="true">
<head>
<title><bean:message key="index.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
鈥︹?
</body>
</html:html> |
銆銆鎴戜滑浠呬互index.jsp涓殑<bean:message/>鏍囩鐨勮В鏋愪負渚嬭繘琛屽垎鏋愶紝鐪嬪鍣ㄦ槸鎬庢牱鎶婅繖涓嚜瀹氫箟鏍囩瑙f瀽鎴怘TML杈撳嚭鐨勩備笂闈唬鐮佺渷鐣ヤ簡欏甸潰鐨勫叾瀹冩樉紺洪儴鍒嗐傞鍏堬紝鏌ョ湅涓婇潰嫻忚鍣ㄤ腑欏甸潰鐨勬簮鏂囦歡錛?/ccid_code>
<html lang="zh">
<head>
<title>MailReader Demonstration Application (Struts 1.0)</title>
</head>
<body bgcolor="white">
鈥︹?
</body>
</html> |
銆銆鍙錛屽鍣ㄥ凡緇忔妸<bean:message key="index.title"/>鏇挎崲鎴愪竴涓瓧涓詫紝鏄劇ず涓洪〉闈㈢殑鏍囬銆?/ccid_code>
銆銆瑙f瀽榪囩▼
銆銆閭d箞錛孞SP瀹瑰櫒鏄庢牱瀹屾垚瑙f瀽鐨勫憿錛熸煡鐪嬪湪宸ヤ綔鐩綍jakarta-tomcat-4.1.17\work\Standalone\localhost\struts-example涓嬭В鏋愬悗鐨刬ndex_jsp.java鏂囦歡錛?
銆銆浠g爜娓呭崟5錛歩ndex_jsp.java
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
public class index_jsp extends HttpJspBase {
//涓烘墍鏈夌殑瀹氬埗鏍囩瀹氫箟澶勭悊鍣ㄦ睜綾葷殑寮曠敤
private org.apache.jasper.runtime.TagHandlerPool 錛?
_jspx_tagPool_bean_message_key;
鈥︹?
//欏甸潰綾繪瀯閫犳柟娉?
public index_jsp() {
_jspx_tagPool_bean_message_key =
new org.apache.jasper.runtime.TagHandlerPool();
鈥︹?
}
public void _jspService(HttpServletRequest request,
銆銆HttpServletResponse response)
銆銆throws java.io.IOException, ServletException {
鈥︹?
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this,
銆銆request, response,null, true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
鈥︹?
if (_jspx_meth_html_html_0(pageContext))
return;
鈥︹?
}
//欏甸潰鍦ㄥ鐞嗛鍑烘椂閲婃斁鎵鏈夊畾鍒舵爣絳劇殑灞炴?
public void _jspDestroy() {
_jspx_tagPool_bean_message_key.release();
鈥︹?
}
} |
銆銆鐢熸垚鐨刬ndex_jsp.java緇ф壙浜巓rg.apache. jasper.runtime.HttpJspBase銆傜爺絀惰繖涓枃浠朵負鎴戜滑浜嗚В瀹氬埗鏍囩鐨勮繍琛屾満鐞嗘彁渚涗簡閫斿緞銆?
銆銆浠庝笂闈㈠彲浠ョ湅鍑猴紝Tomcat鍦ㄨВ鏋愪竴涓狫SP欏甸潰鏃訛紝棣栧厛涓烘瘡涓涓畾鍒舵爣絳懼畾涔夊茍瀹炰緥鍖栦簡涓涓猅agHandlerPool瀵硅薄銆傞〉闈㈢殑澶勭悊鏂規(guī)硶瑕嗙洊鐖剁被鐨刜 jspService()鏂規(guī)硶錛宊jspService鏂規(guī)硶棣栧厛鍒濆鍖栫幆澧冿紝涓哄唴緗璞¤祴鍊箋傜敱浜巌ndex.jsp欏甸潰鏁翠綋鐢變竴涓?lt;html:html/>鏍囩鍖呰9錛孴omcat瀵規(guī)瘡涓涓爣絳鵑兘浜х敓涓涓鏈夋柟娉曞姞浠ュ疄鐜般?lt;html:html/>鏍囩鐨勫鐞嗘柟娉曟槸_jspx_meth_html_html_0()銆傝繖涓柟娉曠殑鍛藉悕瑙勮寖澶у涔熷彲浠ヤ粠榪欓噷鐪嬪嚭錛屽氨鏄淿jspx_meth 錛?鏍囩鐨勫墠緙 錛?鏍囩鍚?錛?璇ユ爣絳懼湪JSP欏甸潰鍚岀被鏍囩涓嚭鐜扮殑搴忓彿鈥濄傚叾瀹冩爣絳鵑兘琚寘鍚湪璇ユ爣絳句腑錛屾墍浠ュ叾瀹冩爣絳懼湪_jspx_meth_html_html_0()鏂規(guī)硶涓繘琛岃В鏋愩傚叿浣撶殑浠g爜瀹炵幇璇峰弬瑙佽禌榪綉http://linux.ccidnet.com鏈熷垔嫻忚2003騫寸6鏈熴?/ccid_code>
銆銆鍦╛jspx_meth_html_html_0()鏂規(guī)硶涓紝棣栧厛浠巁jspx_tagPool_html_html_locale姹犱腑寰楀埌涓涓猳rg.apache.struts.taglib.html.HtmlTag鐨勫疄渚嬶紝鐒跺悗璁劇疆榪欎釜tag瀹炰緥鐨勯〉闈笂涓嬫枃鍙婁笂綰ф爣絳撅紝鐢變簬html:html鏍囩鏄〉闈㈢殑鏈欏跺眰鏍囩錛屾墍浠ュ畠鐨刾arent鏄痭ull銆傜劧鍚庡璇ユ爣絳劇殑鍐呭榪涜瑙f瀽銆侶TML浠g爜鐩存帴杈撳嚭錛屼笅闈富瑕佺湅鐪?lt;html:html></html:html>鏍囩涔嬮棿鍖呭惈鐨?lt;bean:message key="index.title"/>鏍囩鐨勮В鏋愩傚bean:message鏍囩鐨勮В鏋愮被浼間簬html:html錛孴omcat涔熷皢鍏舵斁鍏ヤ竴涓崟鐙殑鏂規(guī)硶_jspx_meth_bean_message_0()涓繘琛屻?/ccid_code>
銆銆bean:message鏍囩鐨勮В鏋?
銆銆浠g爜娓呭崟7錛歘jspx_meth_bean_message_0()鏂規(guī)硶鐗囨柇
//瀵筸essage瀹氬埗鏍囩鐨勫鐞嗘柟娉?
private boolean _jspx_meth_bean_message_0(
javax.servlet.jsp.tagext.Tag _jspx_th_html_html_0,
javax.servlet.jsp.PageContext pageContext) throws Throwable {
JspWriter out = pageContext.getOut();
/* ---- bean:message ---- */
org.apache.struts.taglib.bean.MessageTag
_jspx_th_bean_message_0 =
(org.apache.struts.taglib.bean.MessageTag)
_jspx_tagPool_bean_message_key.get(
org.apache.struts.taglib.bean.MessageTag.class);
_jspx_th_bean_message_0.setPageContext(pageContext);
_jspx_th_bean_message_0.setParent(_jspx_th_html_html_0);
_jspx_th_bean_message_0.setKey("index.title");
int _jspx_eval_bean_message_0 = _jspx_th_bean_message_0.doStartTag();
if (_jspx_th_bean_message_0.doEndTag()== javax.servlet.jsp. tagext.Tag.SKIP_PAGE)
return true;
_jspx_tagPool_bean_message_key.reuse(_jspx_th_bean_message_0);
return false;
} |
銆銆鍚屾牱錛屽html:bean涔熼渶瑕佷粠姹犱腑寰楀埌涓涓爣絳劇被鐨勫疄渚嬶紝鐒跺悗璁劇疆鐜銆傝繖閲屼笉鍐嶈禈榪般傛垜浠彧涓撴敞瀵筂essageTag瀹氬埗鏍囩綾葷壒孌婄殑澶勭悊閮ㄥ垎銆傚畾鍒舵爣絳劇被鐨勫紑鍙戜笉鍦ㄦ湰鏂囪璁鴻寖鍥翠箣鍐呫傚湪index.jsp涓畾涔変簡涓涓猙ean:message鏍囩錛屽茍璁劇疆浜嗕竴涓睘鎬э細<bean:message key="index.title"/>銆俆omcat鍦ㄨВ鏋愭椂錛岃皟鐢∕essageTag瀵硅薄鐨刱ey灞炴ц緗柟娉晄etKey()錛屽皢璇ュ睘鎬х疆鍏ャ傜劧鍚庤皟鐢∕essageTag鐨刣oStartTag()鍜宒oEndTag()鏂規(guī)硶錛屽畬鎴愯В鏋愩傚鏋渄oEndTag()鏂規(guī)硶鐨勮繑鍥炲間負javax.servlet.jsp.tagext.Tag. SKIP_PAGE錛岃〃鏄庡凡緇忓畬鎴愯В鏋愶紝榪斿洖true錛孴omcat灝嗙珛鍗沖仠姝㈠墿浣欓〉闈唬鐮佺殑鎵ц錛屽茍榪斿洖銆傚惁鍒欐妸璇essageTag鐨勫疄渚嬫斁鍥炴睜涓?/ccid_code>
銆銆鏍囩綾誨璞″疄渚嬬殑姹犲寲
銆銆涓轟簡鎻愰珮榪愯鏁堢巼錛孴omcat瀵規(guī)墍鏈夌殑瀹氬埗鏍囩綾昏繘琛屼簡姹犲寲錛屾睜鍖栧伐浣滅敱org.apache.jasper. runtime.TagHandlerPool綾誨畬鎴愩俆agHandlerPool綾諱富瑕佹湁涓や釜鏂規(guī)硶錛屼唬鐮佸涓嬶細
銆銆浠g爜娓呭崟8錛歍agHandlerPool.java
public class TagHandlerPool {
private static final int MAX_POOL_SIZE = 5;
private Tag[] handlers;
public synchronized Tag get(Class handlerClass) throws JspException {鈥︹
public synchronized void reuse(Tag handler) {鈥︹
} |
銆銆TagHandlerPool綆鍗曞湴瀹炵幇浜嗗鏍囩綾葷殑姹犲寲錛屽叾涓璏AX_POOL_SIZE鏄睜鐨勫垵濮嬪ぇ灝忥紝handlers鏄竴涓猅ag鐨勬暟緇勶紝瀛樺偍鏍囩綾葷殑瀹炰緥銆俫et(Class handlerClass)寰楀埌涓涓寚瀹氭爣絳劇被鐨勫疄渚嬶紝濡傛灉姹犱腑娌℃湁鍙敤瀹炰緥錛屽垯鏂板疄渚嬪寲涓涓俽euse(Tag handler)鎶奾andler瀵硅薄鏀懼洖姹犱腑銆?
銆銆鑷蟲錛屾垜浠JSP鍦ㄥ鍣ㄤ腑鐨勮繍琛岃繃紼嬪凡緇忎簡鐒朵簬鑳鎬簡銆傝櫧鐒舵瘡縐岼SP瀹瑰櫒鐨勮В鏋愮粨鏋滀細鏈夊樊寮傦紝浣嗗叾涓殑鍘熺悊閮介浄鍚屻傚浜庣紪鍐橨SP搴旂敤錛屾垜浠茍涓嶉渶瑕佸共娑夊鍣ㄤ腑鐨勮繍琛岃繃紼嬶紝浣嗗鏋滀綘瀵規(guī)暣涓簳灞傜殑榪愯鏈哄埗姣旇緝鐔熸?zhèn)夊Q屽氨鑳藉JSP/Servlet鎶鏈湁鏇存繁鐨勮璇嗐?
|