web day11(jsp、标签)

web 专栏收录该内容
19 篇文章 0 订阅

jsp概述
在Servlet中书写后台逻辑代码和前台页面代码,十分复杂,如果页面构成繁琐,则servlet编写有很大的难度,于是sun公司提供了一种在页面中既可以书写html又可以书写Java代码的技术,这门技术简化了前台和后台代码的切换操作,提升了开发的便利性,这门技术就是jsp技术。
jsp时sun公司提供的一种动态资源开发技术。
jsp原理:
a.jsp页面在第一次被访问的时候,会被jsp翻译引擎翻译为一个servlet文件,其中页面的html和Java代码全部包含在文件中。访问jsp页面,就是访问这个servlet文件,会使其中的service()方法执行。
b.index_jsp.java文件内的类继承了HttpJspBase,HttpJspBase是一个servlet,所以当前类也是一个servlet。
c.实验:
目录:apache-tomcat-7.0.62\work\Catalina\localhost\day13-jsp\org\apache\jsp
1.模板元素:
html页面中的html元素在被访问时,会被jsp翻译引擎翻译为模板元素。
页面中的模板元素,在翻译为servlet文件后,会以out.write()的方式输出到浏览器中。
在这里插入图片描述
在这里插入图片描述
2.jsp脚本表达式:
语法:<%=jsp脚本表达式%>直接量或具有返回值的表达式request.getContextPath(),脚本表达式会被jsp引擎翻译为表达式的结果值
在这里插入图片描述
页面中的jsp脚本表达式,在被翻译为servlet文的时候,会放在servlet文件对应的位置上,在计算结果后,通过out.print()输出页面。
3.jsp脚本片段
语法:<%jsp脚本片段%>
在这里插入图片描述
在这里插入图片描述
页面中的jsp脚本片段,在被翻译为servlet文件时,会被原封不动的翻译成Java语句,出现在servlet文件的对应位置。并且脚本片段可以书写成多个部分,每一个部分都不完整,但是需要保证这些不完整的脚本在翻译为servlet文件后,可以组成完整的Java代码,即可编写。

4.jsp语法<%!jsp声明%>
页面中的jsp声明,在被jsp引擎翻译为servlet文件时,会变成成员变量或者方法
在这里插入图片描述
在这里插入图片描述
这个jsp声明可以看成是整个类的变量和方法,如果需要调用,则可以在页面中的任意位置被调用。
5.jsp注释
语法:<%–jsp注释–%>

<!--html注释-->
html注释会被翻译为模板元素,但是由于是html注释的内容,不会再页面中产生输出
<%//Java注释%>
Java注释会被翻译成Java代码,出现再servlet文件对应的位置,由于是注释不会产生任何的输出
<%---jsp注释-%>
jsp注释再被翻译成servlet文件的过程中,就会被抛弃,不会出现在servlet文件中(注意:慎用)

6.jsp指令形式:
page指令:用于规定jsp翻译引擎如何翻译当前页面
include指令:用于导入页面
taglib指令:用于引入外部的标签库
i.page指令
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
b.include指令
<%@include file=""%>
在当前的jsp页面引入其它的jsp页面,组成一个jsp输出,如果页面的某部分重复出现很多次,则可以独立成一个jsp在其它的jsp中引入。
c.taglib指令
<%@ taglib uri="" prefix=""%>
在当前的页面引入标签库
案例:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" session="false" errorPage="exception.jsp"%><!-- errorPage="error.jsp" 当前页面适用-->
<%@page import="java.io.FileOutputStream,java.io.FileInputStream" %>
<!DOCTYPE HTML>
<html>
  <head>
  </head>
  <body>
  	<h1>今天的天气好晴朗</h1>
  	<%=request.getContextPath() %>
  	<%for(int i=0;i<5;i++){
  	%>
  	我是个学生。
  	<%
  	} %>
  	<%!
  	int i=0;
  	public void add(){}
  	static {}
  	{}
  	 %>
  	 <%
  	 FileOutputStream o;
  	 FileInputStream i;
  	 HttpServletRequest req;
  	  %>
  	 <%--  <%=1/0 %> --%>
  	<%--  <%request.getRequestDispatcher("/foot.jsp").include(request, response); %> 动态的请求包含--%>
  	<%int ii =1/0; %>
  </body>
</html>

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <!--当前web应用的友好错误提示  -->
  <error-page>
  	<error-code>404</error-code>
  	<location>/error/404.jsp</location>
  </error-page>
  <error-page>
  	<error-code>500</error-code>
  	<location>/error/500.jsp</location>
  </error-page>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML">
<html>
  <head>
  </head>
  <body>
   服务器爆炸了,维修中~~~~~
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" isErrorPage="true"%>
<!DOCTYPE HTML">
<html>
  <head>
  </head>
  <body>
   <%=exception.getMessage() %>
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML">
<html>
  <head>
  </head>
  <body>
    你访问的资源去了火星~~~~~
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML">
<html>
  <head>
  </head>
  <body>
    代码出错,检查代码去
  </body>
</html>

在这里插入图片描述
在这里插入图片描述

7.九大隐式对象
page 代表servlet文件的隐式对象
request 代表HTTP请求隐式对象
response 代表HTTP响应的隐式对象
application 代表当前web应用的隐式对象
config 代表代表当前servlet配置信息的隐式对象
session 代表session会话的隐式对象
out 代表向页面输出的缓冲区的隐式对象
exception 代表上一个页面的错误信息的隐式对象
pagecontext 代表当前jsp页面的上下文的隐式对象
8.pagecontext
功能一:
获取其它八大隐式对象的入口
功能二:作为域对象使用
操作api:
setAttribute();
getAttribute();
removeAttribute();
getAttributeNames();
生命周期:
在访问jsp页面时,产生pageContext()对象,生命周期开始
在结束访问jsp页面时,pagecontext()对象销毁,生命周期结束
作用范围:
整个jsp页面
主要功能:
在整个jsp页面里共享数据
功能三:操作其它域中的属性
pageContext.setAttribute(String name, object obj, int scope)
//scope
pageContext.APPLICATION_SCOPE;
pageContext.SESSION_SCOPE;
pageContext.REQUEST_SCOPE;
pageContext.PAGE_SCOPE;
功能四:
自动搜索域
使用自动搜索域,会由小到大的搜索四个域中指定名称的域属性,一旦在较小的范围内找到结果,则不会再向更大范围的域去进行搜索。
功能五:便捷的请求转发:

案例:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML">
<html>
  <head>
  </head>
  
  <body>
   <h3>jsp隐式对象---pagecontext</h3>
   <h3>功能一:获取其它八大隐式对象的入口</h3>
   <%
   pageContext.getPage();
   pageContext.getRequest();
   pageContext.getResponse();
    %>
    <%
    pageContext.setAttribute("name", "lili");
     %>
     <%=pageContext.getAttribute("name") %>
     <h4>获取设置其它域中的值</h4>
     <%
     pageContext.setAttribute("country", "china", pageContext.APPLICATION_SCOPE);
     //pageContext.setAttribute("country", "us", pageContext.SESSION_SCOPE);
     //pageContext.setAttribute("country", "uk", pageContext.REQUEST_SCOPE);
     //pageContext.setAttribute("country", "canada", pageContext.PAGE_SCOPE);
      %>
      <%=pageContext.getAttribute("country",pageContext.APPLICATION_SCOPE) %>
      <%=pageContext.getAttribute("country",pageContext.SESSION_SCOPE) %>
      <%=pageContext.getAttribute("country",pageContext.REQUEST_SCOPE) %>
      <%=pageContext.getAttribute("country",pageContext.PAGE_SCOPE) %>
      <%=pageContext.findAttribute("country") %>
      <h3>便捷的请求转发</h3>
      <%pageContext.forward("/index.jsp"); %>
  </body>
</html>

1.作用域概述
作用域:一个可以共享数据的范围可以称之为作用域
2.四大作用域:
有大到小排序:
servletcontext----application
代表当前web的应用
生命周期:
当web应用被加载,servletcontext对象创建
当web应用被销毁,servletcontext对象销毁
作用范围:
整个web应用
主要功能:
在整个web应用内共享数据
session—session
代表当前会话的对象
生命周期:
request。getsession()方法调用的时候,session对象产生,
意外身亡:服务器意外关闭,session对象立刻销毁,如果服务器正常关闭,数据会以文件的形式保存在磁盘上,这个过程称之为钝化,服务器再次启动的时候,会重新读取整个文件,这个过程称之为活化。
自杀:调用session.invalidate()方法可以主动释放session对象
超市死亡:如果一个session超过30分钟没有被使用,则会由服务器将其销毁,这个销毁的时间可以通过web.xml中的session-config标签来设置。默认为30分钟。
作用范围:
整个会话范围
主要功能:
在整个会话范围内共享数据
c.request
代表HTTP请求对象
生命周期:
请求链起始时,request对象创建
请求链结束时,request对象销毁
作用范围:
在这个请求链中共享数据
d.pagecontext
生命周期:在访问jsp页面时创建,在结束jsp页面访问时销毁
作用范围:
整个jsp页面
主要功能:
在整个jsp页面内共享数据

标签技术:
1.标签技术概述
在jsp页面中由html语句和Java语句相互嵌套,如果Java的逻辑代码和html代码都十分复杂,两者右都参杂在一起,页面的可读性和可维护性都将降低,为了解决整这个问题,产生了标签技术,用它来替换页面中的Java语句,这样页面中就只会出现html代码,整体的可读性和可维护性都会提升。
2、常用的jsp标签技术
jsp标签
sun公司提供的技术,目前很少用
el表达式:
便捷易用—使用非常广泛,但只是表达式无法实现复杂的功能
jstl标签库:
提供了大量强大的标签支持,是目前应用最广泛的标签库
自定义标签:开发人员使用
其它第三方标签:以后了解

EL表达式
1.el表达式概述:
在jsp页面内的<%=jsp脚本表达式%>都可以使用el表达式来代替
EL Expression Language 表达式语言
在Javaee5及其以上版本中,都已默认包含了el表达式的相关开发包,无需手动导入。
2.使用方法:
${}
可以获取常量、变量、数组、链表、映射、javabean等中的数据
3.el特点
EL表达式不能设置值,只能获取值
EL表达式只能获取域中的属性
EL表达式不能遍历
4.获取常量
5.获取变量
a.获取指定域中的属性
el表达式中的四大作用域:

el表达式jsp脚本表达式
pageScopePAGE_SCOPE
requestScopeREQUSET_SCOPE
sessionScopeSESSION_SCOPE
applicationScopeAPPLICATION_SCOPE

b.自动搜索域
c.获取数组中的数据
d.获取链表中的数据
e.获取映射中的数据
f.获取javabean中的数据
在一个类中,如果存在私有化属性,这些属性包含get或者set中的任意一个方法,则这些私有化的属性就可以称之为javabean属性,类中存在这些属性,这个类就是javabean的类

package cn.tedu.domain;
//javabean
public class Person{
	private String name;
	private int age;
	private String gender;
	public Person(){}
	public Person(String name, int age, String gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	
}

在jsp脚本表达式中使用p.getXxx()方法获取的数据,在el表达式中都可以使用${p.xxx}的方法来获取
如果JavaBean中的getxxx()方法发生修改,则el表达式也要随之修改
例如:
getName() ${p.name}
getNamex() ${p.namex}
6.获取执行运算的结果
a。算数运算
b.关系运算
c.逻辑运算
d.empty运算
empty运算用于判断当前域中的属性是否为空
Empt运算规则:如果对象为null字符串为空,集合数组没有任何元素,empty操作都会返回true,否则为false
e.三元表达式运算
7.el表达式的内置对象(11个)
a.el表达式中的域对象—4个
pageScope
requestScope
sessionScope
applicationScope
b.代表请求头的内置对象

header获取一个返回值为Map<String,String>的内置对象
headerValues获取一个返回值为Map<String,String[]>的内置对象

request.getHeader(“host”)
${header.host}
c.代表请求参数的内置对象

param获取一个返回值为Map<String,String>的内置对象
paramValue获取一个返回值为Map<String,String[]>的内置对象

request.getParameter(“username”)
${param.username}
d.获取初始化请求参数的内置对象(基本不用)

initParam获取一个返回值为Map<String,String>的内置对象

initParam.url
c.获取浏览器中cookie信息的内置对象

cookie获取一个返回值为Map<String,String>的内置对象

cookie.JSESSIONID.name
cookie.JSESSIONID.value
f.获取pageContext内置对象
<%request.getContextPath()%>
${pageContext.request.contextPath}
8.el表达式调用Java方法:

案例:

<%@page import="cn.tedu.domain.Person"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
  <head>
  </head>
  <body>
    <h3>el表达式获取常量</h3>
    <%=123 %>
    <%=123.123 %>
    <%="abc" %>
    <%=true %>
    ${123}
    ${123.123}
    ${"abc"}
    ${true}
    <h3>el表达式获取变量</h3>
    <%=request.getContextPath() %>
    ${pageContext.request.contextPath}
    <h3>el表达式获取域中的变量</h3>
    <%
    pageContext.setAttribute("name", "1", pageContext.APPLICATION_SCOPE);
    pageContext.setAttribute("name", "2", pageContext.SESSION_SCOPE);
    pageContext.setAttribute("name", "3", pageContext.REQUEST_SCOPE);
    pageContext.setAttribute("name", "4", pageContext.PAGE_SCOPE);
     %>
    <%=pageContext.getAttribute("name") %>
    <%=request.getAttribute("name") %>
    <%=session.getAttribute("name") %>
    <%=application.getAttribute("name") %>
    
    ${pageScope.name }
    ${sessionScope.name }
    ${requestScope.name }
    ${applicationScope.name }
    <h3>自动搜索域</h3>
    <%=pageContext.findAttribute("name") %>
    ${name}
    <h3>获取数组中的数据</h3>
    <%
    String[] names={"aa","bb","cc"};
    pageContext.setAttribute("names", names);
     %>
     ${names[0]}
     ${names}
     <h3>获取链表中的数据</h3>
     <%
     List<String> list=new LinkedList<String>();
     list.add("11");
     list.add("22");
     list.add("33");
     list.add("44");
     pageContext.setAttribute("list", list);
      %>
      ${list}
      ${list[0] }
      <h3>获取映射中的数据</h3>
      <%
      Map<String,String> map=new HashMap<String,String>();
      map.put("aa", "11");
      map.put("bb.cc", "22");
      map.put("cc", "33");
      request.setAttribute("map", map);
      request.setAttribute("w", "aa");
       %>
       ${map }
       ${map.aa }
      <%--  ${map.bb.cc } --%>
      ${map["bb.cc"] }
      ${map[w] }
      
      <h3>获取javabean中的数据</h3>
      <%
      Person p=new Person("曹阳",20,"男");
      pageContext.setAttribute("p", p);
       %>
       ${p.name }
  </body>
</html>

<%@page import="cn.tedu.domain.Person"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
  <head>
  </head>
  <body>
    <h3>el表达式执行运算</h3>
    <h4>算数运算</h4>
    ${3+2 }
    ${3-2 }
    ${3/2 }
    ${3*2 }
    ${3%2 }
    ${3+"2" }
    ${3-"2" }
  	<%-- ${3+"a" } --%><!-- 运算报错 -->
  	<h4>关系运算</h4>
  	${3>2 }
  	${3<2 }
  	${3==2 }
  	${3!=2 }
  	${3>=2 }
  	${3<=2 }
  	<h4>逻辑关系</h4>
  	${true&&false }
  	${true||false }
  	${true and false }
  	${true or false }
  	${!true}
  	${not true}
  <%-- 	${true|false } 运行出错不认识--%>
  <h4>empty运算</h4>
  <%
  String str=null;
  pageContext.setAttribute("str", str);
  String str2="";
  pageContext.setAttribute("str2", str2);
  String[] str3={};
  pageContext.setAttribute("str3", str3);
  List<String> list=new LinkedList<String>();
  pageContext.setAttribute("list", list);
  Map<String,String>  map=new HashMap<String,String>();
  pageContext.setAttribute("map", map);
  List l=new ArrayList();
  l.add("jkl");
  pageContext.setAttribute("l", l);
   %>
  ${empty str }
  ${empty str2 }
  ${empty str3 }
  ${empty list }
  ${empty map }
  ${empty l }
  <h4>三元表达式</h4>
  <%
  Map<String,String>  mapx=new HashMap<String,String>();
  mapx.put("name", "ccc");
  pageContext.setAttribute("mapx", map);
   %>
   ${empty mapx.name?"曹阳":mapx.name }
   <h4>el表达式的内置对象</h4>
   ${header.host }
   ${param.username }
   ${cookie.JSESSIONID.name }
   ${cookie.JSESSIONID.value }
  </body>
</html>

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页

打赏作者

yygyj

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值