Servlet(二)

重定向


  1. 地址變了
  2. 瀏覽器做了兩次請求
  3. 可以跳轉(zhuǎn)任何位置即使不是自己項(xiàng)目
  4. 無法使用上一次請求的res,因?yàn)槭莾纱握埱?/li>

請求轉(zhuǎn)發(fā)


  1. 地址欄不變
  2. 一次請求
  3. 服務(wù)端內(nèi)部幫客戶端執(zhí)行工作
  4. 只能跳轉(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


  1. 全局變量<%! int a=10>
  2. 局部變量<%@ int a=10>
  3. 使用變量<%=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á)式配合,偏向于邏輯


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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評(píng)論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,955評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,195評(píng)論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評(píng)論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容