JSP学习

JSP

  • 概念:Java Server Pages —— Java服务端页面

  • 一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容;

    主要用于代替Servlet程序回传html页面的数据,因为Servlet程序回传html页面非常繁琐,开发维护成本都较高。

    JSP本质上就是一个Servlet程序,JSP在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),再编译,最终对外提供服务的其实就是字节码文件

  • JSP = HTML + Java

JSP有很多缺点:

书写麻烦:特别是复杂的页面;
阅读麻烦;
复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE;
占内存和磁盘:JSP会自动生成java和 .class文件占磁盘,运行的是 .class文件占内存;
调试困难:出错后,需要找到自动生成的,java文件进行调试;
不利于团队协作:前端人员不会java,后端人员不精HTML;

后续逐渐被ajax+html替代


步骤:

导入JSP坐标——创建jsp文件——编写html标签和java代码

<!-- jsp坐标 -->
<dependencies>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>		<!-- tomcat有,注意要写成provided -->
    </dependency>
</dependencies>

语法

page指令:

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>

属性:

  • language —— 表示 jsp 翻译后是什么语言文件。只支持 java。
  • contentType —— 表示 jsp 返回的数据类型是什么。也是源码中 response.setContentType()参数值
  • pageEncoding —— 表示当前 jsp 页面文件本身的字符集。
  • import —— 跟 java 源代码中一样。用于导包,导类。
  • 给out输出流使用的两个属性(不建议改):
    • autoFlush —— 设置当 out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是 true。
    • buffer —— 设置 out 缓冲区的大小。默认是 8kb。
  • errorPage —— 设置当 jsp 页面运行时出错,自动跳转去的错误页面路径。路径一般以斜杠开头,表示请求地址为 “http 😕/ip:port/工程路径/ ” 映射到代码的Web目录
  • isErrorPage —— 设置当前 jsp 页面是否是错误信息页面。默认是 false。如果是 true 可以 获取异常信息。
  • session —— 设置访问当前 jsp 页面,是否会创建 HttpSession 对象。默认是 true。
  • extends —— 设置 jsp 翻译出来的 java类继承谁

脚本:

JSP脚本:用于在JSP页面内定义Java代码

分为:

  • 代码脚本 <% … %>

    用于编写需要的功能。内容会直接放到 jspService()方法之中。

    <%--2.代码脚本----for 循环语句--%>
    <table border="1" cellspacing="0">
        <%
        	for (int j = 0; j < 10; j++) {
        %>
            <tr>
                <td>第 <%=j + 1%>行</td>
            </tr>
        <%
        	}
        %>
    </table>
    
  • 表达脚本 <%= … %>

    用于在jsp页面上输出数据。内容会放到out.print()中,作为out.print0的参数

    注:表达脚本中的表达式不能以分号结束。

  • 声明脚本 <%! … %>

    可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块,内部类等。

    内容会放到 _jspService()方法之外,被类直接包含。

    注:声明脚本很少使用

    <%!
    	private Integer id;
    	private String name;
    	private static Map<String,Object> map;
    %>
    <%!
        static {
            map = new HashMap<String,Object>();
            map.put("key1", "value1");
            map.put("key2", "value2");
            map.put("key3", "value3");
    }
    %>
    

输出

response.getWriter输出 和 out输出 都用于设置返回给客户端的内容。由于jsp翻译后,底层源码都是用out来输出的,所以一般统一用out来进行输出。

注释:

html注释: < !-- – >

java注释:<% // 单行 java 注释 /* 多行 java 注释 */ %>

jsp注释: <%-- --%>

其中html注释和java注释会被翻译到java源代码中,jsp注释不会。


对象

jsp的内置对象:是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九大对象,叫内置对象。

request —— 请求对象
response —— 响应对象
pageContext —— jsp的上下文对象
session —— 会话对象
application —— ServletContext.对象
config —— ServletConfig对象
out —— jsp输出流对象
page —— 指向当前jsp的对象
exception —— 异常对象


jsp四大域对象:

pageContext —— request —— session —— application

域对象可以像Map一样存取数据,其范围和Servlet的四个作用域相同。


常用标签

静态包含(常用)

<%@ include file="" %>

<!-- 例如  --> 
<%@ include file="/include/footer.jsp"%>

file属性指定要包含的jsp页面的路径,地址的第一个斜杠为 “ http 😕/ip:port/工程路径/ ” 映射到web目录。

注:静态包含不会翻译被包含的jsp页面,而是直接把页面拷贝到包含的位置执行输出。

动态包含(少用)

<jsp:include page=""> </jsp:include>

<!-- 例如  --> 
<jsp:include page="/include/footer.jsp">
    <jsp:param name="username" value="bbj"/>
    <jsp:param name="password" value="root"/>
</jsp:include>

page属性是指定要包含的 jsp页面的路径。

注:动态包含会 直接翻译被包含的jsp页面,同时还可以传递参数。

转发标签(常用)

<jsp:forward page=""> </jsp:forward>

page属性设置请求转发的路径

相当于:request.getRequestDispatcher(“/xxxx.jsp”).forward(request,reponse);

EL表达式

Expression Language ,即表达式语言,用于简化 JSP页面内的java代码。

主要功能:获取数据;

语法:

${表达式}

JavaWeb中的四大域对象:

  • page:当前页面有效;
  • request:当前请求有效;
  • session:当前会话有效;
  • application:当前应用有效;

——EL表达式获取数据,会依次从4个域中寻找,直到找到为止。(四个域的范围逐渐增大,即page范围最小,application最大)

  • empty运算

    判断一个数据是否为空,如果为空则输出true。

    值为null,空串时,Object类型数组长度为0时,list集合中元素个数为0,map集合元素个数为0,这些情况均视为空。

    <% 
    	request.setAttribute("obj", null); 
    %>
    ${empty obj}
    
  • 关系运算: == != < > <= >=

  • 逻辑运算:&& || !

  • 算数运算: + - * / %

  • 三元运算

  • 点运算 中括号运算:

    点运算 输出Bean对象中某个属性的值;

    中括号运算 输出有序集合中某个元素的值;

    <body>
        <%
            Map<String,Object> map = new HashMap<String, Object>();
            map.put("a.a.a", "aaaValue");
            map.put("b+b+b", "bbbValue");
            map.put("c-c-c", "cccValue");
            request.setAttribute("map", map);
        %>
        ${ map['a.a.a'] } <br>
        ${ map["b+b+b"] } <br>
        ${ map['c-c-c'] } <br>
    </body>
    

11个隐含对象:

变量类型作用
pageContextPageContextImpl获取jsp九大内置对象
pageScopeMap<String,Object>获取pageContext域中的数据
requestScopeMap<String,Object>获取Request域的数据
sessionScopeMap<String,Object>获取Session域的数据
applicationScopeMap<String,Object>获取ServletContext域的数据
paramMap<String,String>获取请求参数的值
paramValuesMap<String,String[]>获取多个请求参数的值
headerMap<String,String>获取请求头的信息
headerValuesMap<String,String[]>获取多个请求头的信息
cookieMap<String,Cookie>获取当前请求的Cookie信息

获取4个特定域的属性:

pageScopepageContext域
requestScopeRequest域
sessionScopeSession域
applicationScopeServletContext域
<body>
    <%
        application.setAttribute("key2", "application");
    %>
	${ applicationScope.key2 }
</body>

pageContext的使用

<body>
    <!--
    request.getScheme() 它可以获取请求的协议
    request.getServerName() 获取请求的服务器 ip 或域名
    request.getServerPort() 获取请求的服务器端口号
    getContextPath() 获取当前工程路径
    request.getMethod() 获取请求的方式(GET 或 POST)
    request.getRemoteHost() 获取客户端的 ip 地址
    session.getId() 获取会话的唯一标识
    -->
	<%
        pageContext.setAttribute("req", request);
    %>
    <%= request.getScheme() %> <br>
    1.协议: ${ req.scheme }<br>
    2.服务器 ip:${ pageContext.request.serverName }<br>
    3.服务器端口:${ pageContext.request.serverPort }<br>
    4.获取工程路径:${ pageContext.request.contextPath }<br>
    5.获取请求方法:${ pageContext.request.method }<br>
    6.获取客户端 ip 地址:${ pageContext.request.remoteHost }<br>
    7.获取会话的 id 编号:${ pageContext.session.id }<br
</body>

JSTL标签

JSTL标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码。

步骤:

1.导入坐标:

<dependency>
	<groupId>jstl</groupId>
	<artifactId>jstl</artifactId>
	<version>1.2</version>
</dependency>
<dependency>
	<groupId>taglibs</groupId>
	<artifactId>standard</artifactId>
	<version>1.1.2</version>
</dependency>

2.在JSP页面上引入JSTL标签库:

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

JSTL有五个功能不同的标签库:

功能范围URI前缀
核心标签库(常用)http 😕/java.sun.com /jsp/jstl/corec
格式化http 😕/java.sun.com/jsp/jstl/fmtfmt
函数http 😕/java.sun.com/jsp/jstl/functionsfn
数据库(不适用)http 😕/java.sun.com/jsp/jstl/sqlsql
XML(不适用)http 😕/java.sun.com/jsp/jstl/xmlx

标签:

if

<c:if test="true或false">
    ....
</c:if>

<c:if test="${status==0}">
    hello world!
</c:if>

forEach

<!-- items是被遍历的容器 var是遍历生产的临时变量 -->
<c:forEach items="${brands}" var="brand" varStatus="xx">
    <tr align="center">
        <td>$(xx.index)</td>  <!-- varStatus表示下标序号,xx.index表示从0开始,xx.count表示从1开始 -->
        <td>$(brand.brandName)</td>
        <td>S(brand.companyName)</td>
        <td>$(brand.description)</td>
    </tr>
</c:forEach>

<!-- 相当于.. -->
for(Brand brand : brands){
	Integer id = brand.getld();
	String imgUrl = brand.getlmgUrl();
	String brandName = brand.getBrandName();
	String companyName = brand.getCompanyName();
}

<!-- begin是开始数,end是结束数,step是步长 -->
<c:forEach begin="0" end="10" step="1" var='i'>
    ${i}
</c:forEach>

<!-- 相当于.. -->
for(int i = 0; i <= 10; i++){
	System.out.println(i);    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值