jsp基礎知識2
一、路徑問題
//地址的問題
路徑問題
鏈接
提交
重定向
轉發
//地址的問題
路徑問題
鏈接
提交
重定向
轉發
相對路徑
相對于當前目錄開始
鏈接提交重定向轉發:寫相對路徑,四個都一樣
相對于當前目錄開始
鏈接提交重定向轉發:寫相對路徑,四個都一樣
絕對路徑
/ 從根目錄開始
/ 從根目錄開始
/jsp02/ 鏈接、提交、重定向
/絕對路徑,這個是jsp02后面那個/,其中jsp02為應用名
頁面轉發
<%
request.getRequestDispatcher("a/1.jsp").forward(request,response);
%>
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>
<%
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()是客戶端跳轉
轉發只能轉到本應用內部轉發-----相對于轉發的絕對地址
重定向可以跨應用轉發----
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>
配置文件
<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 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;
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;
}
}
}
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="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>
<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>
<!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","驗證碼錯誤");
response.setAttribute("error_msg","驗證碼錯誤");
顯示頁面:
<%
Sting msg=request.getParametera("error_msg");
%>
<span><%=(msg==null)''?"msg"%></span>
通過jsp 2.0,EL可以將顯示頁面中的對應語句用下面語句代替
${error_msg}
//JSP引擎既能把<%%>轉換也能把${}轉換
//最終也會轉換成一大段jsp代碼
//最終也會轉換成一大段jsp代碼
EL表達式,功能非常強大。能很大程度降低代碼量
${requestScope.msg}
對應代碼:
<%
Object obj=request.getAttribute("msg");
if (obj!=null){
out.write(obj.toString());
}else{
out.write("");
}
%>
對應代碼:
<%
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}
EL
${pageScope.msg}
${requestScope.user}
${sessionScope.msg}
${applicationScope.msg}
相同的功能,都能存數據和取數據
${msg}
這樣是什么意思呢?從范圍小到大,依次搜索,取小值。
${msg}
這樣是什么意思呢?從范圍小到大,依次搜索,取小值。
${requestScope.user.msg}
===
屬性方法
===
屬性方法
四個范圍
pageContext
request
session
application
這4個都有setAttribute,getAttribute
pageContext
request
session
application
這4個都有setAttribute,getAttribute
可以從tomcat下面隨便找個jsp程序看下即可
ServletContext application=null; //說明application實際上就是ServletContext
ServletContext application=null; //說明application實際上就是ServletContext
application.getAttribute
application.setAttribute
application.setAttribute
一個包里面可能要定義多個servlet,但是servlet定義的application
所以一個應用就一個這樣的application,比如在線的統計數字
屬于共享的空間
session:一個會話一個session
request:一個用戶可能有多個請求
pageContext:共享范圍一個頁面,一個頁面分配一個這樣對象;臨時存放數據的空間
request:一個用戶可能有多個請求
pageContext:共享范圍一個頁面,一個頁面分配一個這樣對象;臨時存放數據的空間
pageContext.setAttribute
.getAttribute
.getAttribute
java我們要訓練,結合場景來學習的。
當時我是在什么場景學的這些東西
當時我是在什么場景學的這些東西
jsp里面沒有jsp代碼就不叫jsp了。
EL表達式的功能是有限的,不能替代if語句和for循環。
EL表達式的功能是有限的,不能替代if語句和for循環。
那么用什么能替代呢?
標記庫----某些人開發的一些jar包
先學會用標記庫,再做出一個標記庫
先學會用標記庫,再做出一個標記庫
標記庫和EL表達式是jsp的靈魂
EL
${mesg}
${mesg}
標記庫---好多企業里面都會開發自己的標記庫
<some name="">
</some>
我們要講的標記庫JSTL==java standard tag library
<some name="">
</some>
我們要講的標記庫JSTL==java standard tag library
我們首先學怎么用
先搞到java包
1可以從oracle網站上下載
2、tomcat自帶,tomcat6\webapps\examples\WEB-INF\lib
jstl.jar
standard.jar
先搞到java包
1可以從oracle網站上下載
2、tomcat自帶,tomcat6\webapps\examples\WEB-INF\lib
jstl.jar
standard.jar
首先建立一個jstl目錄,下面建立1.jsp
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
===================== ===前綴
怎么填寫的呢?來源于哪里?比如standard.jar
META-INF下有好多tld文件。隨便打開一個
查看里面的urihttp://java.sun.com/jsp/jstl/core
由于可能存在多個公司的標記庫,所以前綴的標記也是可以變化來卻分不同公司的標記庫的
相當于聲明
===================== ===前綴
怎么填寫的呢?來源于哪里?比如standard.jar
META-INF下有好多tld文件。隨便打開一個
查看里面的urihttp://java.sun.com/jsp/jstl/core
由于可能存在多個公司的標記庫,所以前綴的標記也是可以變化來卻分不同公司的標記庫的
相當于聲明
<c:forEach>
</c:forEach>
<f:forEach>
</f:forEach>
<f:forEach>
</f:forEach>
用了標記庫之后,可以寫出類似html的東西,但還屬于java代碼
<c:if test="${requestScope.num>100}"〉
==================
這里必須是一個EL表達式,如果是true,則輸出下面這行,false不顯示
${requestScope.num}
</c:if>
<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 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: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>
<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());
}
}
只要這些人一注冊服務器端就要創建一個唯一的文件夾
上傳的文件名最好能修改下,要不會形成注射
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
file.mkdir
boolean mkdir()
創建此抽象路徑名指定的目錄。
boolean mkdirs()
創建此抽象路徑名指定的目錄,包括創建必需但不存在的父目錄。
FileOutputStream fos=new FileOutputStream("file.jpg");
針對文件的輸出流是覆蓋,所以要注意一定要先刪除再寫新的
針對文件的輸出流是覆蓋,所以要注意一定要先刪除再寫新的
本文由用戶 honghu79 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!