JSP運行原理、文檔結構、簡單輸入輸出


 
目標:
l         掌握Web應用的文檔結構;
l         掌握JSP的運行原理;
l         掌握JSP的簡單輸入和輸出。
主要內容:
l         通過一個簡單實例介紹Web應用的文檔結構和運行原理;
l         通過一個簡單的註冊功能介紹基本的輸入輸出。
下次課內容:客戶端驗證。
1、 文檔結構
每個應用都有一個根目錄,例如ch2;理論上可以放在任何地方,但是需要配置,簡單的做法,直接放在了webapps這個目錄下,在這個目錄的應用會被自動加載。
在根目錄下會有一個WEB-INF目錄,這個目錄中的文件不能被遠程訪問,主要存放配置文件和類文件、資源文件。
在WEB-INF中的配置文件是web.xml,每個web應用都會有這樣一個配置文件。
在WEB-INF有兩個文件用於存放類文件和資源文件,lib和classes,lib下面存放以壓縮包jar形式存在的類庫,classes直接存放類文件(包含包的信息)。
頁面文件(包括jsp文件、html文件、圖片文件)可以放在根目錄(ch2)下面,或者下面的子文件夾(不能放在WEB-INF)中。
2、 運行方式
前提:把Web應用部署到服務器上,啓動服務器。
下面以ch2.jsp爲例介紹訪問過程:
1)客戶端通過瀏覽器發送請求;
2)Web服務器接收這個請求,然後轉給應用服務器;
3)應用服務器會查找客戶要訪問的文件,假設訪問的文件爲ch2.jsp;分兩種情況:
第一次訪問:應用服務器把JSP文件轉換成Java文件;然後編譯成class文件;然後加載類;實例化對象並初始化;
後續訪問:JSP文件對應的頁面對象已經存在,直接查找到這個對象;
4)應用服務器封裝請求信息,然後調用相應的方法;
5)應用服務器把方法執行結果(響應客戶的內容)傳遞給Web服務器;
6)Web服務器把這個結果發給客戶端;
7)客戶端瀏覽器把接收到的html代碼解析成網頁。這個就是我們看到的結果。
下面是運行過程中的幾個文件內容。
源文件Ch2.jsp的內容:
DDDDDDDDDDDDDDDDDDDDDDDD
<%="FFFFFFFFFFFFFFFF"%>
 
轉換後的文件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、 無狀態的請求應答模式
用戶通過客戶端發送請求,可以通過地址欄、超鏈接、按鈕或者表單元素的事件請求。不管採用什麼方式發送請求,這些請求信息都會被封裝成HttpServletRequest對象,服務器會把這個對象作爲參數去調用頁面對象,這個方法執行完會對客戶端響應,之後這個HttpServletRequest對象就被刪除了。如果再次發送請求,會創建新的HttpServletRequest對象,上一次訪問時候的信息都不存在了。
所以服務器不會保存客戶端以前訪問的信息,稱爲無狀態的請求應答模式。
接下來介紹JSP技術的基本問題:輸入輸出。首先看如何完成輸入。
4、 輸入元素
輸入通過表單元素完成。常用的表單元素如下:
1)form
要提交信息,首先需要一個表單form,只有在form內的信息纔可以提交。
開始標識<form>
結束標識</form>
主要的屬性:
action屬性:是目標文件的位置,要提交給誰處理;
method屬性:請求方式,有get和post
注意:form不能嵌套。
2)單行文本框
基本語法格式:
<input type=”text” name=”username” value=”請輸入用戶名”>
type=”text” 就說明這是單行文本框;
name表示文本框的名字,非常重要,在服務器需要根據名字取值;
value給出初始值。
3)密碼框
基本語法格式:
<input type=”password” name=”userpass” >
用法與單行文本框基本相同。
4)隱藏域
基本語法格式:
<input type=”hidden” name=”userpass” >
用於在多個頁面之間傳值,與當行文本框的用法也基本相同。
5)單選按鈕
語法格式:
<input type=”radio” name=”sex” value=”男”>男
<input type=”radio” name=”sex” value=”女”>女
一組單選按鈕的名字應該保持一致,這樣能夠保證多個選項只選擇一個。
注意:單選按紐之後顯示的內容與單選按紐沒有關係,只是告訴用戶這個單選按紐表示什麼。
6)複選框
語法格式:
<input type=”checkbox” name=”fav” value=”音樂”>
<input type=”checkbox” name=”fav” value=”體育”>
同一組複選框的值也應該保持一致,可以採用統一的方式取值。
7)下拉列表
語法格式:
開始標識:<select name=”select”>
結束標識:</select>
下拉框中的每個選項:<option value=”1”>顯示的信息</option>
性別下拉框:
<select name=”sex”>
   <option value=”男”>男</option>
   <option value=”女”>女</option>
</select>
8)多行文本域
語法格式:
<textarea name=””>sdsfsddddddddd</textarea>
要對文本域初始化,需要把初始值放在標籤的開始和結束標識之間。
注意:這一點與其它元素通過value屬性賦值是不一樣的。
9)提交按鈕
<input type=”submit” value=”提交”>
通常不需要名字。
10)重置按鈕
<input type=”reset” value=”重置”>
通常不需要名字。
11)普通按鈕
也可以通過普通按鈕完成表單提交,需要編寫JavaScript代碼。
語法格式:
<input type=”button” value=”提交” onClick=”…”>
5、 輸入實例:註冊頁面
參考代碼register.jsp:
<%@ page contentType="text/html;charset=gb2312"%>
請註冊<br>
<form method="post" name="fi1" action="process.jsp">
   用戶ID<input type="text" name="userid"><br>
   口令:<input type="password" name="userpass"><br>
   確認口令:<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="運動">運動
         <input type="checkbox" name="fav" value="音樂">音樂
         <input type="checkbox" name="fav" value="編程">編程<br>
   學歷:
       <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>
該頁面能夠完成用戶信息的提交,當用戶輸入和選擇完之後點擊提交按鈕,瀏覽器會把這個請求發送到服務器,根據form中的action屬性的值,我們知道服務器會調用process.jsp進行處理。下面介紹如何編寫process.jsp來獲取用戶輸入信息。
6、 獲取信息
前面介紹運行原理的時候說過,客戶的請求信息,包括輸入的和選擇的信息,都會被封裝在HttpServletRequest對象中,所以在process.jsp中只需要訪問這個對象即可,如何得到這個對象呢?
在JSP中提供了若干內部對象,其中之一是request,直接使用這個對象即可。對於內部對象,我們可以直接使用,不需要聲明和實例化。
獲取請求信息可以通過下面的兩個方法:
getParameter(元素名字)
getParameterValues(元素名字)
前者用於獲取單值元素的值,例如文本框、單選按鈕、密碼框等。後者用於獲取多值元素的值,例如複選框、允許多選的列表框。
7、 實例:註冊信息顯示
process.jsp的源文件:
<%@ page contentType="text/html;charset=gb2312"%>
註冊信息如下:
<%
   String userid = request.getParameter("userid");
 
   String userpass = request.getParameter("userpass");
 
   String userpass1 = request.getParameter("userpass1");
 
   String sex = request.getParameter("sex");
 
   // 對性別進行編碼轉換
   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>確認口令:<%=userpass1%>
<br>性別:<%=sex%>
<br>愛好:
<%
   if(fav!=null)
   for(String s:fav)
   {
      s=new String(s.getBytes("8859_1"));
      out.print(s);
   }
%>
<br>學歷:<%=degree%>
<br>備註:<%=comment%>
 
注:此種方式的代碼(Java代碼與HTML代碼嵌套)不提倡,這裏僅僅是爲了讓這個程序比較完整。但是獲取值和編碼轉換的代碼需要掌握,以後在Servlet中會用,沒有什麼變化。
8、 實訓:完成圖書添加界面,並把用戶添加的信息重新顯示出來。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章