深入JSP技术和JSTL标签库

JSP简介

什么是Java Server Pages?

JSP全称Java Server Pages,是一种动态网页开发技术,使用JSP标签在HTML网页中插入Java代码,标签通常以<%开头以%>结束

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分,通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页

JSP标签有多种功能,访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息

为什么使用JSP?

JSP程序有如下优势:

性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素
服务器调用的是已经编译好的JSP文件
JSP 基于Java Servlet API
JSP页面可以与处理业务逻辑的 Servlet 一起使用
如图以下表示:

JSP 处理

使用JSP来创建网页的:

发送一个 HTTP 请求给服务器。
Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。通过使用 URL或者 .jsp 文件来完成
JSP 引擎从磁盘中载入 JSP 文件,转化为 Servlet,并且将所有的 JSP 元素转化成 Java 代码
JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎
Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器
Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到浏览器
Web 浏览器处理 HTTP response 中动态产生的HTML网页

 

jsp的运行原理及执行过程


1、运行原理

         当第一次访问jsp页面时,会向一个servlet容器(tomcat等)发出请求,servlet容器先要把 jsp页面转化为servlet代码(.java),再编译成.class 文件 再进行调用。当再次访问jsp页面时  跳过翻译和编译的过程 直接调用

2、执行过程

          1、 客户端发出请求

          2、web容器将jsp转化为servlet代码(.java)

          3、web容器将转化为servlet代码编译(.class)

          4、web容器加载编译后的代码并执行

          5、将执行结果响应给客户端


JSP中的注释使用

<%--  --%>进行包围,例:

<%-- JSP的注释 --%>
JSP的声明语句
在JSP页面中,可以声明合法的变量和方法,语句格式为:  <%!   %>.

在声明变量和方法是,要注意以下几点:

声明必须以“;”结尾
一个声明只能在一个页面中有效
可以在一个 <%!   %>中声明多个变量和方法
使用 <%!   %>声明的变量具有全局性的特点
<%!
    int i=0;
    int j=1;
    int sum(int a, int b){
        return a+b;
    }
    String getName(String name){
        return name;
    } 
%>
 

什么是JSP指令
JSP指令的格式:<%@指令名 attr1=”” attr2=”” %>,一般都会把JSP指令放到JSP文件的最上方,但这不是必须的。

JSP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令了。

指令在“真身”中不存在,生成“真身”时需要使用指令!

Tomcat编译系统会根据JSP的指令信息来编译JSP,生成Java文件。

在生成的Java文件中,不存在指令信息!
 

JSP隐式对象

歌剧落幕 2018-04-01 22:21:17   264   收藏 1
文章标签: 重定向 转发 JSP隐式对象 编码格式
版权
JSP隐式对象分为四个类别:

1:输入输出相关的:request , response , out

2:与作用范围相关的:pageContext , request , session ,application

3:与servlet相关的:page , config

4:异常相关的:exception

表单元素和请求参数的关系:

1:每个有name属性的表单元素对应一个请求参数

2:如果有多个表单元素有相同的name属性,则多个表单元素生成一个请求参数,只有该参数有多个值。

3:表单元素的name属性指定请求参数名,value指定请求参数值。

4:如果某个表单元素设置了disbled=”true”属性,则该表单元素不在生成请求参数。

设置编码格式:request.setCharacterEncoding(“utf-8”);

重定向:response.sendRedirect(“路径”);

转发:request.getRequestDispatcher(“路径”).forword(request,response);

转发和重定向的区别:

转发过程:客户浏览器发送http请求,web服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。

重定向过程:客户浏览器发送http请求,web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

1:request.getRequestDispatcher(“路径”).forword(request,response);方法只能将请求转发同一个Web应用的组件;response.sendRedirect(“路径”); 方法还可以重定向到同一个站点的其他应用程序中的资源,甚至使用绝对URL重定向到其他站点的资源。

2:调用response.sendRedirect(“路径”);方法重定向的访问过程结束后浏览器地址栏会发生变化显示URL由初始的路径变成重定向后的路径。request.getRequestDispatcher(“路径”).forword(request,response);转发过程结束后,路劲不变。

3:转发在服务器端完成的;重定向是在客户端完成的

4:转发的速度快;重定向速度慢

5:转发的是同一次请求;重定向是两次不同请求

6:转发不会执行转发后的代码;重定向会执行重定向之后的代码

7:转发地址栏没有变化;重定向地址栏有变化

8:转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

9:重定向,其实是两次request:第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

JSP标签


返回按钮 
 <input type="button" id="backBtn" name="button" class="button_return" value="返回"
          οnclick="location.href='javascript:history.go(-1);'" />
-1  代表的是退后几步 


镶嵌页面      
<jsp:include page="../mode/tempid.jsp" />  


下拉框     
 select id="name"name="name" style="width: 100px">
        <option value="matchprize">比赛奖励</option>
        <option value="matchnumber">比赛人数</option>
    </select>


添加按钮 
 <input type="submit" value="上一页" id="btnsubmit"  />


文本 
 <tr>
        <td><label>钻石:</label></td>
        <td><input name="gold" value="10" /></td>
    </tr>


判断为空的方法
在form表单中的最后面添加调用 
 <form action="gmtAction.action?command=35"  method="post" οnsubmit="return ck();">
    </form>


上一页,下一页 
 <input type="submit" value="上一页" id="btnsubmit"  οnclick="upperButton()"/>
    <input type="submit" value="下一页" id="btnsubmit"  οnclick="nextButton()"/>
    function nextButton(){
        var page =parseInt(document.getElementById("page").value);
        document.getElementById("page").value=eval(page+1);
    }
    function upperButton(){
        var page =parseInt(document.getElementById("page").value);
        document.getElementById("page").value=eval(page-1);
    }


如果要添加 
<c:forEach var="list" items="${player}" varStatus="i">
    </c:forEach>
就要引用 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
player  是   request.setAttribute("player", player);   这里写的参数名字 (第一个参数) 

jsp页面镶嵌java代码 
如果要在jsp页面添加java代码就要添加  <% %>,在这里面添加代码,如果通过java 代码获取传来的数据就需要 
List<GMTPlayerInfo> amneOnlineList = (List<GMTPlayerInfo>)request.getAttribute("player"); 
这个player 和上面的是一样的意思,不过GMTPlayerInfo这个实体类需要引用才能正常运行 
<%@page import="com.gmt.entity.GMTPlayerInfo"%> 


隐藏标签    
在标签中添加 style="display: none"  这几个属性 
 <input name="gid" value="1" style="display: none" />
readonly="readonly"  只读

在跳转页面之后自动跳转   
 <script language="JavaScript">
        setTimeout("submitForm.submit();",0);
    </script>

EL表达式获取
<%@ page import="net.wen.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: wen
  Date: 2018/8/21
  Time: 23:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    //request域中,存了一个小明
    request.setAttribute("name","小明");

    //session域中存了一个小红
    User user = new User();
    user.setName("小红");
    user.setSex("女");
    session.setAttribute("user",user);

    //application域中存了一个list集合
    List <User> list = new ArrayList<>();
    User user1 = new User();
    user1.setName("小绿");
    user1.setSex("女");
    User user2 = new User();
    user2.setName("小黑");
    user2.setSex("男");
    list.add(user1);
    list.add(user2);
    application.setAttribute("list",list);
%>
<%--通过脚本获取request中name的值--%>
<%=request.getAttribute("name")%>
<%--通过脚本获取session中user中User对象的值--%>
<%
    User user3 = (User) session.getAttribute("user");
    String name = user3.getName();
    String sex = user3.getSex();
    out.write(name+","+sex);
%>
<%--通过脚本获取application中list的list对象中的值--%>
<%
    List<User> list1 = (List<User>) application.getAttribute("list");
    User user4 = list1.get(0);
    out.write(user4.getName()+","+user4.getSex());
%>
<%--通过el表达式获取request、session、application中的多对应的值--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}
<%--更简便的写法--%>
${name}
${user.name}
${list[0].name}
</body>
</html>

 

 EL内置对象
在EL表达式中,无需创建就可以使用的对象称之为EL隐藏(隐含、内置)对象。在EL中一共有11个隐藏对象,它们都与Map相似。其中10是Map,一个是 PageContext

参数隐藏对象

    

l  param:param是Map<String,String>类型!param对象可以用来获取参数,与request.getParameter()方法相同。

request.getParameter(“username”);如果那么为空那么这个结果是null

而:param.username 如果为空那么返回是空串“”

JSTL简介及安装

JSTL简介
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个开放源代码的标签组件,由Apache的Jakarta小组开发,可以直接从http://tomcat.apache.org/taglibs/下载 

安装JSTL 1.2 
下载来的JSTL.是以jar包的形式存在的,直接将此Jar包保存在WEB-INF/lib目录之中,之后可以直接通过WINRAR工具打开此JAR包,并且将里面的META-INF文件夹中的几个主要标签配置文件:c.tld、fmt.tld、fn.tld、sql.tld、x.tld保存在WEB-INF文件夹之中 

JSTL标签的c:if的使用

<c:if> 标签必须要有test属性,**当test中的表达式结果为true时,则会执行本体内容;如果为false,则不会执行。**例 如:${student.username = = ‘admin’},如果student.username等于admin时,结果为true;若它的内容不等于admin时,则为false。
有个JSP页面,如何实现根据班级状态的不同在页面能显示对应的操作。比如“正常”,则有“发书”功能;“未审核”和“审核未通过”则有“修改”、“提交审核”、“删除”等功能。

JSTL核心标签库中c:forEach 的 varStatus属性

 

JSTL核心标签库中c:forEach 的 varStatus属性

varStatus属性  类型:String   描述:循环的状态信息,可以取值index\count\first\last\current   不可以使用EL表达式

 

我们常使用<c:forEach>标签来遍历需要的数据,为了方便使用,varStatus属性可以方便我们实现一些与行数相关的功能,如:奇数行、偶数行差异;最后一行特殊处理等等。varStatus属性常用参数如下:

current:当前这次迭代的(集合中的)项 
index:当前这次迭代从 0 开始的迭代计数 
count:当前这次迭代从 1 开始的迭代计数 
first:用来表明当前这轮迭代是否为第一次迭代的标志,返回true/false 
last:用来表明当前这轮迭代是否为最后一次迭代的标志, 返回true/false

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值