JSP & EL表达式 & JSTL

JSP:入门学习

*. 注释:
	1. html注释:
		<!-- -->:只能注释html代码片段
	2. jsp注释:推荐使用
		<%-- --%>:可以注释所有
	* <!--Html注释-->----在翻译成的java文件中可见,网页源码中能看到该注释
	* /*Java注释 */----在翻译成的java文件中可见,网页源码中不能看到该注释
	* <%--Jsp注释--%>----在翻译成的java文件中不可见,网页源码中不能看到该注释
1. 概念:
	* Java Server Pages: java服务器端页面
		* 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
		* 用于简化书写!!!

2. 原理
	* JSP本质上就是一个Servlet

3. JSP的脚本:JSP定义Java代码的方式
	1. <%代码%>:
		定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
	2. <%! 代码 %>:
		定义的java代码,在jsp转换后的java类的成员位置。
	3. <%= 代码 %>:
		定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

4. JSP的内置对象:
	* 在jsp页面中不需要获取和创建,可以直接使用的对象
	* jsp一共有9个内置对象。
		* request
		* response
		* out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
			* response.getWriter()和out.write()的区别:
				* 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
				* response.getWriter()数据输出永远在out.write()之前

	变量名				真实类型						作用
	* pageContext		PageContext				当前页面共享数据,可以获取其他八个内置对象
	* request			HttpServletRequest		一次请求访问的多个资源(转发)
	* session			HttpSession				一次会话的多个请求间
	* application		ServletContext			所有用户间共享数据
	* response			HttpServletResponse		响应对象
	* page				Object					当前页面(Servlet)的对象  this
	* out				JspWriter				输出对象,数据输出到页面上
	* config			ServletConfig			Servlet的配置对象
	* exception			Throwable				异常对象
5. 指令
	* 作用:用于配置JSP页面,导入资源文件
	* 格式:
		<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
	* 分类:
		1. page	: 配置JSP页面的
			* Language: 定义页面语言 java 
			* contentType:等同于response.setContentType()
				1. 设置响应体的mime类型以及字符集
				2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置
					pageEncoding属性设置当前页面的字符集)
			* PageEncodeing: 定义页面语言(浏览器的)
			* import:导包
			* errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
			* isErrorPage:标识当前也是是否是错误页面。
				* true:是,可以使用内置对象exception
				* false:否。默认值。不可以使用内置对象exception
			* Session: 声明当前jsp是否初始化Session内置对象,默认为 true 表示初始化

		2. include	: 页面包含的。导入页面的资源文件
			* <%@include file="top.jsp"%>
			一般情况下include会写在body(因为包含的是内容),包含的内容的位置和你写的include一致
		3. taglib	: 导入资源
			* <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
				* prefix:前缀,自定义的

6. 动态标签
	* 页面跳转的标签
		<jsp:forward page="tail.jsp(url)"></jsp:forward>

		实现访问首页:
			index.jsp--->转发到servlet中-->依赖service/依赖dao获取到的结果返回到servlet中,将结果存储到域request对象中-->转发到真正的jsp首页显式
	* 动态包含与指令包含
		<jsp:include page="tail.jsp"></jsp:include>
		<%@include file="tail.jsp" %> 
		 	* 动态包含和指令包含两者间的区别
		 		1: jsp动态指jsp:include  静态包含就是指令包含
		 		2: 静态包含<@include> 是在编译前就将两个页面整合在一起,同一编译,动态标签的包含两个页面都会编译,在一个页面的jsp_servlet的方法中调用第二个jsp_servlet方法
		 		3: 如果被包含的标签中有动态信息,静态包含是获取不到的.
7. 域对象
	Servlet: 	servletContext   	session   		request
	Jsp:		application   		session  		request    	pageContext

	Jsp中的域对象
		1. pageScope			--> pageContext  
		2. requestScope 		--> request
		3. sessionScope 		--> session
		4. applicationScope 	--> application(ServletContext)

		pageContext域对象有一个独有的方法: findAttribute()
			1、可以获取所有其他域对象中的值
			2、当不同域对象中有相同key值时,是从最小范围开始寻找,找到即可

			<%=pageContext.getAttribute("rkey", pageContext.REQUEST_SCOPE) %>
			<%=pageContext.findAttribute("rkey") %>
8. web.xml
	<error-page>
	  	<error-code>404</error-code>
	  	<location>/error/404.jsp</location>
	</error-page>

	只要发生404错误,就会跳转到404.jsp页面

EL表达式

1. 概念:Expression Language 表达式语言
2. 作用:替换和简化jsp页面中java代码的编写
3. 语法:${表达式}
4. 注意:
	* jsp默认支持el表达式的。如果要忽略el表达式
		1. 设置jsp中page指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式
		2. \${表达式} :忽略当前这个el表达式
	对象:
		param 				${param. username }  ${param. pwd }
		paramValues 		${paramValues . hobby[1] }<br>
		Header 				${header. host }
		HeaderValues 		${headerValues.host[1] }<br>
		initParam 			${initParam. pageSize }
		Cookie 				${cookie.name1.value }
								|      |	 |
				request.getCookies()   |	 |
								Cookie对象 	 |
										cookie对象.getValue()

5. 使用:
	1. 运算:
		* 运算符:
			1. 算数运算符: + - * /(div) %(mod)
			2. 比较运算符: > < >= <= == !=
			3. 逻辑运算符: &&(and) ||(or) !(not)
			4. 空运算符: empty
				* 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
				* ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
				* ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
			5. ${requestScope.users.size()}: 获取list长度
	2. 获取值
		1. el表达式只能从域对象中获取值
		2. 语法:
			1. ${域名称.键名}:从指定域中获取指定键的值
				* 域名称:                 域值 1-4 从小到大
					1. pageScope		--> pageContext  
					2. requestScope 	--> request
					3. sessionScope 	--> session
					4. applicationScope --> application(ServletContext)

					pageScope注意:
						* 面对页面,单纯的某一个页面的作用域
						* 作用域最小,但对于页面来说,他是老大,可以获取其他8个内置对象
						* pageContext.findAttribute("");
				* 举例:在request域中存储了name=张三
				* 获取:${requestScope.name}

			2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
			
			3. 获取对象、List集合、Map集合的值
				1. 对象:${域名称.键名.属性名}
					* 本质上会去调用对象的getter方法

				2. List集合:${域名称.键名[索引]}
					User user = new User();
			        user.setName("张三");
			        user.setAge(23);
			        user.setBirthday(new Date());
			        request.setAttribute("u",user);

			        ${requestScope.u.name}<br>
			        ${u.age}<br>

					list.add("aaa");
			        list.add("bbb");
			        list.add(user);

			        ${list}<br>
				    ${list[0]}<br>
				    ${list[1]}<br>
				    ${list[2].name}
				3. Map集合:
					* ${域名称.键名.key名称}
					* ${域名称.键名["key名称"]}

					map.put("sname","李四");
			        map.put("gender","男");
			        map.put("user",user);

			        ${map.gender}<br>
				    ${map["gender"]}<br>
				    ${map.user.name}

	3. 隐式对象:
		* el表达式中有11个隐式对象
		* pageContext:
			* 获取jsp其他八个内置对象
				* ${pageContext.request.contextPath}:动态获取虚拟目录
			<%	
				//获取项目名
				String path = request.getContextPath();
				//获取tomcat 协议+地址+端口号+ 获取项目名
				String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
			%>
			// http://localhost:8080/xmsms/

JSTL

1. 概念:JavaServer Pages Tag Library  JSP标准标签库
	* 是由Apache组织提供的开源的免费的jsp标签		<标签>
2. 作用:用于简化和替换jsp页面上的java代码		
3. 使用步骤:
	1. 导入jstl相关jar包  jstl.jar  standard.jar
	2. 引入标签库:taglib指令:  <%@ taglib %>
	3. 使用标签

4. 常用的JSTL标签
	1. if:相当于java代码的if语句
		1. 属性:
           		 * test 必须属性,接受boolean表达式
               		 * 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
               		 * 一般情况下,test属性值会结合el表达式一起使用
		2. 注意:
   			* c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签

   			<c:if test="${not empty list}">
				遍历集合...
			</c:if>
			eg:
				<c:if test="${3>4}" var="flag">
					你好
				</c:if>
				<c:if test="${!flag}" var="stau">
					我好
				</c:if>
				<c:if test="${stau}">
					大家好
				</c:if>

				上述代码输出: 我好  大家好
	2. choose:相当于java代码的switch语句
		1. 使用choose标签声明         			    相当于switch声明
       		2. 使用when标签做判断         			相当于case
				* test 必须属性,			        接受boolean表达式
        	3. 使用otherwise标签做其他情况的声明    	相当于default

        	<c:choose>
				<c:when test="${num ==1}">星期一</c:when>
				<c:otherwise>输入数字有误</c:otherwise>
			</c:choose>
	3. foreach:相当于java代码的for语句
		1. 完成重复的操作
            for(int i = 0; i < 10; i ++){

            }
        * 属性:
            begin:开始值
            end:结束值
            var:临时变量
            step:步长
            varStatus:循环状态对象
                index:容器中元素的索引,从0开始
                count:循环次数,从1开始

        <c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
		    ${i} <h3>${s.index}<h3> <h4> ${s.count} </h4><br>

		</c:forEach>
        2. 遍历容器
            List<User> list;
            for(User user : list){

            }

            * 属性:
                items:容器对象
                var:容器中元素的临时变量
                varStatus:循环状态对象
                    index:容器中元素的索引,从0开始
                    count:循环次数,从1开始

            <%
		        List list = new ArrayList();
		        list.add("aaa");
		        list.add("bbb");
		        list.add("ccc");
		        request.setAttribute("list",list);
		    %>

		    <c:forEach items="${list}" var="str" varStatus="s">
		            ${s.index} ${s.count} ${str}<br>
		    </c:forEach>

		    <%
				Map<String,User> map = new HashMap<>();
				map.put("u1", new User(1,"zs",12));
				map.put("u2", new User(2,"ls",22));
				map.put("u3", new User(3,"ww",44));
				map.put("u4", new User(4,"zl",62));
				request.setAttribute("map", map);
			%>
			<c:forEach items="${map}" var="vk">
				${vk.key}
				${vk.value.userName}
				<br>
			</c:forEach>

	4. set , out
		<c:set var="i" value="18"></c:set>
			${i}-------------18
			相当于往域对象中存入变量为i,值为18的键值对
		<c:out value="${i}" default="此时取不到值" escapeXml="false"></c:out>
			Value:输出的内容
			Default:当value中的el表达式中对象不存在时,显示default中设置的提示语句
			escapeXml:默认值为true,代表原样输出不解析标签;反之设置为false时,会将含有的标签进行解析
5. 常用
	* 截断字符串  
		<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
		${fn:substring(goods.description,0,5) }
	* 格式化时间
		<fmt:formatDate value="${u.ucreate_time }" pattern="yyyy-MM-dd HH:mm:ss"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值