## jsp servlet 是無法將後端獲取的數據傳遞給html 頁面的,無法再servlet 中通過轉發或者是重定向的方式,給html 頁面傳遞響應的後端數據,servlet 中由於拼接過於繁瑣,是不適合寫html 的因此引入了 jsp ,既可以編寫 html標簽,也可以寫 Java 代碼, ...
jsp
servlet 是無法將後端獲取的數據傳遞給html 頁面的,無法再servlet 中通過轉發或者是重定向的方式,給html 頁面傳遞響應的後端數據,servlet 中由於拼接過於繁瑣,是不適合寫html 的因此引入了 jsp ,既可以編寫 html標簽,也可以寫 Java 代碼,
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
jsp的本質是Servlet
- 靜態資源 html css js 圖片
- html標簽
<%@ %>
指令<% %>
可以在這個標簽中書寫Java代碼<%= %>
用於輸出一段內容呈現在html中<%-- --%>
jsp中的註釋,這個註釋和html的註釋不一樣,這個註釋相當於是生成在jsp專業的servlet中,最終的頁面是看不到這個註釋的<jsp:include page="xx">
用於做頁面引用和包含,類似於html 的iframe 標簽
頁麵包含
<jsp:include page="被包含的文件名"></jsp:include>
cookie 和 session
- cookie 由伺服器創建由瀏覽器保存,伺服器通過響應給客戶端發送 cookie(一般不會以明文形式出現)
// 通過servlet實現cookie
@WebServlet("/testCookie")
public class TestCookieServlet extends HttpServlet {
@Override
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 實例化一個 cookie 對象
Cookie c = new Cookie("jerk","wyf");
// 設置 cookie 的有效期(單位秒)
c.setMaxAge(60*24*60);
// 設置 cookie 的觸發路徑,當設置為 / 的時候,瀏覽器向伺服器發送的所有請求都會攜帶這個 cookie
c.setPath("/");
// 將 cookie 數據添加到響應中
resp.addCookie(c);
}
}
// 通過servlet讀取cookie
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 讀 cookie
Cookie[] cookies = req.getCookies();
if(null != cookies){
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " : " + cookie.getValue());
}
}
}
}
- 由於cookie 的安全性不高,因此引入了 session
⭐session 代表著單伺服器會話,從用戶打開一個網頁開始,無論在這個網頁中訪問了多少頁面,點擊了多少鏈接,都屬於同一個會話,知道用戶關閉瀏覽器為止,session 是由 tomcat 自己創建,開發者只是獲取了 tomcat 創建的 session,在jsp中,session 是內置對象,並不需要定義,就可以直接使用,如果是在 servlet 中 需要使用 HttpSession session = req.getSession() 來獲取,但是 jsp 並不需要 session 對象本身可以用倆存儲數據,用於跨頁面的信息傳遞
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
session.setAttribute("session01","robot01");
%>
<a href="getSession.jsp">點擊跳轉到獲取信息的jsp</a>
</body>
</html>
四個作用域對象
- pageContext 頁面對象,用於在當前頁面進行傳值
- request 請求對象,用於在一次請求中傳值
- session 會話對象,用於在同一個會話中做數據傳遞
- application 全局對象,所有用戶共用的對象
pageContext 傳參:
<%pageContext.setAttribute("direct","robot01");%>
<%=pageContext.getAttribute("direct")%>
request 傳參:
<%request.setAttribute("student",student);%>
<%Student student = (Student) request.getAttribute("student");%>
session 傳參:
<%session.setAttribute("robotName","robot01");%>
<%=session.getAttribute("robotName")%>
application 傳參:
九大內置對象
在jsp中不需要定義就可以直接使用的對象
- request 請求
- response 響應
- out 輸出
- pageContext 代表頁面作用域對象
- session 會話對象
- application 全局對象
- page 等價於當前 jsp 轉譯的 servlet類 的實例--this
- config 用於獲取web.xml中初始化參數的,一般不用
- exception 用於做jsp頁面的異常處理
jstl(jsp standard tag library)標準標簽庫
允許開發人員像使用 HTML 標簽一樣,在 jsp 中開發 Java 功能
// 導入依賴
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<c:set var="jerk" value="$('wyf')" scope="request"></c:set>
<%-- c:if 會根據 test 中的判斷結果決定其中的標簽和內容是否顯示在頁面中 --%>
<c:if test="${age>18}">
<p>這個人成年了</p>
</c:if>
<c:if test="${!(age>18)}">
<p>這個人沒成年</p>
</c:if>
<%
pageContext.setAttribute("zhiNan","wjp");
pageContext.setAttribute("list",new ArrayList<>());
pageContext.setAttribute("jerk",null);
%>
<c:if test="${empty zhiNan}">
<p>沒有直男</p>
</c:if>
<c:if test="${empty list}">
<p>集合的size為0</p>
</c:if>
el表達式
將複雜的代碼進行簡化,方便我門從四個不同的作用域對象中獲得屬性值
⭐如果在四個不同作用域對象下存了同一個屬性的值,那麼 EL 表達式遵循作用域越小,作用域越高的原則,類Java
<%
request.setAttribute("jerk","zyy");
Student s = new Student(1,"wyf",20);
request.setAttribute("s",s);
%>
傳統方式獲取對象:<%=request.getAttribute("jerk")%><br>
EL表達式獲取對象:${jerk}<br>
傳統方式獲取對象:<%=((Student)request.getAttribute("s")).getName()%><br>
EL表達式獲取對象:${s.name}<br>
⭐el表達式結合c:foreach 實現集合的快速遍歷
<%
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1,"robot01",20));
studentList.add(new Student(2,"robot02",20));
studentList.add(new Student(3,"robot01",20));
request.setAttribute("studentList",studentList);
%>
<table>
// 會自動根據list中的個數,自動分配表格的列
<c:forEach items="${studentList}" var="s" varStatus="st">
<tr>
<td>${s.id}</td>
<td>${s.name}</td>
<td>${s.age}</td>
</tr>
</c:forEach>
</table>
MVC 設計模式
- M 模型層:實體類 + JDBC
- V 視圖層:jsp + html(儘可能不出現 java 代碼)
- C 控制器層:servlet(負責接受請求,調用業務邏輯,決定跳轉的頁面,絕對不會出現 html 代碼)
過濾器(Servlet.filter)
對請求進行過濾,可以對所有請求進行中文處理,對 session 進行用戶校驗,如果存在多個過濾器,順序根據過濾器首字母排序
public class A_EncodingFilter implements Filter {
@Override
// 過濾器初始化
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
// 核心過濾方法
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 傳參向下轉型
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
// 把所有請求攔截,並設置字元集編碼
req.setCharacterEncoding("UTF-8");
// 放行請求
filterChain.doFilter(req,resp);
}
@Override
// 過濾器銷毀
public void destroy() {
}
}