jsp基礎知識2

honghu79 12年前發布 | 1K 次閱讀
一、路徑問題
 
//地址的問題
路徑問題
 鏈接
 提交
 重定向
  轉發
 相對路徑
  相對于當前目錄開始
  鏈接提交重定向轉發:寫相對路徑,四個都一樣
 絕對路徑
  /    從根目錄開始

 /jsp02/  鏈接、提交、重定向
 /絕對路徑,這個是jsp02后面那個/,其中jsp02為應用名
 
頁面轉發
<%
request.getRequestDispatcher("a/1.jsp").forward(request,response);
%>
假設通過轉發的話,相對路徑可能會存在問題
所以在mvc模式下最好是采用絕對路徑

二、為什么不能將css,img目錄放到web-inf下面去呢?
 瀏覽器首先獲取到html頁面,當發現需要css,或者圖片的時候,會再次向服務器請求。
 因為瀏覽器不能直接訪問css,img文件

查看webroot/web-inf/jsp/login_form.jsp
 <%@page pageEncoding="utf-8"%>
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title></title>
  <link rel="stylesheet" type="text/css"
   href="css/style.css" />
 //這個地方的位置為什么是這樣的呢?
 //是相對于根目錄下的
 //主要是看web.xml怎么配置的
</head>
 
<h1>1.jsp</h1>
<%
System.out.println(request.getContextPath());
 %>
<a href="../b/2.jsp">two</a>
<a href="/whatisjava.jsp.02/b/2.jsp">two</a>
<a href="%=request.getContextPath()%">two</a>
轉發,地址欄中地址不變
重定向,地址欄中地址改變
 轉發:
       一件事多個組件協同做用轉發,比如一個接收數據,另外一個處理數據;一個請求
   轉發只能在本應用內部使用
 重定向:
   一件事的結束是另外一件事的開始;兩個請求
   重定向可以跨應用
 request.getRequestDispatcher()是請求轉發,前后頁面共享一個request
 response.sendRedirect()是重新定向  前后頁面不是一個request
 sendRedirect是通知IE再次提交一個http請求,
 dispatcher是直接轉到目的地址,最直接的表現
 應該是dispatcher后的IE地址欄地址是不變的
 request.getRequestDispatcher()是服務器端跳轉
 response.sendRedirect()是客戶端跳轉
 轉發只能轉到本應用內部轉發-----相對于轉發的絕對地址
 重定向可以跨應用轉發----
注冊用戶
 配置文件
 <action path="/addUser"
  type="org.whatisjava.action.AddUserAction">
  <forward name="success" path="/loginForm.action" redirect="true" />
  <forward name="fail" path="/WEB-INF/jsp/register_form.jsp" />
 </action>
package org.whatisjava.action;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.beanutils.BeanUtils;
import org.whatisjava.controller.Action;
import org.whatisjava.dao.UserDao;
import org.whatisjava.domain.User;
public class AddUserAction extends Action {
 @Override
 public String execute(HttpServletRequest request,
   HttpServletResponse response) {
  try {
   String number1 = request.getParameter("number");
   //獲得session驗證碼
   HttpSession session = request.getSession();
   String number2 = (String) session.getAttribute("number");
   //獲得cookies里面的驗證碼
   
   //比較number1,number2,如果number2
   if (number2 != null && number2.equals(number1)) {
    UserDao dao = new UserDao();
    User user = new User();
    //用戶
    Map map = request.getParameterMap();
    BeanUtils.populate(user, map);
    //寫入數據到數據庫
    dao.addUser(user);
    return "success";
    
    //注冊完了,肯定用重定向
   } else {
   ********************************************************
    request.setAttribute("error_msg", "驗證碼錯誤");
   *********************************************************
    return "fail";
   }
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
 }
}
驗證碼不對,提示錯誤
        <tr>
        <td valign="middle" align="right">
         驗證碼:
         <img id="num" src="image" />
         <a href="javascript:;" onclick="document.getElementById('num').src = 'image?'+(new Date()).getTime()">換一張</a>
    
        </td>
        <td valign="middle" align="left">
         <input type="text" class="inputgri" name="number" />
         *****************************************************
         <%
         String msg=(String)request.getAttribute("error_msg");
         %>
         <span><%=(msg==null)?"":msg %></span>
         ******************************************************
        </td>
       </tr>
 
        <td valign="middle" align="left">
         <input type="text" class="inputgri" name="number" />
         <span>${error_msg}</span>
        </td>
 
 
用oracle創建的user表,產生的hibernate的mapping映射文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="org.whatisjava.domain.user" table="WHATISJAVA_USER" schema="SONGXL">
        <id name="id" type="long">
            <column name="U_ID" precision="12" scale="0" />
            <generator class="sequence" >
            <param name="sequence">WHATISJAVA_USER_SEQ</param>
            </generator>
        </id>
        <property name="username" type="string">
            <column name="U_USERNAME" length="50" />
        </property>
        <property name="password" type="string">
            <column name="U_PASSWORD" length="50" />
        </property>
        <property name="name" type="string">
            <column name="U_NAME" length="50" />
        </property>
        <property name="age" type="short">
            <column name="U_AGE" precision="3" scale="0" />
        </property>
        <property name="sex" type="string">
            <column name="U_SEX" length="1" />
        </property>
    </class>
</hibernate-mapping>
 

MVC所有的請求都交給中央控制器
 smartstruts-config.xml來指揮中央控制器
用來MVC之后,JSP基本上都是頁面了。
 
四、JSP 2.0中的EL表達式(功能很強大,可以幫助程序員減少在JSP中的代碼量)
action中針對驗證碼錯誤的提示:
response.setAttribute("error_msg","驗證碼錯誤");

顯示頁面:
<%
Sting msg=request.getParametera("error_msg");
%>
<span><%=(msg==null)''?"msg"%></span>
 
通過jsp 2.0,EL可以將顯示頁面中的對應語句用下面語句代替
${error_msg}
//JSP引擎既能把<%%>轉換也能把${}轉換
//最終也會轉換成一大段jsp代碼
 
EL表達式,功能非常強大。能很大程度降低代碼量
${requestScope.msg}
對應代碼:
<%
Object obj=request.getAttribute("msg");
if (obj!=null){
 out.write(obj.toString());
}else{
 out.write("");
}
%>

${requestScope.user} //通過request獲得user對象的toString方法
${requestScope.user.name}  //通過request獲得user對象的toString方法并調用getName方法
${可以寫表達式;+-*/}
EL
 ${pageScope.msg}
 ${requestScope.user}
 ${sessionScope.msg}
 ${applicationScope.msg}
 相同的功能,都能存數據和取數據
 ${msg}
  這樣是什么意思呢?從范圍小到大,依次搜索,取小值。
 ${requestScope.user.msg}
         ===
        屬性方法
四個范圍
 pageContext
 request
 session
 application
這4個都有setAttribute,getAttribute
可以從tomcat下面隨便找個jsp程序看下即可
 ServletContext application=null;  //說明application實際上就是ServletContext
 
 application.getAttribute
 application.setAttribute

一個包里面可能要定義多個servlet,但是servlet定義的application
所以一個應用就一個這樣的application,比如在線的統計數字
屬于共享的空間
session:一個會話一個session
request:一個用戶可能有多個請求
pageContext:共享范圍一個頁面,一個頁面分配一個這樣對象;臨時存放數據的空間
 pageContext.setAttribute
       .getAttribute
 
java我們要訓練,結合場景來學習的。
    當時我是在什么場景學的這些東西
jsp里面沒有jsp代碼就不叫jsp了。
 EL表達式的功能是有限的,不能替代if語句和for循環。
 那么用什么能替代呢?
標記庫----某些人開發的一些jar包
 先學會用標記庫,再做出一個標記庫
 標記庫和EL表達式是jsp的靈魂
EL
${mesg}
標記庫---好多企業里面都會開發自己的標記庫
<some name="">
</some>
我們要講的標記庫JSTL==java standard tag library
我們首先學怎么用
 先搞到java包
1可以從oracle網站上下載
2、tomcat自帶,tomcat6\webapps\examples\WEB-INF\lib
 jstl.jar
 standard.jar
首先建立一個jstl目錄,下面建立1.jsp
 <%@taglib uri="" prefix=""%>
      ===
      
 這句話的意思,告訴jsp引擎,我下面將使用taglib。
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
      =====================            ===前綴
         怎么填寫的呢?來源于哪里?比如standard.jar
       META-INF下有好多tld文件。隨便打開一個
       查看里面的urihttp://java.sun.com/jsp/jstl/core
由于可能存在多個公司的標記庫,所以前綴的標記也是可以變化來卻分不同公司的標記庫的 
相當于聲明
 
 
 
<c:forEach>
</c:forEach>
<f:forEach>
</f:forEach>
 用了標記庫之后,可以寫出類似html的東西,但還屬于java代碼
<c:if  test="${requestScope.num>100}"〉
    ==================
             這里必須是一個EL表達式,如果是true,則輸出下面這行,false不顯示
 ${requestScope.num}
</c:if>
 
<c:choose>
 <c:when test="${requestScope.num gt 200}">
  <h1>
   200
  </h1>
 </c:when>
 <c:when test="${requestScope.num gt 100}">
  <h1>
   100
  </h1>
 </c:when>
 <c:otherwise>
  <h1>
   ERROR
  </h1>
 </c:otherwise>
</c:choose>
<c:when></c:when>可以有多個
<c:otherwise></c:otherwise>只有一個

<c:forEach items="${requestScope.arry1}" var="str">
       ============= ===
       必須是EL表達式,這個  
       表達式取出來得值必須是
       一個集合對象;這里是循
       環的次數;集合里面有幾個
       對象就循環幾次;把元素從集合
       里面取出來以var值為名稱放到
       pageContext里面,后一次覆蓋前一次
<h1>
  ${str}
</h1>
</c:forEach>

以上代碼的意思是反復輸出forEach里面的內容。
 
<table border="1" width="80%">
 <tr>
  <td>
   Name
  </td>
  <td>
   Age
  </td>
 </tr>
 <c:forEach items="${requestScope.user_list}" var="u">
  <tr>
   <td>
    ${u.name}
   </td>
   <td>
    ${u.age}
   </td>
  </tr>
 </c:forEach>
</table>
 
 

JSTL+hibernate+smartstruts
 
如何生成一個不會重復的字符串
  只要這些人一注冊服務器端就要創建一個唯一的文件夾
  上傳的文件名最好能修改下,要不會形成注射
 
package org.whatisjava.test;
import java.util.UUID;
public class TestUUDI
{
 public static void main(String [] args){
 UUID uuid=UUID.randomUUID();
 System.out.println(uuid.toString());
 }
}
如何建造目錄
 file.mkdir

boolean mkdir() 
  創建此抽象路徑名指定的目錄。 
boolean mkdirs() 
  創建此抽象路徑名指定的目錄,包括創建必需但不存在的父目錄。 
FileOutputStream fos=new FileOutputStream("file.jpg");
 針對文件的輸出流是覆蓋,所以要注意一定要先刪除再寫新的
 本文由用戶 honghu79 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!