一.JSP
Java Server Page:從用戶角度看,就是一個網(wǎng)頁,從程序員角度看待,其實就是一個java類,它繼承了servlet,所以可以直接說jsp就是一個servlet
為什么會有JSP:
html多數(shù)情況下用來顯示靜態(tài)內(nèi)容,一成不變的。但是有時候我們需要在網(wǎng)頁上顯示一些動態(tài)數(shù)據(jù),比如:查詢所有的學生信息,根據(jù)姓名去查詢具體某個學生。這些動作都需要去查詢數(shù)據(jù)庫,然后在網(wǎng)頁上顯示。html是不支持寫java代碼,jsp里面可以寫java代碼。
怎么用JSP:
指令寫法:
<%@ 指令名字 %>
page指令:language:表明jsp頁面中可以寫java代碼
contentType:其實是在說這個文件是什么類型,告訴瀏覽器我是什么內(nèi)容類型,以及使用什么編碼。
pageEncoding :js內(nèi)容編碼
extends:用于指定jsp翻譯成java文件后,繼承的父類是誰,一般不用改。
import:導包使用的,一般不用手寫。
session:值可選的有true or false:用于控制在這個jsp里面,能夠直接使用session對象。具體的區(qū)別是,請看翻譯過的java文件。如果該值是true,name在代碼里面會有g(shù)etSession()的調(diào)用,如果是false:那么就不會有該方法調(diào)用,也就是沒有session對象了。在頁面上自然也就不能使用session了。
errorPage;指的是錯誤的頁面,值需要給錯誤的頁面路徑
isErrorPage:上面的errorPage用于指定錯誤的時候跑到哪一個頁面去。那么這個isErrorPage,就是聲明某一個頁面到底是不是錯誤的頁面。
include:包含另一個jsp內(nèi)容進來
<%@ include
taglib:<%@ taglib prefix="" url=""%>
url:標簽庫路徑? prefix:標簽庫的別名
JSP動作標簽
<jsp:include page=""></jsp:include>
<jsp:param value="" name=""/>
<jsp:forward page=""></jsp:forward>
jsp:include
<jsp:include page="other02.jsp"></jsp:include>
包含指定的頁面,這里是動態(tài)包含,也就是不把包含的頁面所有元素標簽全部拿過來輸出,二手把它的運行結(jié)果拿過來。
jsp:forward
<jsp:forward page=""></jsp:forward>
前往哪一個頁面
<%
//請求轉(zhuǎn)發(fā)
request.getRequestDispatcher("other02.jsp").forward(request,response);
%>
jsp:param
意思是:在包含某個頁面的時候,或者在跳轉(zhuǎn)某個頁面的是,加入這個參數(shù)。
<jsp:forward page="other02.jsp">
? ? <jsp:param value="beijing" name= "address"/>
</jsp:forward>
在other02.jsp中獲取參數(shù)
<br>收到的參數(shù)是:<br>
<%= request.getParameter("address")%>
JSP內(nèi)置對象
所謂內(nèi)置對象,就是我們可以直接在jsp頁面中使用這些對象。不用創(chuàng)建。
-pageContext
-request
-session
-application
以上4個是作用域?qū)ο?作用域就是表示這些對象可以存值,他們的取值范圍有限定。 setAttribute和getAttribute
代碼:
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
取出四個作用域中的值<br>
<%=pageContext.getAttribute("name")%>
<%=request.getAttribute("name")%>
<%=session.getAttribute("name")%>
<%=application.getAttribute("name")%>
四個作用域的區(qū)別:
-pageContext[PageContext]:僅限于當前的頁面。還可以獲取到其他八個內(nèi)置對象。
-request[HttpServletRequest]:僅限于一次請求,只要服務器對該請求做出了響應。這個域中存的值就沒有了。
-session[HttpSession]:作用域限于一次會話(多次請求與響應)當中。
-application[ServletContext]:整個工程都可以訪問,服務器關(guān)閉后就不能訪問了。
-page[Object]---就是這個jsp翻譯成的java類的實例對象
-config[ServletConfig]
-exception[Throwable]
-out[JspWriter]
-response[HttpServletResponse]

二.EL表達式
是為了簡化咱們的jsp代碼.具體一點就是為了簡化在jsp里面寫的那些java代碼。
寫法格式:${表達式}
如果從作用域中取值,會先從小的作用域開始取,如果沒有,就往下一個作用域取。一直把四個作用域取完都沒有,就沒有顯示。
如何取用:
1.取出4個作用域中存放的值。
<%
pageContext.setAttribute("name","page");
request.setAttribute("name","request");
session.setAttribute("name","session");
application.setAttribute("name","application");
%>
按普通手段取值:
<%= pageContext.getAttribute("name")%>
<%= request.getAttribute("name")%>
<%= session.getAttribute("name")%>
<%= application.getAttribute("name")%>
使用EL表達式取出作用域中的值:
${}pageScope.name
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
2.如果域中所存的是數(shù)組
<%
String[] a? = {"aa","bb","cc","dd"};
pageContext.setAttribute("array",a);
%>
使用EL表達式取出作用域中數(shù)組的值:
${array[1],array[2],array[3]}
3.如果域中所存的是集合
? ? 使用EL表達式取出作用域集合的值:
????${li[1],li[2],li[3]}? ??
--------------Map數(shù)據(jù)-------------------
<%
Map map = new HashMap();
map.put("name","zhangsan");
map.put("age",18);
map.put("address","北京");
map.put("address.aa","深圳");
pageContext.setAttribute("map",map);
%>
4.取出Map集合的值
<%
Map map = new HashMap();
map.put("name","zhangsan");
map.put("age",18);
map.put("address","北京");
map.put("address.aa","深圳");
pageContext.setAttribute("map",map);
%>
使用EL表達式取出作用域中Map的值:
${map.name},${map.age},${map.address},${map["address.aa"]}
取值細節(jié):
1.從域中取值。得先存值。
<%
//pageContext.setAttribute("name","zhangsan");
session.setAttribute("name","list");
%>
直接指定了,到這個作用域里面去找這個name
${sessionScope.name? ?}
//先從page里面去找,meiyouqurequest找,去session,去application
${name}
指定從session中取值
${sessionScope.name}
2.取值方式
如果這份值是有下標的,那么直接使用[]
<%
User user = new User("zhangsan",18);
session.setAttribute("u",user);
%>
${u.name},${u.age}
一般使用EL表達式,用的比較多的,都是從一個對象中取出它的屬性值,比如取出某一個學生的姓名。
EL表達式的11個內(nèi)置對象。
${對象名,成員}
-pageContext
作用域相關(guān)獨享
-pageScope
-requsetScope
-sessionScope
-applicationScope
頭信息相關(guān)對象
-header
-headerValues
參數(shù)信息相關(guān)對象
-param
-paramValues
-cookie
全局初始化參數(shù)
-initParam
JSTL
全稱:JSP Standard Tag Library? ?jsp標準標簽庫
簡化jsp的代碼編寫。替換<%%>寫法。一般與EL表達式配合。
怎么使用:
1導入jar文件到工程的WebContext/Web-Inf/lib? jstl.jar standard.jar
2.在jsp頁面上,使用taglib指令,來引入標簽庫
3.注意:如果想支持EL表達式,那么引入的標簽庫必須選擇1.1的版本,1.0的版本不支持EL表達式。
<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core"%>
常用標簽
<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>
*c:set
<!--聲明一個對象name,對象的值zhangsna,存儲到了page(默認),指定是session-->
<c:set? var="name"? value="zhangsan" scope="session"></c:set>
${sessionScope.name}
*c:if
>判斷test里面的表達式是否滿足,如果滿足,就執(zhí)行c:if標簽中的輸出,c:if是沒有else的。
<c:set var="age" value="18"></c:set>
<c:if test="${age>26}">
年齡大于了26歲...
</c:if>
<c:if? test="${age<=26}">
年齡小于了26歲...
</c:if>
-------------------------------------
定義一個變量名flag? 去接收前面表達式的值,然后存在session域中
<c:if? test="${age>26}" var="flag"? scope="session">
年齡大于了26歲...
</c:if>
*c:forEach
從1開始遍歷到10,得到的結(jié)果,賦值給i,冰倩會存儲到page域中,step,增幅為2,
<c:forEach? begin="1" end="10"? var="i" step+"2">
</c:forEach>
-------------------------------------------
<!--items:表示遍歷哪一個對象,注意,這里必須寫EL表達式。
var:遍歷出來的每一個元素用user去接收。-->
<c:forEach var="user"? item="${list}">
? ? ? ? ? ? ${user.name}----${user.age}
</c:forEach>
學生信息管理系統(tǒng)
*需求分析

1.先寫login.jsp,并且搭配一個LoginServlet 去獲取登錄信息。
2.創(chuàng)建用戶表,里面只要有id,username和password
3.創(chuàng)建UserDao,定義登錄的方法
/**
該dao定義了對用戶表的訪問規(guī)則*/
public interface UserDao{
//這里簡單就返回一個Boolean類型,成功或者失敗即可。
//但是開發(fā)的時候,登錄的方法,一旦成功。這里應該返回該用戶? ? 的個人信息
//return true:登錄成功,false:登錄失敗。
boolean? login(String userName,String password);
}
4.創(chuàng)建UserDaoImpl,實現(xiàn)剛才定義的登錄方法。
public class UserDaoImpl implements UserDao{
public boolean login(String userName,String password){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
//1.得到連接對象
conn= JDBCUtil.getConn();
String sql = "select*from t_user where username=? and password=?;
//2.創(chuàng)建ps獨享
ps = conn.prepareStatement(sql);
ps.setString(1,userName);
ps.setString(2,password);
//3.開始執(zhí)行
rs = ps.executeQuery();
//如果能夠成功移到下一條記錄,那么表明有這個用戶。
return rs.next();
}catch(SQLException e{
? ? ? ? e.printStackTrace();
}finally{
JDBCUtil.release(conn,ps,re);
}return false;
}
}
5.在loginServlet里面訪問UserDao,判斷登錄結(jié)果。以區(qū)分對待
6.創(chuàng)建stu_list.jsp,讓登錄成功的時候跳轉(zhuǎn)過去。
7.創(chuàng)建學生表,里面字段隨意。
8.定義學生的Dao.StuDao
public? interface StuDao{
/**
查詢出來所有的學生信息
List集合
List<Student>findAll();
}
9.對上面定義的StuDao做出實現(xiàn)StuDaoImpl
public class StuDaoImpl implements StuDao{
public List<Student> findAll() {
? List<Student> list = new ArrayList<Student>();
? Connection conn = null;
? PreparedStatement ps = null;
? ResultSet rs? = null;
? try {
? //1. 得到連接對象
? conn = JDBCUtil.getConn();
? String sql = "select * from t_stu";
? ps = conn.prepareStatement(sql);
? rs = ps.executeQuery();
? //數(shù)據(jù)多了,用對象裝, 對象也多了呢? 用集合裝。
? while(rs.next()){ //10 次 ,10個學生
? Student stu = new Student();
? stu.setId(rs.getInt("id"));
? stu.setAge(rs.getInt("age"));
? stu.setName(rs.getString("name"));
? stu.setGender(rs.getString("gender"));
? stu.setAddress(rs.getString("address"));
? list.add(stu);
? }
? } catch (SQLException e) {
? e.printStackTrace();
? }finally {
? JDBCUtil.release(conn, ps, rs);
? }
? return list;
? }
? }
10.在登錄成功的時候,完成三件事情。
11.
1)查詢所有的學生
2)把這個所有的學生集合存儲到作用域中。
3)跳轉(zhuǎn)到stu_list.jsp
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//提交的數(shù)據(jù)有可能有中文, 怎么處理。
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//1. 獲取客戶端提交的信息
String userName = request.getParameter("username");
String password = request.getParameter("password");
//2. 去訪問dao , 看看是否滿足登錄。
UserDao dao = new UserDaoImpl();
boolean isSuccess = dao.login(userName, password);
//3. 針對dao的返回結(jié)果,做出響應
if(isSuccess){
//response.getWriter().write("登錄成功.");
//1. 查詢出來所有的學生信息。
StuDao stuDao = new StuDaoImpl();
List<Student> list = stuDao.findAll();
//2. 先把這個集合存到作用域中。
request.getSession().setAttribute("list", list);
//2. 重定向
response.sendRedirect("stu_list.jsp");
}else{
response.getWriter().write("用戶名或者密碼錯誤!");
}
}
11.在stu_list.jsp中,取出域中的集合,然后使用c標簽去遍歷集合。
<table border="1" width="700">
<tr align="center">
<td>編號</td>
<td>姓名</td>
<td>年齡</td>
<td>性別</td>
<td>住址</td>
<td>操作</td>
</tr>
<c:forEach items="${list }" var="stu">
<tr align="center">
<td>${stu.id }</td>
<td>${stu.name }</td>
<td>${stu.age }</td>
<td>${stu.gender }</td>
<td>${stu.address }</td>
<td><a href="#">更新</a>? <a href="#">刪除</a></td>
</tr>
</c:forEach>
</table>
總結(jié)
* JSP
? 三大指令
? page
? include
? taglib
? 三個動作標簽
? <jsp:include>
? <jsp:forward>
? <jsp:param>
? 九個內(nèi)置對象
? 四個作用域
? pageContext
? request
? session
? application
? out
? exception
? response
? page
? config
?
* EL
? ${ 表達式 }
? 取4個作用域中的值
? ${ name }
? 有11個內(nèi)置對象。
? pageContext
? pageScope
? requestScope
? sessionScope
? applicationScope
? header
? headerValues
? param
? paramValues
? cookie
? initParam
* JSTL
> 使用1.1的版本, 支持EL表達式, 1.0不支持EL表達式
> 拷貝jar包, 通過taglib 去引入標簽庫
<c:set>
<c:if>
<c:forEach>