JSP详解

JSP

一、jsp的概念
  • jsp(Java Server Pages)是一种动态网页开发技术
  • jsp本质上是java的servlet,所以运行需要servlet容器
二、jsp的运行(以tomcat为例)
1、jsp怎么产生的?

在tomcat中lib目录下的jasper.jar负责解释jsp文件->.java文件->.class文件(继承了HttpJspBase(HttpServlet的子类))

2、编译后的文件放在哪

解释和编译好的文件(java和class)会放在tomcat的work\Catalina\localhost\项目名\org\apache\jsp目录下

三、jsp的生命周期
  1. 编译阶段:解释和编译jsp文件(所以第一次访问jsp文件会慢一点)
  2. 初始化阶段:调用编译后类的jspInit()方法
  3. 执行阶段:调用_jspService(request,response)方法
  4. 销毁阶段:调用destroy()方法
四、Jsp代码的格式

原本的HTML/CSS/JS代码的格式不变,引入了一些java脚本代码

1、jsp脚本元素
  • <%=%>jsp表达式:里面可以写java代码,会被解释为out.print(jsp表达式的内容)
  • <%%>jsp脚本:里面写任何java代码,只要jasper能够认识,(tomcat8.5不能识别lambda表达式),会被解释在类的_jspService方法内
  • <%!%>jsp声明:里面写java中的声明,比如定义成员变量和方法,会被解释在类中

在jsp脚本中可以嵌入任何java代码,只要jasper能够认识,(tomcat8.5不能识别lambda表达式)

2、jsp指令<%@指令名字 属性="值" .. %>
  • page指令:

    • language属性,目前只能是java
    • import属性,引入相关的包
    • pageEncoding属性,设置页面编码
    • contentType属性,设置页面传输过程的编码方式
    • session属性,是否支持session对象的使用,默认是支持的
    • isThreadSafe属性,设置jsp页面是否是线程安全的
    • errorPage属性,设置页面生错误时跳转的页面
    • isErrorPage属性,设置这个jsp是一个显示错误信息的页面,只要这个属性被设置为true,就可以使用jsp的隐藏内置对象exception
  • include指令:

    • <%@include file="" %>:静态包含另一个页面

      静态包含:把被包含的页面中的内容原封不动的拿到页面中

  • taglib指令

    • 在当前jsp页面中引入一些特殊的标签库.比如jstl标签库、struts2标签库、spring标签库等等.
3、jsp动作
  1. <jsp:useBean>获取一个javaBean对象

    <jsp:useBean id="s" class="com.koutain.bean.Student" scope="page"></jsp:useBean>

    相当于

       <%
        Student s = null;
        s = (Student)pageContext.getAttribute("s");
        if(s==null){
            s = new Student();
            pageContext.setAttribute("s",s);
        }
    
       %>
    
  2. <jsp:setProperty>为javaBean对象中的属性赋值

    <jsp:setProperty property="name" value="tom" name="s"/>

    相当于

    	<%
    		Student s = (Student)pageContext.getAttribute("s");
    		s.setName("tom");
    	%>
    
  3. <jsp:getProperty>获取JavaBean对象中的属性值

    <jsp:getProperty property="name" name="s"/>

    相当于

       <%
        Student s = (Student)pageContext.getAttribute("s");
        out.write(s.getName());
       %>
    
  4. <jsp:forward>jsp页面跳转

    //跳转的同时还可以传参数
    <jsp:forward page="target.jsp?name=tom"></jsp:forward>
    或者
    <jsp:forward page="target.jsp">
    //这个动作元素专门是传参数使用的
    <jsp:param value="tom" name="name"/>
    </jsp:forward>
    
  5. <jsp:include动态包含

    <jsp:include page="foot.jsp">
        <jsp:param value="lisi" name="name"/>
    </jsp:include>
    
    • 动态包含和静态包含的区别?
      1. 动态包含是将要包含的页面翻译为一个方法的调用,访问这个页面的时候才会调用;静态包含是一开始就将目标页面翻译在同一类中
      2. 动态包含可以给目标页面传参数;静态包含不可以
  6. <jsp:element>向浏览器输出一个标签

    <jsp:element name="font">
        <jsp:attribute name="color">blue</jsp:attribute>
        <jsp:body>hello world</jsp:body>
    </jsp:element>
    

    相当于<font color="blue">hello world</font>

五、jsp中的注释
1、//或/**/注释
  • 因为jsp中可以嵌入jsp脚本所以在jsp脚本中可以使用java的注释
2、<!---->
  • 因为jsp页面最终是要输出文HTML代码,所以在非jsp脚本中可以使用HTML的注释
3、<%----%>
  • 在jsp页面中还可以使用一种jsp独有的注释,使用位置和HTML注释一样
4、<!----><%----%>的区别
  • <!---->会在最终输出的HTML源代码中显示,<%----%>不会,<%----%>只会在jsp页面的源码中显示
六、jsp中的九大内置对象

<%=%> jsp表达式

<%!%> jsp声明 在声明中无法使用jsp的9种内置对象

EL表达式

一、el表达式的使用
1、格式
${}
2、相关规则
  • {}中可以是任意数据类型,会自动调用toString方法
  • {}中还可以是算术表达式
  • 判断是否为空${empty "tom"}
  • 使用三目运算符
${empty stu.age?"stu.age":"null"}
3、一些使用的情况

注意:当el表达式获取不到值时,什么都不做

二、el表达式"."后面跟的不是是attribute而是property
  • attribute是javabeen的属性
  • property是指JavaBean的Get方法
三、取值的优先级
<%
	//pageContext.setAttribute("age", 10,PageContext.PAGE_SCOPE);
	pageContext.setAttribute("age", 20,PageContext.REQUEST_SCOPE);
	pageContext.setAttribute("age", 30,PageContext.SESSION_SCOPE);
	pageContext.setAttribute("age", 40,PageContext.APPLICATION_SCOPE);
%>
${age }	

属性名相同,在多个域对象中,取值的顺序是:page->request->session->appliction

四、el表达式中"."和[]的区别

在属性名或参数中有特殊符号时(例如"."),可以使用"[]"

JSTL标签库

使用jstl要额外引入jstl标签库的jar包(jstl.jar和standard.jar)

一、JSTL的使用

在jsp页面使用tablib指令添加:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

其中prefix后面跟的是使用jstl标签的前缀;uri后面是要引用的jstl标签库

二、JSTL标签库的常用标签
1、<c:forEach>标签:遍历数组和集合
<%
	List<Student> list = new ArrayList<Student>();

	list.add(new Student("001", "zs1", 13));
	list.add(new Student("002", "zs2", 14));
	list.add(new Student("003", "zs3", 18));
	list.add(new Student("004", "zs4", 11));
	
	session.setAttribute("list", list);
	
	HashMap<Long,Student> map = new HashMap<Long,Student>();
	
	map.put(20L, new Student("002", "zs2", 14) );
	map.put(30L, new Student("003", "zs3", 18) );
%>

<c:forEach items="${list }" var="stu" begin="0" end="3" step="1" varStatus="status">
	${status.index }-${stu.id}-${stu.name }-${stu.age}<br>	
</c:forEach>

<c:forEach items="${map }" var="entry">
	${entry.key }-${entry.value.id }-${entry.value.name }-${entry.value.age }<br>
</c:forEach>
2<c:out>标签:输出(相当于<%=%>)
<c:out value="hello"></c:out>
<c:out value="${score}"></c:out>
3、<c:if>标签:判断
<%-- 判断(eq判断字符串是否相等)--%>	
<c:if test="${name eq 'tom'}">
    tom is exist
</c:if>
4、<c:choose>标签:相当于if/else if
<c:choose>
    <c:when test="${score >=90 }">优</c:when>
    <c:when test="${score >=80 }">良</c:when>
    <c:when test="${score >=70 }">中</c:when>
    <c:when test="${score >=60 }">及格</c:when>
    <c:otherwise>差</c:otherwise>
</c:choose>
5、<c:set>和<c:remove>标签:添加和删除元素
<%-- 添加元素 --%>
	<c:set var="name" value="tom" scope="request"></c:set>
	<c:out value="${name}"></c:out>
	
	<%-- 删除元素 --%>
	<c:remove var="name" scope="request"/> 
	<c:out value="${name}"></c:out>
6、<c:catch>标签:在jsp页面处理产生错误的异常状况,并且将错误信息储存起来。
<c:catch var ="catchException">
   <% int x = 1/0;%>
</c:catch>
<c:if test = "${catchException != null}">
   <p>异常为 : ${catchException} <br />
   发生了异常: ${catchException.message}</p>
</c:if>
7、<c:import>标签:相当于jsp动作的动态包含

<c:import url=""></c:import>

8、<c:redirect>标签: 重定向到某个页面

<c:redirect url=""></c:redirect>

三、自定义标签
1、先导
  • jsp2.0之前,自定义标签需要实现Tag接口,具体实现起来比较复杂

  • jsp2.0之后,要简单的定义一个自己的标签,可以继承SimpleTagSupport类

2、具体步骤
  1. 编写一个类继承SimpleTagSupport类,重写doTag()方法

    public class HelloTag extends SimpleTagSupport {
    	//添加的属性
    	private int count;
    
    	public int getCount() {
    		return count;
    	}
    
    	public void setCount(int count) {
    		this.count = count;
    	}
    
    	@Override
    	public void doTag() throws JspException, IOException {
    
    		StringWriter sw = new StringWriter();
    
    		super.getJspBody().invoke(sw);
    
    		String tagBody = sw.toString();
    
    		//按照count属性遍历
    		for (int i = 0; i < count; i++) {
    			// 输出添加的标签体
    			super.getJspContext().getOut().print("hello:" + tagBody+"<br>");
    		}
    
    	}
    }
    
  2. 创建.tld文件

    在WEB-INF下创建一个后缀为.tld的文件(文件名随意),里面的内容可以参照tomcat安装目录下webapps/examples\WEB-INF\jsp\example-taglib.tld

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE taglib
            PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
            "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
    
    <taglib>
    
      <tlib-version>1.0</tlib-version>
      <jsp-version>1.2</jsp-version>
      <short-name>simple</short-name>
      <uri>koutian-hello</uri>
      <tag>
        <name>hello</name>
        <tag-class>com.koutian.jstl.HelloTag</tag-class>
        <body-content>scriptless</body-content>
       	<attribute>
            <!-- 属性名 -->
       		<name>count</name>
            <!-- 属性是否必须 -->
       		<required>true</required>
            <!-- 属性值是否可以使用el表达式 -->
       		<rtexprvalue>true</rtexprvalue>
       	</attribute>
      </tag>
    </taglib>
    
  3. 在jsp页面测试

    <%@ page pageEncoding="UTF-8"%>
    <%@ taglib prefix="m" uri="koutian-hello" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>test myTag</title>
    </head>
    <body>
    	<%
    		request.setAttribute("name", "tom");
    		request.setAttribute("count", "10");
    	%>
    <m:hello count="${count }">${name }</m:hello>
    </body>
    </html>
    
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值