EL表達式,jstl標籤庫,三層架構
一.EL表達式
1.概述:
表達式語言(Expression Language)
作用:主要用來代替jsp中腳本的功能,簡化對java代碼的操作。
語法:${表達式}
2.使用
獲取值:獲取域中的值:EL表達式==只能==從域對象(4個域)中獲取數據
語法:
* 標準
1. ${pageScope.鍵名}
從page域中獲取指定鍵名對應的值
2. ${requestScope.鍵名}
從request域中獲取指定鍵名對應的值
3. ${sessionScope.鍵名}
從session域中獲取指定鍵名對應的值
4. ${applicationScope.鍵名}
從servletContext域中獲取指定鍵名對應的值
* 簡化
${鍵名}
特點:默認從最小域開始找,找到後直接顯示,不在繼續尋找
小結:要求四個域鍵名唯一
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo1</title>
</head>
<body>
<h3>el表達式基本語法</h3>
<%
/*模擬servlet向域中存值....*/
// pageContext.setAttribute("username", "老師");
request.setAttribute("username", "小老師");
request.setAttribute("age", 33);
session.setAttribute("sex", "女");
application.setAttribute("address", "小本");
%>
<h5>標準語法</h5>
${pageScope.username} <br> <%--不會出現空指針異常問題--%>
${requestScope.age} <br>
${sessionScope.sex}<br>
${applicationScope.address}<br>
<h5>簡化語法</h5>
${username} <br>
${age} <br>
${sex}<br>
${address}<br>
</body>
</html>
獲取集合的值語法:
1. 獲取字符串
${鍵名}
2. 獲取對象(User)
${鍵名.屬性名}
3. 獲取List(Array)集合
${鍵名[索引]}
4. 獲取Map集合
${鍵名.key}
${鍵名["key"]}
5. 注意
el不會出現null和索引角標越界問題
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo2</title>
</head>
<body>
<h3>獲取user對象</h3>
<%
User user = new User("大名", 13, "男");
request.setAttribute("user", user);
%>
${user} <br> <%--執行該對象的toString方法--%>
${user.username} | ${user.age} | ${user.sex} <br>
<h3>獲取list集合</h3>
<%
List<Object> list = new ArrayList<>();
list.add("胖");
list.add("夫");
list.add("靜");
list.add(user);
request.setAttribute("list", list);
%>
${list}<br><%--執行該對象的toString方法--%>
${list[0]} | ${list[1]} | ${list[2]} | ${list[3].username} | ${list[10]} <br> <%--el表達式不會出現 集合(數組)角標越界異常--%>
<h3>獲取map集合</h3>
<%
Map<String, Object> map = new HashMap<>();
map.put("key1", "僧");
map.put("key2", "子");
map.put("key3", "青");
map.put("key.4", user);
request.setAttribute("map", map);
%>
${map}<br><%--執行該對象的toString方法--%>
${map.key1} | ${map.key2} | ${map.key3} | ${map["key.4"].username}<br>
</body>
</html>
2.執行運算
算數運算符
語法: + - * /(div) %(mod)
比較運算符
語法:> < >= <= ==(eq) !=(ne)
邏輯運算符
語法:&&(and) ||(or) !(not)
三元運算符
語法:${條件表達式?爲真:爲假}
------------------------------
空運算符
語法:${not empty 對象}
功能:
可以判斷字符串和對象是否爲空
可以判斷一個集合的長度是否爲0
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo3</title>
</head>
<body>
<%
int a = 4;
int b = 3;
request.setAttribute("a", a);
request.setAttribute("b", b);
%>
<h5>算數運算符</h5>
${a / b} | ${a div b} <br>
${a % b} | ${a mod b}<br>
<h5>比較運算符</h5>
${a == b} | ${a eq b}<br>
${a !=b } | ${a ne b} <br>
<h5>三元運算符</h5>
${a == b ? "a相等b" : "a不等b"} <br>
<h5>非空判斷</h5>
<%
User user = new User();
request.setAttribute("user", user);
List list = new ArrayList();
list.add("aa" );
request.setAttribute("list", list);
%>
user對象:${not empty user} <br> <%-- if(user !=null ){} --%>
list集合:${not empty list} <br> <%-- if(list !=null && list.size>0 ){}--%>
<h5>空值判斷</h5>
user對象:${empty user} <br> <%-- if(user ==null ){} --%>
list集合:${empty list} <br> <%-- if(list ==null || list.size==0 ){}--%>
</body>
</html>
3.隱式對象
* el表達式中有11個隱式對象
pageContext
就是jsp九大內置對象之一,他可以獲得其他八個內置對象
cookie
可以獲取瀏覽器指定cookie名稱的值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo4</title>
</head>
<body>
<h3>el隱式對象..</h3>
${pageContext.request.contextPath} 動態獲取:項目名稱(虛擬路徑) <br>
${cookie.JSESSIONID.value} 獲取指定cookie名稱的值... <br>
</body>
</html>
注意事項:
* jsp默認支持el表達式
servlet2.3規範中,默認不支持el表達式* 如果要忽略el表達式
1)忽略當前jsp頁面中所有的el表達式
設置jsp中page指令中:isELIgnored="true" 屬性
2)忽略單個el表達式
\${表達式}
isELIgnored="false"
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>demo4</title>
</head>
<body>
<h3>el隱式對象..</h3>
${pageContext.request.contextPath} 動態獲取:項目名稱(虛擬路徑) <br>
\${cookie.JSESSIONID.value} 獲取指定cookie名稱的值... <br>
</body>
</html>
JavaBean:他其實就是一個普通的java類
使用規範
所有字段(成員變量)爲private
提供無參構造方法
提供getter、setter和is方法
實現serializable接口
二.JSTL標籤庫
1.概述:
Jsp 標準標籤庫(Jsp Standard Tag Library),是由Apache組織提供的開源的jsp標籤庫
作用:替換和簡化jsp頁面中java代碼的編寫
JSTL標準標籤庫有5個子庫,但隨着發展,目前常使用的是它的核心庫(Core)
標籤庫 | 標籤庫的URI | 前綴 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
國際化(幾乎不用) | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL(過時) | http://java.sun.com/jsp/jstl/sql | sql |
XML(過時) | http://java.sun.com/jsp/jstl/xml | x |
Functions(幾乎不用) | http://java.sun.com/jsp/jstl/functions | fn |
2.jstl標籤的使用:
使用步驟:當前web項目導入jar包,在當前的jsp頁面tablib指令引入 即可
2.常用標籤:
① c:if標籤
就相當於,java中 if(){}
語法
<c:if test="boolean值"></c:if>
true:顯示標籤體內容
false:隱藏標籤體內容
通常與el表達式一起使用
注意:此標籤沒有else功能,如果想實現else效果,請讓條件取反
<%@ page import="cn.wsl.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo1</title>
</head>
<body>
<%
User user = new User();
user.setUsername("jck");
request.setAttribute("user", user);
%>
<c:if test="${empty user}">
你好,請登錄...
</c:if>
<c:if test="${not empty user}">
你好,${user.username}
</c:if>
</body>
</html>
② c:forEach標籤
相當於java中的for循環
1)普通for
for(int i=1; i<=5; i++){
i
}
<c:forEach begin="1" end="5" step="1" var="i">
${i}
</c:forEach>
begin="1" 起始值(包含)
end="5" 結束值(包含)
step="1" 步長爲1
var="i" 當前輸出臨時變量
2)增強for
for(User user : list){
user
}
<c:forEach items="${list}" var="user" varStatus="vs">
${user}
</c:forEach>
items="list" 集合
var="user" 當前輸出的臨時變量
varStatus="vs" 變量狀態
index 當前索引 從0開始
count 計數器 從1開始
<%@ page import="java.util.List" %>
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo</title>
</head>
<body>
<h3>普通for循環</h3>
<c:forEach begin="1" end="5" step="1" var="i"> <%--for循環將臨時變量存儲到了 pageContext域空間--%>
${i} <br>
</c:forEach>
<h3>增強for循環</h3>
<%
List<User> list = new ArrayList<>();
list.add(new User("dilireb", 27, "女"));
list.add(new User("娜扎", 23, "女"));
list.add(new User("扎哈", 127, "中"));
request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="user" varStatus="vs">
索引:${vs.index} | 計數器: ${vs.count} | ${user.username} <br>
</c:forEach>
</body>
</html>
③ c:choose標籤
相當於java中switch語句
<c:choose> 等價於 switch
<c:when> 等價於 case+break
<c:otherwise> 等價於 default
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo</title>
</head>
<body>
<h3>choose標籤</h3>
<%
Integer money = 7000;
request.setAttribute("money", money);
%>
<c:choose>
<c:when test="${money == 7000}">
單身汪....
</c:when>
<c:when test="${money == 15000}">
撩小
</c:when>
<c:when test="${money > 30000}">
上完人呢.
</c:when>
<c:otherwise>
奮鬥吧騷年....
</c:otherwise>
</c:choose>
</body>
</html>
三.三層架構
1.概述:
通常意義上的三層架構就是將整個業務應用劃分爲:表示(現)層、業務邏輯層、數據訪問層。
區分層次的目的 爲了高內聚低耦合的思想
表示(現)層:又稱爲web層,與瀏覽器進行數據交互(控制器和視圖)
業務邏輯層:又稱爲service層,處理業務數據(if判斷,for循環)
數據訪問(持久)層:又稱爲dao層,與數據庫進行交互的(每一條(行)記錄與javaBean實體對應)
項目目錄建立規則:
* com.wsl.基本包(公司域名倒寫)
* com.wsl.dao 持久層
* com.wsl.service 業務層
* ccom.wsl.web 表示層
* com.wsl.domain 實體(JavaBean)
* com.wsl.util 工具
mvc架構:
各層之間會傳遞一些實體對象,cn.wsl.項目名.domain(pojo,vo)
優點:降低各層之間的耦合性,提高各層代碼的複用性
一個項目的完整的分包如下:
cn.wsl公司域名倒寫
cn.wsl.xxx 項目名稱
cn.wsl.xxx.yyy 子模塊
cn.wsl.xxx.yyy.dao 子模塊dao層接口
cn.wsl.xxx.yyy.dao.impl 子模塊dao層實現類
cn.wsl.xxx.yyy.service 子模塊service層接口
cn.wsl.xxx.yyy.service.impl 子模塊service層實現類
cn.wsl.xxx.yyy.domain 子模塊JavaBean (子模塊yyy可省略)
cn.wsl.xxx.yyy.web.servlet 子模塊web層,servlet
cn.wsl.xxx.yyy.web.filter 子模塊web層,filter
cn.wsl.xxx.util 工具
cn.wsl.xxx.exception 自定義異常
cn.wsl.xxx.constant 常量
四.案例:
coding:
進行簡單的分包
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>索引</title>
</head>
<body>
<h1><a href="${pageContext.request.contextPath}/FindAllServlet">用戶列表查詢</a></h1>
</body>
</html>
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>列表</title>
<style type="text/css">
#content {
margin: 0 auto;
border: red solid 1px;
width: 800px;
height: 600px;
}
table {
width: 800px;
}
td{
border: red solid 1px;
}
</style>
</head>
<body>
<div id="content">
<table>
<tr>
<td>編號</td>
<td>姓名</td>
<td>年齡</td>
<td>性別</td>
<td>QQ</td>
</tr>
<c:forEach items="${list}" var="user" varStatus="sl">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.sex}</td>
<td>${user.QQ}</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
User.java
package com.wsl.demo.domain;
public class User {
private String id;
private String name;
private String age;
private String sex;
private String QQ;
public User() {
}
public User(String id, String name, String age, String sex, String QQ) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.QQ = QQ;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getQQ() {
return QQ;
}
public void setQQ(String QQ) {
this.QQ = QQ;
}
}
UserDao.java
package com.wsl.demo.dao;
import com.wsl.demo.domain.User;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
private static List<User> list = new ArrayList<>();
static {
list.add(new User("1","王明明","32","男","9876543"));
list.add(new User("1","李天一","39","女","8756543"));
list.add(new User("1","張明天","26","女","4566543"));
list.add(new User("1","董永","31","男","1298743"));
list.add(new User("1","李明","35","女","9456743"));
list.add(new User("1","尚明","22","男","3890543"));
}
public List<User> findAll() {
return list;
}
}
UserService.java
package com.wsl.demo.service;
import com.wsl.demo.dao.UserDao;
import com.wsl.demo.domain.User;
import java.util.List;
public class UserService {
public List<User> findAll() {
UserDao userDao = new UserDao();
List<User> list = userDao.findAll();
return list;
}
}
FindAllServlet.java
package com.wsl.demo.web;
import com.wsl.demo.domain.User;
import com.wsl.demo.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/FindAllServlet")
public class FindAllServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserService userService = new UserService();
List<User> list = userService.findAll();
request.setAttribute("list",list);
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
資料