重定向
- 地址變了
- 瀏覽器做了兩次請求
- 可以跳轉(zhuǎn)任何位置即使不是自己項(xiàng)目
- 無法使用上一次請求的res,因?yàn)槭莾纱握埱?/li>
請求轉(zhuǎn)發(fā)
- 地址欄不變
- 一次請求
- 服務(wù)端內(nèi)部幫客戶端執(zhí)行工作
- 只能跳轉(zhuǎn)自己項(xiàng)目,效率高
public class Login extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username);
response.setContentType("text/html;charset=utf-8");
if (username.equals("root")&&password.equals("123")) {
//重定向:地址變了
//瀏覽器做了兩次請求
//可以跳轉(zhuǎn)任何位置即使不是自己項(xiàng)目
//無法使用上一次請求的res,因?yàn)槭莾纱握埱? /**
* 早期寫法:
* response.setStatus(302);
* response.setHeader("Location", "success.html");
*/
response.sendRedirect("success.html");
//請求轉(zhuǎn)發(fā):地址欄不變,一次請求,服務(wù)端內(nèi)部幫客戶端執(zhí)行工作,只能跳轉(zhuǎn)自己項(xiàng)目,效率高
// request.getRequestDispatcher("success.html").forward(request, response);
}else{
response.getWriter().write("密碼錯(cuò)誤");
}
}
Cookie
public class Login extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie cookie=new Cookie("name", "qiang");
//設(shè)置cookie有效期,默認(rèn)情況下是-1(負(fù)值代表關(guān)閉瀏覽器即失效)
cookie.setMaxAge(3600*24);//秒為單位,此時(shí)為一天有效期
//設(shè)置有效域
// cookie.setDomain(pattern);
//設(shè)置新值
// cookie.setValue(newValue);
//設(shè)置有效路由
// cookie.setPath(uri);
//給響應(yīng)添加cookie
response.addCookie(cookie);
//清除cookie,記得一定要add進(jìn)去
Cookie cookie2=new Cookie("name", "");
cookie2.setMaxAge(0);
//獲取cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
response.getWriter().write(cookie.getValue());
}
}
}
}
Session
session默認(rèn)時(shí)間是30分鐘(tomcat配置文件規(guī)定的,可修改),另外關(guān)閉服務(wù)器也會(huì)銷毀
// 創(chuàng)建session
HttpSession session = request.getSession();
// 得到會(huì)話的id
String id = session.getId();
// 設(shè)置數(shù)據(jù)
// session.setAttribute(arg0, arg1);
// 獲取數(shù)據(jù)
// session.getAttribute(arg0);
// 移除數(shù)據(jù)
// session.removeAttribute(arg0);
//強(qiáng)制讓會(huì)話失效,內(nèi)部數(shù)據(jù)也都沒有了
// session.invalidate();
JSP
- 全局變量<%! int a=10>
- 局部變量<%@ int a=10>
- 使用變量<%=b/a>
JSP三大指令
<%@ 指令名稱%>
Page指令
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
-- pageEncoding:jsp文件的編碼格式
-- extends: 用于jsp指定jsp翻譯成java文件后繼承的父類
-- session: true/false 用于控制,在該jsp頁面否能直接使用session對象
-- errorPage: 值是錯(cuò)誤頁面的路徑
-- isErrorPage: 代表當(dāng)前jsp頁面時(shí)錯(cuò)誤信息頁面,一般配合上一個(gè)使用(獲取錯(cuò)誤信息:exception.toString())
include指令
包含其他jsp頁面
靜態(tài)包含:另外一個(gè)頁面所有內(nèi)容都包含進(jìn)來,包括title等等
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="other.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
index頁面
</body>
</html>
說明:include可以在任意位置,但是位置影響了界面的上內(nèi)容顯示的位置
taglib標(biāo)簽
引入標(biāo)簽庫
<%@ taglib prefix="" uri="" %>
-- prefix:標(biāo)簽庫的路徑
-- uri: 標(biāo)簽庫的別名
JSP的動(dòng)作標(biāo)簽
<body>
<!-- 包含制定的頁面,這是動(dòng)態(tài)包含,也就是不把包含的頁面所有元素標(biāo)簽全部拿過來輸出,
而是把它的運(yùn)行結(jié)果拿過來;但是html源碼和上面的靜態(tài)包含相同,只有看java源碼才能看出來區(qū)別 -->
<%-- <jsp:include page="other.jsp"></jsp:include> --%>
<!-- 在包含某個(gè)頁面或者跳轉(zhuǎn)某個(gè)頁面的時(shí)候,加入這個(gè)參數(shù) -->
<%-- <jsp:param value="" name=""/> --%>
<!-- 前往其他頁面 ,等同于請求轉(zhuǎn)發(fā)-->
<jsp:forward page="other.jsp">
<jsp:param value="beijing" name="address"/>
</jsp:forward>
</body>
</html>
獲取參數(shù):在other.jsp中
<%=request.getParameter("address") %>
JSP內(nèi)置對象(九個(gè))
可以在jsp頁面上直接使用的對象,不用創(chuàng)建
四大作用域?qū)ο?/h3>
存儲(chǔ)和取數(shù)據(jù)都是 setAttribute和getAttribute
- pageContext:當(dāng)前頁面(pageContext),通過當(dāng)前對象可以拿到其他八個(gè)對象,但是一般不這么使用
- request: 一次請求(HttpServletRequest)
- session:一次會(huì)話(多次請求與響應(yīng),但是瀏覽器關(guān)閉了則屬于其他會(huì)話,HttpSession)
- application:整個(gè)工程,服務(wù)器關(guān)閉后不能訪問,其實(shí)是servletContext
- out:(JspWriter)注意out的內(nèi)容其實(shí)是放到response.getWriter的緩沖區(qū)中才輸出,
所以如果出現(xiàn)out和response.getWriter的輸出,即使out在上面也是
response.getWriter的先輸出,而且jsp內(nèi)部的普通文本不含任何標(biāo)簽的,
也是默認(rèn)使用out輸出的,所以也會(huì)在response.getWriter輸出的內(nèi)容之后
- response:(HttpResponse)
- exception(isErrorPage中才有):輸出錯(cuò)誤才使用(Throwable)
- page:當(dāng)前jsp翻譯的java類的實(shí)例(Object)
- config:servletConfig
區(qū)別.png
EL表達(dá)式
簡化jsp中java代碼的書寫 ${}
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<% pageContext.setAttribute("name","qiang"); %>
<% application.setAttribute("name","qiang1"); %>
<% session.setAttribute("name","qiang2"); %>
<% request.setAttribute("name","qiang3"); %>
<p>使用EL表達(dá)式獲取值</p>
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }
<p>存儲(chǔ)數(shù)組</p>
<%
String[] arr={"a","b","c"};
pageContext.setAttribute("arr",arr);
%>
${arr[0] }
<p>存儲(chǔ)集合</p>
<%
List arr1=new ArrayList<String>();
arr1.add("aa");
application.setAttribute("arr1",arr1);
Map arr2=new HashMap();
arr2.put("aaa",18);
session.setAttribute("arr2",arr2);
%>
<!-- 如下方式:如果不指定域,則依此從pageContext request session application找 -->
${arr1[0] } ${arr2.aaa }
<br/>
<!-- 還可以做一些簡單判斷,例如|| > + - * / 等 -->
${empty arr1 }
</body>
</html>
EL表達(dá)式是十一個(gè)內(nèi)置對象
- pageContext:頁面上下文
> 作用域相關(guān)
- pageScope
- requestScope
- sessionScope
- applicationScope
- header:頭信息
- headerValues
- param:參數(shù)信息
- paramValues
- cookie
- initParams:全局初始化參數(shù)
JSTL
替換<%%>寫法,一般與EL表達(dá)式配合,偏向于邏輯
存儲(chǔ)和取數(shù)據(jù)都是 setAttribute和getAttribute
- pageContext:當(dāng)前頁面(pageContext),通過當(dāng)前對象可以拿到其他八個(gè)對象,但是一般不這么使用
- request: 一次請求(HttpServletRequest)
- session:一次會(huì)話(多次請求與響應(yīng),但是瀏覽器關(guān)閉了則屬于其他會(huì)話,HttpSession)
- application:整個(gè)工程,服務(wù)器關(guān)閉后不能訪問,其實(shí)是servletContext
- out:(JspWriter)注意out的內(nèi)容其實(shí)是放到response.getWriter的緩沖區(qū)中才輸出,
所以如果出現(xiàn)out和response.getWriter的輸出,即使out在上面也是
response.getWriter的先輸出,而且jsp內(nèi)部的普通文本不含任何標(biāo)簽的,
也是默認(rèn)使用out輸出的,所以也會(huì)在response.getWriter輸出的內(nèi)容之后
- response:(HttpResponse)
- exception(isErrorPage中才有):輸出錯(cuò)誤才使用(Throwable)
- page:當(dāng)前jsp翻譯的java類的實(shí)例(Object)
- config:servletConfig
區(qū)別.png
簡化jsp中java代碼的書寫 ${}
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<% pageContext.setAttribute("name","qiang"); %>
<% application.setAttribute("name","qiang1"); %>
<% session.setAttribute("name","qiang2"); %>
<% request.setAttribute("name","qiang3"); %>
<p>使用EL表達(dá)式獲取值</p>
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }
<p>存儲(chǔ)數(shù)組</p>
<%
String[] arr={"a","b","c"};
pageContext.setAttribute("arr",arr);
%>
${arr[0] }
<p>存儲(chǔ)集合</p>
<%
List arr1=new ArrayList<String>();
arr1.add("aa");
application.setAttribute("arr1",arr1);
Map arr2=new HashMap();
arr2.put("aaa",18);
session.setAttribute("arr2",arr2);
%>
<!-- 如下方式:如果不指定域,則依此從pageContext request session application找 -->
${arr1[0] } ${arr2.aaa }
<br/>
<!-- 還可以做一些簡單判斷,例如|| > + - * / 等 -->
${empty arr1 }
</body>
</html>
- pageContext:頁面上下文
> 作用域相關(guān)
- pageScope
- requestScope
- sessionScope
- applicationScope
- header:頭信息
- headerValues
- param:參數(shù)信息
- paramValues
- cookie
- initParams:全局初始化參數(shù)
替換<%%>寫法,一般與EL表達(dá)式配合,偏向于邏輯
1.導(dǎo)入jar包
需要的jar.png
2.在jsp文件中導(dǎo)入jstl,一般只使用核心包即可
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用標(biāo)簽:
<c:if test=""></c:if>
<c:set></c:set>
<c:forEach></c:forEach>
基本案例:
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 使用jstl使用1.1版本,1.0版本不支持el表達(dá)式 -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 默認(rèn)把值存儲(chǔ)到pageScope中,但是可以指定scope -->
<c:set value="qiang" var="name" scope="session"></c:set>
${sessionScope.name }
<c:set value="18" var="age" scope="session"></c:set>
<!-- 此處的var指的是if的判斷結(jié)果存儲(chǔ)到域中,一般是一個(gè)布爾值,默認(rèn)是page,注意此時(shí)
書寫的時(shí)候不是pageScope而是page,是jstl的規(guī)定,其實(shí)就是pageScope
-->
<c:if test="${age>10 }" var="flag" scope="page" >年齡大于10</c:if>
<c:if test="${age<=10 }">年齡小于等于10</c:if>
<!-- step是步數(shù) -->
<c:forEach begin="1" end="10" var="i" step="2" >
${i }
</c:forEach>
<%
List list=new ArrayList();
list.add(new User("zhangsan",18));
%>
<!-- 遍歷對象,注意此處 items內(nèi)部必須是el表達(dá)式,內(nèi)部是要遍歷的對象-->
<c:forEach var="user" items="${users }" >
${user.name }--${user.age }
</c:forEach>
</body>
</html>