Web核心day05-JSP&EL&JSTL

一.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]

out和response的區(qū)別

二.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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • JSP總結(jié)(經(jīng)典) day1 JSP 定義: 1)Java Server Page, Java EE 組件,本...
    91數(shù)據(jù)閱讀 3,667評論 0 13
  • 一、jsp介紹 jsp作用jsp全稱java server pages(java服務器頁面),本質(zhì)是一個servl...
    圣賢與無賴閱讀 1,399評論 0 14
  • 1.學習內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對象&標簽介紹 EL表達式&EL的內(nèi)置對象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,338評論 1 18
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,853評論 18 399
  • 思緒萬千,內(nèi)心的迷茫和慌亂在不斷吞噬著我,悲觀黑洞的質(zhì)量以N次方的速度與日俱增,這就是現(xiàn)在的我,一個自我內(nèi)心最真實...
    jack本兮閱讀 242評論 0 0

友情鏈接更多精彩內(nèi)容