jsp_el_jstl

jsp將內容的生成和展示相分離;jsp運行在服務器端,本質上是一個servlet,產生的Java文件和class保留在tomcat的word目錄下。

errorPage屬性

errorPage屬性的設置值可以使用相對路徑,如果以“/”開頭,表示相對於當前WEB應用程序的根目錄(注意不是站點根目錄),否則,表示相對於當前頁面。

可以在web.xml文件中使用<error-page>元素爲整個WEB應用程序設置錯誤處理頁面,其中的<exception-type>子元素指定異常類的完全限定名,<location>元素指定以“/”開頭的錯誤處理頁面的路徑。但如果設置了某個JSP頁面的errorPage屬性,那麼在web.xml文件中設置的錯誤處理將不對該頁面起作用。

<%@ page language="java" import="java.util.*" errorPage="/directive/error.jsp" pageEncoding="UTF-8"%>
<html>
  <head>
    <title>測試page指令的errorPage屬性</title>
  </head>
  <body>
    <%
      //這行代碼肯定會出錯,因爲除數是0,一運行就會拋出異常
        int x = 1/0;
    %>
  </body>
</html>
     <error-page> 

        <error-code>404</error-code> 
        <location>/error/hello?i=1</location> 
    </error-page> 
    <error-page> 
        <error-code>500</error-code> 
        <location>/WEB-INF/error/500.jsp</location> 
    </error-page> 
    <error-page> 
        <exception-type>java.lang.Exception</exception-type> 
        <location>/WEB-INF/exception/error.jsp</location> 
    </error-page>

=========================================

1、jsp指令

1.1、include指令:

靜態包含,就是將其他頁面或者servlet的內容包含進來,一起進行編譯運行.生成一個

                記住,生成到一個java文件中

java文件.

格式:
<%@include file="相對路徑或者是內部路徑" %>
例如:
<%@include file="/jsp/include/i1.jsp" %>

路徑:
相對路徑:
./或者什麼都不寫 當前路徑
上一級路徑  ../
絕對路徑:
帶協議和主機的絕對路徑
不帶協議和主機的絕對路徑
/項目名/資源

內部路徑:
不帶協議和主機的絕對路徑去掉項目名

請求轉發(java請求轉發,jsp請求轉發) 靜態包含 動態包含

-------------------------------------------------------------------------------------------------

1.2、taglib指令:導入標籤庫

格式:
<%@taglib prefix="前綴名" uri="名稱空間" %>
若導入之後
<前綴名:標籤 .. >
例如:
<c:if test="">輸出內容</c:if>

--------------------------------------------------------------------------------------------------

1.3、jsp內置對象

jsp的內置對象:★★★(9大內置對象)
在jsp頁面上可以直接使用的對象
內置對象 類型
out                     JspWriter
request               HttpServletRequest
response            HttpServletResponse
session               HttpSession

exception           Throwable(isErrorPage=true的時候才能使用)

page                  Servlet(java文件中用this,jsp中用page)
config                ServletConfig
application         ServletContext(servlet之間有通信,依賴於上下文,全局管理者)

pageContext      PageContext(當前頁面的上下文)

jsp的域對象:理解
application 整個項目
session 一次會話
request 一次請求
pageContext 一個頁面

pagecontext作用:理解
1.域對象
xxxAttribute()
2.操作其他域對象
方法:
xxxAttribute(...,int scope);(操作哪個域就把他寫上去)
scope取值:
APPLICATION_SCOPE 
SESSION_SCOPE 
REQUEST_SCOPE 
PAGE_SCOPE 
3.獲取其他的內置對象
getXxx()
注意:
getRequest():獲取request內置對象
4.便捷查找,
findAttribute(String key):
依次從pagecontext,request,session,application四個域中,查找相應的屬性,若查找到了返回值,且結束該次查找
若查找不到,返回一個null

jsp的動作標籤
<jsp:forward>:請求轉發  相當於java中  request.getRequestDispatcher(..).forward(..);
<jsp:forward page="內部路徑"></jsp:forward>
<jsp:include>:動態包含
就是將被包含頁面或者servlet的運行結果包含到當前頁面中.

<%
	pageContext.setAttribute("rkey","rvalue",PageContext.REQUEST_SCOPE);
%>
<%=request.getAttribute("rkey") %>
<%
	pageContext.setAttribute("rkey", "rvalue", PageContext.REQUEST_SCOPE);
	session.setAttribute("rkey", "svalue");
%>

通過pagecontext往request中放入一個值,取出來:<%=request.getAttribute("rkey") %>

<hr>
獲取session中的rkey:<%=session.getAttribute("rkey") %><br>
便捷查找:<%=pageContext.findAttribute("rkey") %><br>
便捷查找:<%=pageContext.findAttribute("akey") %><br>
<jsp:forward page="/jsp/action/for1.jsp"></jsp:forward>
<body>
include頁面
<hr>
	i1的內容:<%@include file="/jsp/include/i1.jsp" %>
<hr>
	i1的內容:<%@include file="/jsp/include/i2.jsp" %>
</body>

===================================

2、EL表達式(jsp內的表達式語言)

1)概述

        jsp的內置表達式語言,從jsp2.0開始.
用來替代<%=..%>
作用:
1.獲取域中數據 ★
2.執行運算 ★
3.獲取常見的web對象
4.調用java的方法
格式:

${el表達式}

2)獲取域中的數據

注意:★

若屬性名中出現了"."|"+"|"-"等特殊符號,需要使用scope獲取

例如: ${requestScope["arr.age"] }

a、獲取簡單數據

${pageScope|requestScope|sessionScope|applicationScope.屬性名}
以後經常使用:
${屬性名}:依次從pageContext,request,session,application查找指定屬性,若查找到返回值,結束該次查找
若查找不到,返回""

<%
pageContext.setAttribute("pkey","pvalue");
request.setAttribute("rkey","rvalue");
session.setAttribute("skey","svalue");
application.setAttribute("akey","avalue");
%>
<hr/>
<%=pageContext.getAttribute("pkey") %><br>
<%=request.getAttribute("rkey") %><br>
<%=session.getAttribute("skey") %><br>
<%=application.getAttribute("akey") %><br>
<%=application.getAttribute("aakey") %>(jsp獲取域對象獲取的是null)
<hr/>
${pageScope.pkey }<br>
${requestScope.rkey }<br>
${sessionScope.skey }<br>
${applicationScope.akey }<br>
(${applicationScope.aakey }el表達式獲取的是空字符串)
<hr/>
便捷獲取
${pkey },${rkey },${skey },${akey },${aakey }

b、獲取複雜的數據

${域中的名稱[index]}
獲取list中的數據
${域中的名稱[index]}
獲取map中的數據

${域中的名稱.鍵名}

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ page import="java.util.List" %>
<%
request.setAttribute("arr",new String[]{"a1","a2","a3","a4"});
List list = new ArrayList();
list.add("list1");
list.add("list2");
list.add("list3");
list.add("list4");
request.setAttribute("list",list);
Map map = new HashMap();
map.put("name","shuzk");
map.put("age",15);
request.setAttribute("map",map);
request.setAttribute("shuzk.age",23);
%>
<%=request.getAttribute("arr") %><br>
<%=((String[])request.getAttribute("arr"))[1] %><br>
${arr[1] }<hr>
<%=((List)request.getAttribute("list")).get(1) %><br>
${list[1] }<hr>
<%=((Map)request.getAttribute("map")).get("name") %><br>
${map.age }<hr>
${requestScope["shuzk.age"] }

c、JavaBean導航

java語言編寫的一個可重用的組件,
狹義上來說就是我們編寫的一個普通的java類 例如:User Person 
javabean規範:
1.必須是一個公共的具體的類  public class
2.提供私有的字段  private String id;//id稱之爲字段
3.提供公共訪問字段的方法 get|set|is方法
public String getId(){..}
一旦有公共的方法之後,get|set|is之後的內容,將首字母小寫,將這個東西稱之爲bean屬性
id就是一個bean屬性
4.提供一個無參的構造器
5.一般實現序列化接口  serializable

${域中javabean名稱.bean屬性}

private Integer id;
private String name;
private String password;
<%@page import="domain.User"%>
<%
User u = new User();
u.setId(2);
u.setName("shuzk");
u.setPassword("123");
request.setAttribute("user",u);
%>
<%=((User)request.getAttribute("user")).getName() %>
${user.id }

==================================================================

3)執行運算

四則運算 關係(>..) 邏輯(&& ||)
注意:
+:只能進行加法運算,字符串形式數字可以進行加法運算.
empty:判斷一個容器的長度是否爲0(array set list map),還可以判斷一個對象是否爲空
${empty 域中的對象名稱}
三元運算符

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="domain.User" %>
<%
	request.setAttribute("i", 3);
	request.setAttribute("j", 4);
	request.setAttribute("q", "12");
	request.setAttribute("k", "k");
	
	List l=null;
	request.setAttribute("list", l);
	
	List ll=new ArrayList();
	ll.add("22");
	request.setAttribute("list_", ll);
	
	User user=null;
	request.setAttribute("bean", user);
	
	User user_=new User();
	request.setAttribute("bean_", user_);
%>

${i+j }<br/>
${i+q }<br/>
${q+q }<br/>
<%-- ${i+k }<br/> --%>
<hr>
域中list的長度是否爲0:${empty list}<br/>
域中list_的長度是否爲0:${empty list_ }<br/>

<hr>
域中的bean是否爲空:${empty bean }<br/>
域中的bean_是否爲空:${empty bean_ }<br/>

<hr>
${ 3>4?"yes":"no" }<br/>
${i==3 }

==================================================================

4)EL的內置對象

11個
pageScope
requestScope
sessionScope
applicationScope

param
paramValues

header
headerValues

initParam

cookie★

pageContext★
注意:
除了pagecontext其餘對象獲取的全是map集合

瞭解:和參數相關的el內置對象
param
paramValues
瞭解:和請求頭相關的el內置對象
header
haederValues
瞭解:和全局初始化參數相關的el內置對象

initParam

<a href="/shuzk_a_jsp_EL_jstl/el/demo5.jsp?username=tom&password=123&hobby=drink&hobby=sleep">5</a>
${param.username }
${param.password }
${param }
${paramValues }
${paramValues.hobby[0] }
<hr>
${header }<hr>
${headerValues }
<hr>
referer:${header.referer }<br>
user-agent:${headerValues["user-agent"][0] }<hr>
${initParam }<hr>
${cookie.JSESSIONID.value }

cookie內置對象:
${cookie} 獲取map{key=Cookie}
例如:創建cookie
Cookie c=new Cookie("username","tom");
通過${cookie}獲取相當於
{username=new Cookie("username","tom")}
相當於map的key是cookie的鍵
map的value是當前cookie

若項獲取名稱username的cookie的value值(獲取tom)
${cookie.username.value}--javabean導航
注意:
java中Cookie的api
getName():獲取cookie的名稱
getValue():獲取cookie的value值
我們稱name和value是cookie的bean屬性
使用cookie內置對象:
${cookie.給cookie起名字.value}
例如:
獲取jsession的值
${cookie.JSESSIONID.value}
pageContext:獲取不是map集合,相當於jsp的pageContext內置對象
在jsp頁面中獲取項目名
${pageContext.request.contextPath}

==================================================

3、JSTL——JSP的標準標籤庫

jsp標準的標籤庫語言;apache的;用來替代java腳本
使用步驟:
1.導入jar包 (jstl.jar和standard.jar)
2.在頁面上導入標籤庫
<%@taglib prefix="" uri=""%>
例如:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl的分類:
core:核心類庫 ★
fmt:格式化|國際化
xml:過時了
sql:過時了
函數庫:很少使用
core:掌握
★c:if
★c:forEach
c:set 往域中設置值
c:choose c:when c:otherwise 分支

★c:if 判斷
<c:if test="${el表達式}">滿足的時候輸出的內容</c:if>
例如:
<c:if test="${3>4 }">
3大於4
</c:if>
<c:if test="${3<=4 }">
3不大於4
</c:if>
//////////////
★c:forEach 循環
格式1:
<c:forEach begin="從那裏開始" end="到那裏結束" step="步長" var="給變量起個名字" varStatus="循環狀態變量">
${i }--${vs.count }--${vs.current }<br>
</c:forEach>
 
varStatus:用來記錄循環的狀態
常用的屬性:
count:記錄次數
current:當前遍歷的內容
例如:
<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
${i }--${vs.count }--${vs.current }<br>
</c:forEach>

格式2:
<c:forEach items="${el獲取域中的容器}" var="n">
${n }
</c:forEach>

例如:
//遍歷list
<c:forEach items="${list }" var="n">
${n }
</c:forEach>

//遍歷map
<c:forEach items="${map }" var="en">
${en.key }-- ${en.value }<br/>
 </c:forEach>
擴展:
c:set 和 c:choose

函數庫:

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashSet"%>
<%@page import="java.util.Set"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="day" value="4"></c:set>
<c:choose>
	<c:when test="${day==1 }">1</c:when>
	<c:when test="${day==2 }">2</c:when>
	<c:when test="${day==3 }">3</c:when>
	<%-- <c:when test="${day==4 }">4</c:when> --%>
	<c:otherwise>
		567
	</c:otherwise>
</c:choose>
<hr>
<c:if test="${4==5 }">4=5</c:if>
<c:if test="${4<5 }">4<5</c:if>
<hr>
<c:forEach begin="1" end="10" step="1" var="i">${i }</c:forEach>
<hr>
<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
	${i }--${vs.count }--${vs.current }<br>
	<%-- ${vs } --%>
</c:forEach>
================================<br>
	<%
	//往域中放入一個list
	List l=new ArrayList();
	l.add(11);
	l.add(22);
	l.add(33);
	
	request.setAttribute("list", l);
	
	//往域中放入一個set
	Set s=new HashSet();
	s.add("11");
	s.add("22");
	s.add("33");
	request.setAttribute("set", s);
	
	
	//往域中放入一個map
	Map m=new HashMap();
	m.put("username","tom");
	m.put("age","18");
	request.setAttribute("map", m);
	
	
%>

<c:forEach items="${list }" var="n">
	${n }
</c:forEach>
<hr>
<!-- 
	for(Integer n:list){
		i
	}
	
 -->
 
 
 <c:forEach items="${set }" var="n" varStatus="vs">
 	${n }--${vs.count }<br>
  </c:forEach>
  <hr>
  
  <c:forEach items="${map }" var="en">
  	${en.key }-- ${en.value }<br/>
  </c:forEach>

==================================================================

案例1-步驟分析:
1.數據庫和表
create database day12;
use day12;
create table product(
id int primary key auto_increment,
pname varchar(20),
price double,
pdesc varchar(20)
);


insert into product values (null,'電視機',3200,'液晶曲面大電視');
insert into product values (null,'韭菜盒子',3,'味重請小心食用');
insert into product values (null,'益達',10,'韭菜伴侶');
insert into product values (null,'十三香',12,'守義牌');

新建一個項目
導入jar包:
驅動 dbutils c3p0 jstl
導入c3p0配置文件 和工具類
實體類:
private int id;
private String pname;
private double price;
private String pdesc;
2.index.jsp中添加一個連接
<a href="/day1201/findAll">展示所有商品</a>
3.FindAllServlet:
調用ProductService.findAll() 返回一個集合 List<Product>
將list放入request域中
請求轉發到product_list.jsp
4.ProductService.findAll() 調用dao.findAll()
5.dao.findAll()  使用beanListHandler()
6.在product_list.jsp展示所有商品
使用 c:forEach

使用javabean導航獲取裏面的數據

我也遇到了你這樣的問題,英文和數字照常顯示,中文全變成問好。
你的servlet中的doget方法是自動生成的吧,你把其中的response.getWriter().append("Served at: ").append(request.getContextPath());
去掉試試。

/////////////////////////////
案例2-重寫登錄案例
需求:

在頁面上填寫用戶名和密碼及驗證碼,點擊提交,先校驗驗證碼是否一致.若一致後再去找數據庫.順便記住用戶名

        添加驗證碼,重寫登陸案例。登陸成功提示歡迎回來,登錄失敗,在登陸頁面提示用戶名不匹配。驗證碼加上去。

技術:
表單 
驗證碼
servlet
request
session
cookie
步驟分析:
1.數據庫和表
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20)
);
2.創建一個項目
包結構
jar包
工具類和配置文件
3.表單 login.jsp
4.表單提交 loginServlet
loginServlet:
獲取驗證碼(從前臺傳過來和session中)
判斷兩個驗證碼是否一致
若不一致:
填寫錯誤信息,請求轉發到login.jsp
若一致:獲取用戶名和密碼
調用userService的getuserbyusernameandpassword 返回值 User user
判斷user是否爲空
若爲空:填寫錯誤信息,請求轉發到login.jsp
若不爲空:
繼續判斷是否勾選了記住用戶名
若勾選:
創建cookie 將用戶名放入cookie寫回瀏覽器
將user對象放入session中
頁面重定向 index.jsp 展示 xxx:歡迎回來

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章