本文實(shí)例講述了JSP程序運(yùn)行原理、文檔結(jié)構(gòu)及簡(jiǎn)單輸入輸出。分享給大家供大家參考。具體如下:
目標(biāo):
掌握Web應(yīng)用的文檔結(jié)構(gòu);
掌握J(rèn)SP的運(yùn)行原理;
掌握J(rèn)SP的簡(jiǎn)單輸入和輸出。
主要內(nèi)容:
通過一個(gè)簡(jiǎn)單實(shí)例介紹Web應(yīng)用的文檔結(jié)構(gòu)和運(yùn)行原理;
通過一個(gè)簡(jiǎn)單的注冊(cè)功能介紹基本的輸入輸出。
實(shí)現(xiàn)內(nèi)容:客戶端驗(yàn)證。
1、 文檔結(jié)構(gòu)
每個(gè)應(yīng)用都有一個(gè)根目錄,例如ch2;理論上可以放在任何地方,但是需要配置,簡(jiǎn)單的做法,直接放在了webapps這個(gè)目錄下,在這個(gè)目錄的應(yīng)用會(huì)被自動(dòng)加載。
在根目錄下會(huì)有一個(gè)WEB-INF目錄,這個(gè)目錄中的文件不能被遠(yuǎn)程訪問,主要存放配置文件和類文件、資源文件。
在WEB-INF中的配置文件是web.xml,每個(gè)web應(yīng)用都會(huì)有這樣一個(gè)配置文件。
在WEB-INF有兩個(gè)文件用于存放類文件和資源文件,lib和classes,lib下面存放以壓縮包jar形式存在的類庫(kù),classes直接存放類文件(包含包的信息)。
頁(yè)面文件(包括jsp文件、html文件、圖片文件)可以放在根目錄(ch2)下面,或者下面的子文件夾(不能放在WEB-INF)中。
2、 運(yùn)行方式
訪問方式:http://192.168.0.222:8080/ch2/ch2.jsp
前提:把Web應(yīng)用部署到服務(wù)器上,啟動(dòng)服務(wù)器。
下面以ch2.jsp為例介紹訪問過程:
1)客戶端通過瀏覽器發(fā)送請(qǐng)求;
2)Web服務(wù)器接收這個(gè)請(qǐng)求,然后轉(zhuǎn)給應(yīng)用服務(wù)器;
3)應(yīng)用服務(wù)器會(huì)查找客戶要訪問的文件,假設(shè)訪問的文件為ch2.jsp;分兩種情況:
第一次訪問:應(yīng)用服務(wù)器把JSP文件轉(zhuǎn)換成Java文件;然后編譯成class文件;然后加載類;實(shí)例化對(duì)象并初始化;
后續(xù)訪問:JSP文件對(duì)應(yīng)的頁(yè)面對(duì)象已經(jīng)存在,直接查找到這個(gè)對(duì)象;
4)應(yīng)用服務(wù)器封裝請(qǐng)求信息,然后調(diào)用相應(yīng)的方法;
5)應(yīng)用服務(wù)器把方法執(zhí)行結(jié)果(響應(yīng)客戶的內(nèi)容)傳遞給Web服務(wù)器;
6)Web服務(wù)器把這個(gè)結(jié)果發(fā)給客戶端;
7)客戶端瀏覽器把接收到的html代碼解析成網(wǎng)頁(yè)。這個(gè)就是我們看到的結(jié)果。
下面是運(yùn)行過程中的幾個(gè)文件內(nèi)容。
源文件Ch2.jsp的內(nèi)容:
DDDDDDDDDDDDDDDDDDDDDDDD
%="FFFFFFFFFFFFFFFF"%>
轉(zhuǎn)換后的文件ch2_jsp.java:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class ch2_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = JspFactory.getDefaultFactory().getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("DDDDDDDDDDDDDDDDDDDDDDDD/r/n");
out.print("FFFFFFFFFFFFFFFF");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
返回給客戶端的信息(通過瀏覽器的查看源文件功能可以看到):
DDDDDDDDDDDDDDDDDDDDDDDD
FFFFFFFFFFFFFFFF
3、 無(wú)狀態(tài)的請(qǐng)求應(yīng)答模式
用戶通過客戶端發(fā)送請(qǐng)求,可以通過地址欄、超鏈接、按鈕或者表單元素的事件請(qǐng)求。不管采用什么方式發(fā)送請(qǐng)求,這些請(qǐng)求信息都會(huì)被封裝成HttpServletRequest對(duì)象,服務(wù)器會(huì)把這個(gè)對(duì)象作為參數(shù)去調(diào)用頁(yè)面對(duì)象,這個(gè)方法執(zhí)行完會(huì)對(duì)客戶端響應(yīng),之后這個(gè)HttpServletRequest對(duì)象就被刪除了。如果再次發(fā)送請(qǐng)求,會(huì)創(chuàng)建新的HttpServletRequest對(duì)象,上一次訪問時(shí)候的信息都不存在了。
所以服務(wù)器不會(huì)保存客戶端以前訪問的信息,稱為無(wú)狀態(tài)的請(qǐng)求應(yīng)答模式。
接下來(lái)介紹JSP技術(shù)的基本問題:輸入輸出。首先看如何完成輸入。
4、 輸入元素
輸入通過表單元素完成。常用的表單元素如下:
1)form
要提交信息,首先需要一個(gè)表單form,只有在form內(nèi)的信息才可以提交。
開始標(biāo)識(shí)form>
結(jié)束標(biāo)識(shí)/form>
主要的屬性:
action屬性:是目標(biāo)文件的位置,要提交給誰(shuí)處理;
method屬性:請(qǐng)求方式,有g(shù)et和post
注意:form不能嵌套。
2)單行文本框
基本語(yǔ)法格式:
input type="text" name="username" value="請(qǐng)輸入用戶名">
type="text" 就說(shuō)明這是單行文本框;
name表示文本框的名字,非常重要,在服務(wù)器需要根據(jù)名字取值;
value給出初始值。
3)密碼框
基本語(yǔ)法格式:
input type="password" name="userpass" >
用法與單行文本框基本相同。
4)隱藏域
基本語(yǔ)法格式:
input type="hidden" name="userpass" >
用于在多個(gè)頁(yè)面之間傳值,與當(dāng)行文本框的用法也基本相同。
5)單選按鈕
語(yǔ)法格式:
input type="radio" name="sex" value="男">男
input type="radio" name="sex" value="女">女
一組單選按鈕的名字應(yīng)該保持一致,這樣能夠保證多個(gè)選項(xiàng)只選擇一個(gè)。
注意:?jiǎn)芜x按紐之后顯示的內(nèi)容與單選按紐沒有關(guān)系,只是告訴用戶這個(gè)單選按紐表示什么。
6)復(fù)選框
語(yǔ)法格式:
input type="checkbox" name="fav" value="音樂">
input type="checkbox" name="fav" value="體育">
同一組復(fù)選框的值也應(yīng)該保持一致,可以采用統(tǒng)一的方式取值。
7)下拉列表
語(yǔ)法格式:
開始標(biāo)識(shí):select name="select">
結(jié)束標(biāo)識(shí):/select>
下拉框中的每個(gè)選項(xiàng):option value="1">顯示的信息/option>
性別下拉框:
select name="sex">
option value="男">男/option>
option value="女">女/option>
/select>
8)多行文本域
語(yǔ)法格式:
textarea name="">sdsfsddddddddd/textarea>
要對(duì)文本域初始化,需要把初始值放在標(biāo)簽的開始和結(jié)束標(biāo)識(shí)之間。
注意:這一點(diǎn)與其它元素通過value屬性賦值是不一樣的。
9)提交按鈕
input type="submit" value="提交">
通常不需要名字。
10)重置按鈕
input type="reset" value="重置">
通常不需要名字。
11)普通按鈕
也可以通過普通按鈕完成表單提交,需要編寫JavaScript代碼。
語(yǔ)法格式:
input type="button" value="提交" onClick="…">
5、 輸入實(shí)例:注冊(cè)頁(yè)面
參考代碼register.jsp:
%@ page contentType="text/html;charset=gb2312"%>
請(qǐng)注冊(cè)br>
form method="post" name="fi1" action="process.jsp">
用戶ID:input type="text" name="userid">br>
口令:input type="password" name="userpass">br>
確認(rèn)口令:input type="password" name="userpass1">br>
性別:input type="radio" name="sex" value="男" checked>男
input type="radio" name="sex" value="女">女br>
愛好:input type="checkbox" name="fav" value="運(yùn)動(dòng)">運(yùn)動(dòng)
input type="checkbox" name="fav" value="音樂">音樂
input type="checkbox" name="fav" value="編程">編程br>
學(xué)歷:
select name="degree">
option value="本科">本科/option>
option value="碩士">碩士/option>
option value="專科">???option>
option value="博士">博士/option>
/select>br>
備注:
textarea name="comment">/textarea>br>
input type="submit" value="提交">input type="reset" value="重置">
/form>
該頁(yè)面能夠完成用戶信息的提交,當(dāng)用戶輸入和選擇完之后點(diǎn)擊提交按鈕,瀏覽器會(huì)把這個(gè)請(qǐng)求發(fā)送到服務(wù)器,根據(jù)form中的action屬性的值,我們知道服務(wù)器會(huì)調(diào)用process.jsp進(jìn)行處理。下面介紹如何編寫process.jsp來(lái)獲取用戶輸入信息。
6、 獲取信息
前面介紹運(yùn)行原理的時(shí)候說(shuō)過,客戶的請(qǐng)求信息,包括輸入的和選擇的信息,都會(huì)被封裝在HttpServletRequest對(duì)象中,所以在process.jsp中只需要訪問這個(gè)對(duì)象即可,如何得到這個(gè)對(duì)象呢?
在JSP中提供了若干內(nèi)部對(duì)象,其中之一是request,直接使用這個(gè)對(duì)象即可。對(duì)于內(nèi)部對(duì)象,我們可以直接使用,不需要聲明和實(shí)例化。
獲取請(qǐng)求信息可以通過下面的兩個(gè)方法:
getParameter(元素名字)
getParameterValues(元素名字)
前者用于獲取單值元素的值,例如文本框、單選按鈕、密碼框等。后者用于獲取多值元素的值,例如復(fù)選框、允許多選的列表框。
7、 實(shí)例:注冊(cè)信息顯示
process.jsp的源文件:
%@ page contentType="text/html;charset=gb2312"%>
注冊(cè)信息如下:
%
String userid = request.getParameter("userid");
String userpass = request.getParameter("userpass");
String userpass1 = request.getParameter("userpass1");
String sex = request.getParameter("sex");
// 對(duì)性別進(jìn)行編碼轉(zhuǎn)換
sex = new String(sex.getBytes("8859_1"));
String[] fav = request.getParameterValues("fav");
// 該方法用于獲取多值元素的值
String degree = request.getParameter("degree");
String comment = request.getParameter("comment");
out.println("用戶ID:"+userid);
%>
br>口令:%=userpass%>
br>確認(rèn)口令:%=userpass1%>
br>性別:%=sex%>
br>愛好:
%
if(fav!=null)
for(String s:fav)
{
s=new String(s.getBytes("8859_1"));
out.print(s);
}
%>
br>學(xué)歷:%=degree%>
br>備注:%=comment%>
注:此種方式的代碼(Java代碼與HTML代碼嵌套)不提倡,這里僅僅是為了讓這個(gè)程序比較完整。但是獲取值和編碼轉(zhuǎn)換的代碼需要掌握,以后在Servlet中會(huì)用,沒有什么變化。
8、 實(shí)訓(xùn):完成圖書添加界面,并把用戶添加的信息重新顯示出來(lái)。
希望本文所述對(duì)大家的JSP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- JSP動(dòng)態(tài)生成驗(yàn)證碼存儲(chǔ)在session作用范圍內(nèi)
- jsp引用servlet生成的驗(yàn)證碼代碼演示
- 用jsp頁(yè)面生成隨機(jī)的驗(yàn)證數(shù)字碼示例
- 實(shí)現(xiàn)jsp驗(yàn)證碼的簡(jiǎn)單小例子
- JSP單選按鈕驗(yàn)證、下拉框驗(yàn)證、復(fù)選框驗(yàn)證實(shí)現(xiàn)代碼
- jsp 頁(yè)面上圖片分行輸出小技巧
- jsp 使用jstl實(shí)現(xiàn)翻頁(yè)實(shí)例代碼
- JSP和JSTL獲取服務(wù)器參數(shù)示例
- JSP入門教程之客戶端驗(yàn)證、常用輸出方式及JSTL基本用法